play

Trader with golden catch-up play using options

A gold move, with Mike Khouw. With CNBC's Melissa Lee and the Options Action Traders, Carter Worth and Tony Zhang.




play

From Fortnite to Fifa: 100 great video games to play in lockdown

From being a goose on the loose to controlling whole galaxies, here’s a world of experiences for all the family

The cinemas may be shut, the gig venues closed, but there is one place you can still meet your friends and be entertained without leaving your house: the world of gaming. For many of us, it has been years since we could really justify spending all day in our pyjamas slaying virtual dragons – now that way of life, for some at least, is a little less frowned-upon. But if you’re returning to serious gaming after a few years away, where exactly should you be spending your valuable money and time? Here are no less than 100 highly recommended titles, from family favourites to epic sci-fi sagas – all available on current platforms, be it PC, smartphones or consoles. Whether you want to be moved, terrified, relaxed or intellectually challenged, alone or with pals, we’ve got more than enough here to keep you occupied until you’re out and about again …

Continue reading...




play

Trading Nation: Financials and energy lead the S&P, here's how to play the move

Craig Johnson of Piper Sandler and Quint Tatro of Joule Financial discuss the financial sector with Seema Mody.




play

Which two footballers have played the most matches together? | The Knowledge

Plus: the policing of goalkeepers, home shirts that became away tops and strike partners sharing birthdays

“Which two footballers have played the most matches together? I reckon Jason Dodd and Francis Benali for Southampton must be up there,” asks Mark Williams.

They’re not even close, Mark, but we’ll get back to that shortly. First, Geoff Airey has two long-standing midfielders at Manchester United who knock Benali and Dodd (170 appearances together) into a cocked hat.

Continue reading...




play

Football quiz: the players who missed out

Not everyone can win everything. Do you know which achievements these players have missed out on in their careers?

Who has scored the most Premier League goals without ever winning the trophy?

Jermain Defoe

Robbie Fowler

Jimmy Floyd Hasselbaink

Harry Kane

And who has made the most appearances without winning the Premier League?

David James

Gary Speed

Emile Heskey

Steven Gerrard

Who is the only England player to win 50 caps yet never appear at a World Cup or European Championship finals?

Glen Johnson

Colin Bell

Emlyn Hughes

Gary Cahill

Who scored 434 league goals, an English record, yet never played for his country?

Brian Clough

Arthur Rowley

Steve Bull

Kerry Dixon

Who is the last Ballon d’Or winner never to win the Champions League?

Fabio Cannavaro

Pavel Nedved

Thierry Henry

Michael Owen

Gary Lineker never won the top division in England, but for how many clubs did he finish as top scorer in the league?

None

One

Two

Three

Who has scored the most Champions League goals without winning the competition?

Ruud van Nistelrooy

Edinson Cavani

Robert Lewandowski

Zlatan Ibrahimovic

Who was Serie A’s leading scorer three times in the 1990s yet never won the title?

Oliver Bierhoff

Gabriel Batistuta

Enrico Chiesa

Giuseppe Signori

Which of these players has never won the Premier League Golden Boot?

Wayne Rooney

Luis Suárez

Alan Shearer

Andy Cole

Which of these greats never won the Ballon d’Or?

Pavel Nedved

Xavi

Hristo Stoichkov

Eusébio

How many goals have Cristiano Ronaldo and Lionel Messi scored between them in the knockout stages of the World Cup?

None

Two

Five

14

3 and above.

You missed out too.

4 and above.

You missed out too.

5 and above.

A fine score

6 and above.

A fine score

7 and above.

A superb score

8 and above.

A superb score

9 and above.

A superb score

10 and above.

A superb score

11 and above.

You missed nothing

2 and above.

You missed out too.

0 and above.

You missed out too

1 and above.

You missed out too.

Continue reading...




play

Player wages and contracts will bankrupt EFL clubs: it's time for the PFA to act | Mark Palios

A radical solution is needed and the PFA has the money and the power to step in and help clubs that have no income for the foreseeable future

Last month I said the EFL was entering the most critical period in its history as it struggled to respond to the abrupt cessation of football. What we have seen since has elegantly illustrated the game’s inability to act decisively to protect professional football’s future. This is not a criticism of the individuals involved in negotiations, who are trying their best, but reflects structural flaws that prevent cohesive action. Put simply, it is clear the EFL and Professional Footballers’ Association cannot bring the key counter-parties to the table.

The first phase was characterised by the fight for cash given the disappearance of gate-related income. Although there was relatively swift agreement that a player wage deferral would help, it has been left to clubs and players to agree arrangements. Some players have deferred, some have not, and and the scale varies from club to club. The outcome was, in my view, too little and too late for many clubs.

Continue reading...




play

Haiti FA president accused of sexually abusing young female players

  • Claims of abuse by Yves Jean-Bart at national centre
  • Jean-Bart denies all allegations made against him

The president of the Haitian football federation has been accused of sexually abusing young female footballers at the country’s national training centre.

Yves Jean-Bart, known as “Dadou”, the president of the Fédération Haïtienne De Football (FHF) since 2000, denies accusations that he coerced several players at the Centre Technique National in Croix-des-Bouquets into having sex. The alleged incidents are understood to have taken place within the last five years.

Continue reading...




play

Eibar players say they fear 'terrible consequences' of La Liga resumption

  • Team issues joint statement before planned return to training
  • La Liga: ‘Playing football safer than going to supermarket’

Eibar have become the first La Liga side to publicly express concerns about the planned return to training, and have called for “responsibility” from league officials.

Clubs in Spain’s top two division are due to start individual training this week after testing for Covid-19 with matches behind closed doors planned for June. But in a strongly worded joint statement, the Basque club have raised doubts about the plan.

Continue reading...




play

Players to air concerns to Premier League executives over restart

  • Video call to follow league shareholders meeting on Monday
  • Coronavirus testing plan still to be approved by clubs

Top-flight players are to hold talks with Premier League executives next week, before any attempt to restart the football season can be signed off.

Players are to be given the chance to air any concerns over Project Restart in a video-conference call likely to include representatives of all 20 clubs.

Continue reading...




play

Ole Gunnar Solskjær says Manchester United will not force players to return

  • Some of them may not be mentally ready because of Covid-19
  • ‘You wouldn’t hold anything against them,’ manager says

Ole Gunnar Solskjær says he would not force any Manchester United footballer to play if they did not feel “mentally ready” due to concerns about coronavirus.

The Premier League hopes to get the go-ahead for a mid-June return and Solskjær has all his squad back in the country for a potential resumption of training. Yet the manager is conscious some may have reservations about doing so.

Continue reading...






play

Tonight We’ll Try Role-Playing a Heist

Tonight on TypeCastRPG we’ll be attempting something new. We’re going to work some game mechanics from the LEVERAGE role-playing game into our D&D 5e session to role-play a heist.

Our Goal: to free a comatose giant (one of the gods of Vaeron) from the clutches of the people who are about to purchase him at auction, and then mine his body for magical materials.

Our Resources: A couple of allies, a paltry assortment of level-appropriate magical gear, and an artifact that lets us speak to the gods…

Our Team: five 7th-level characters.
In Leverage-speak, they are:

  • HITTER (the Paladin)
  • HACKER (the Necromancer)
  • GRIFTER (the Cleric/Bard)
  • THIEF (the Rogue)
    and of course…
  • MASTERMIND (the Druid, wearing a tiara that gives her an INT score of 19)

(If we can live up to this image, it will be epic)

Join us tonight at 9pm Mountain!
Hopefully I’ll have enough brain-cycles to role-play some proper grifting AND to crank out some fun session art.




play

April 28, 2020: Play The Fantasy Trip Digitally!

During our FnordCon 2 virtual panels, fans of The Fantasy Trip were given a tutorial of a fan project, approved by Steve himself, that really blew us away. Jim Eisert has created a Melee mod for Tabletop Simulator on Steam that is functional and looks great. Not only that, he has made a full multi-part tutorial-video series explaining how to use the platform. This is not only a good demonstration of how to use his mod on Tabletop Simulator, it's also a detailed demo of how to play the game itself. He teaches everything – character creation, movement, hand-to-hand combat, shooting, magic – and provides full battle examples. You can find the entire playlist on Jim's YouTube channel, but he has individual videos for: 



Jim is very active in the TFT community, so we expect support to be robust for this already excellent mod. Whether you're just starting out or a veteran TFT player looking to get a game going during the quarantine, check out Jim's videos and give this a shot! (And remember, Melee is now a FREE download on W23 and DTRPG.)

Hunter Shelburne

Warehouse 23 News: You Versus The Universe

They don't want you to peek behind the curtain of reality . . . and for your sanity's sake, they may have a point. GURPS Horror: The Madness Dossier is a campaign that pits the heroes against unimaginable forces that would bend reality back toward Earth's true origins – so the fate of humanity hangs in the balance. The battle begins with a download from Warehouse 23!




play

May 4, 2020: Illuminati Solo Rules Playtest

The Illuminati is, by design, a large interwoven web of power and influence, hidden in the shadows. Unfortunately during a pandemic, even they need to keep their web at arm's length, so what's a shadow leader to do? How about playing solo? Events Coordinator Alex Yeager has developed a beta set of solo rules to be played with Illuminati. You can check out the background and development notes in our recent Medium article

Play it, and give us some feedback! We are interested in improving it, and since this is a brand new way to play a game that's been around for decades, there's a lot to test. So check those rules out, give 'em a play, and see if you can fight the forces working behind the scenes against your own!

– Hunter

Warehouse 23 News: Get Dressed For Battle!

When the gear hits your eye with kits ready to buy, that's armory! Unlock the full power of GURPS Low-Tech and GURPS Low-Tech: Instant Armor by grabbing the historical garb you really want, quickly and easily. GURPS Loadouts: Low-Tech Armor has you covered, with 40 different ready-to-use armor loadouts from across history, including new pieces and optional rules. It's a download away from Warehouse 23!




play

Huawei Brings MatePad T8 With Large Display And Improved Battery

Huawei Matepad T8 has been launched in Romania along with the Huawei Y5P and the Huawei Y6P phones. The tablet is available in a single Deepsea Blue color and traditional themed design. The tablet has a thick bezel around




play

D&D's The Tomb of Horror, except every player is operating a bulldozer

The goons of BYOB take on an all-time classic dungeon with a slightly adjusted equipment list. What's the CR adjustment on a bulldozer anyway? So the boss should have *scribbles* 2d6+6 slimes now, hmm... with +1 hardhats, yeah! *scribbles*.










play

Junk Book Marketing: Pay-to-Play Magazines


Posted by Victoria Strauss for Writer Beware®

Scroll down for updates

On this blog and elsewhere, I spend a lot of time warning about junk book marketing services: so-called marketing and promotional services that are cheap to provide, but can be sold at a big markup, and for the most part are of little worth for book promotion or can more effectively be done by the author him/herself. Some examples: press releases, email blasts, book trailers, book fair display, social media setup, and social media advertising.

All these and more are hawked to writers at exorbitant prices by assisted self-publishing companies like the various Author Solutions imprints--and also, increasingly, by their scam imitators. Either way, they're a ripoff...but the scammers demand even bigger fees, tell even bigger lies, and deliver even more shoddy results. And that's when they're not just taking your money and running.

A few weeks ago, I focused on pay-to-play radio interviews--another junk marketing service--and why they're not worth the huge fees charged by providers. This week, I'm going to talk about pay-to-play magazines. (You'll note that all the companies discussed below are on my Big List of Publishing and Marketing Scams.)

Have you ever received a solicitation like this one?
Or this one?
Or this one?
Of course the books haven't undergone "extensive evaluation", or been "carefully chosen", or showed to "a team" that "really like[s] your vision". Such solicitations are just spam, blasted out to addresses scraped from the internet or stolen from self-publishing company customer lists.

Nor are these real magazines, in the sense of publications that are widely available to the public. Instead, they're collections of ads, interviews, and "feature articles" sold to writers at huge prices, sometimes interspersed with general interest pieces (often really badly written) or, in the case of New Reader Magazine, with fiction, poetry, and art. These "publications" are never circulated in any meaningful sense; they may be posted online, but their primary mode of distribution is from tables in company booths at book fairs...where many of the authors buying ad or interview space have already paid a premium for display.


The prices the faux magazines charge for placement can be enormous. For instance, here's the  "Executive Full-Spread Ad" from Paperclips Magazine, which is owned by (not "partnered with" as claimed in its solicitation email) publishing and marketing scammer Legaia Books:


A "Showcase" full-page ad costs $3,698 ($2,218.80 on sale), and a "Premier" half-page ad clocks in at $2,599 ($1,299.50 on sale). Paperclips' parent company, Legaia Books, also sells publishing and marketing services at high prices, using deceptive sales tactics to target small press- and self-published authors.

Here's one writer's not very satisfactory experience with Paperclips. I've gotten emails from many others.

New Reader Magazine--which looks quite legit if you don't know better--is owned by New Reader Media. Though the magazine actually appears to provide small payments for content acquired via general submission, it charges anywhere from $5,000 and up for the magazine feature and "partnership" mentioned in its solicitation email. Like Legaia, New Reader Media also sells publishing and marketing services at gigantic prices, as well as book-to-screen services (always a scam).

New Reader has accumulated some online complaints due to its aggressive solicitation and poor performance. It has also been caught making false claims, such as that it was responsible for Christopher Paolini's bestselling novel Eragon being made into a movie.

The Christmas magazine that's the subject of EC Publishing's solicitation can be seen here (if you're brave, you can also check out the Las Vegas Edition, produced for the Las Vegas Book Festival). Like most of the pay-to-play magazines, it's a compilation of author-purchased ads and features, laughably badly-written general interest articles, and a smattering of actual advertising. Prices for inclusion range from a few hundred to several thousand dollars, depending on how much space is purchased.

Thanks to its aggressive soliciting, EC Publishing is the subject of a warning from the Australian Society of Authors.

Authors Press's Authorial magazine has its own website (note the "notice of non-affiliation and disclaimer" that pops up if you linger on the home page: the scammers read Writer Beware). Writers can buy a spot in the magazine, starting at fees of a few hundred dollars; ad space or "features" are also included in some of the more expensive promotional packages Authors Press offers.

Authorial's BEA 2019 issue consists of more than 75 pages of author ads, interviews, and excerpts. Just imagine the thousands of dollars in revenue generated by all those pages, some of which include ten or more ads. Also have a peek at Authorial's gallery page, which features photos of  the dozens of books displayed in Authors Press's BEA booth. In 2019, writers were being charged anywhere from $1,000 to $3,500 for presence in the booth, depending on what level of activity they chose. Now multiply all of this by the seven book fairs Authors Press attended in 2019. It's not chump change.

From URLink Print and Media comes Harbinger Post. Like the others, it's nearly all paid content, interspersed here and there with staff-written features. Here's an example of the caliber of that writing:


Other scammy publishing and marketing companies that sell space in proprietary magazines (I've received multiple complaints about all these companies):

Global Summit House: Global Summit House
Litfire Publishing: WayFairer
AuthorCentrix: AuthorCentrix Magazine
Stonewall Press (defunct): GoldCrest Magazine

Print advertising is expensive, and how useful it is for book marketing is an open question. But if it is to be effective at all, it must offer the possibility of being seen by a large audience of potentially interested readers and buyers.

That means circulation, subscriptions, and quality content beyond mere advertising--not ad-stuffed, error-ridden, proprietary publications whose only exposure to the public is a "free, take one" stack on a side table in a book fair booth. Even if the ad slots weren't insanely expensive--and even if writers didn't have to pay for what real magazines never charge for, such as interviews--buying space in these fake publications would be a waste of money.

Writer beware.

UPDATE 1/29/20: It's not just scammers that run this kind of racket. Via its PW Select - BookLife feature (which I discuss here and  here), industry magazine Publishers Weekly has begun to sell a "very special" service:


These prices rival the scammers'. And the promise of print exposure is not quite what it seems. Per PW's Q&A explainer, the interviews appear not in the body of the magazine, but in "PW’s BookLife supplement, which is published the last week of each month bound into that week’s issue of Publishers Weekly". In other words, easy for readers to ignore or skip over.

PW actually has the wide circulation and industry audience the scammers only pretend to. But given the huge fees and the segregation of the interviews in a separate supplement--not to mention the open question of how useful any kind of print advertising is for book marketing--there's more than a whiff of the same kind of exploitation here.




play

Should You Pay To Display Your Book At BookExpo? (Short Answer: No)


Posted by Victoria Strauss for Writer Beware®

BookExpo (formerly known as BookExpo America, but still referred to as BEA) is the US's leading publishing industry event. Attended by publishers, agents, booksellers, retailers, librarians, and people and companies from all aspects of the book trade, it's an opportunity for industry professionals to network, do business, and learn about new trends, titles, and opportunities in the book world.

Although BEA doesn't happen until May 27 this year, it's not too soon for industry professionals to begin planning for attendance. It's also not too soon for authors to start receiving solicitations--by phone and by email--to buy expensive services and packages that supposedly will give their books visibility at the fair.

Here's what author and editor Jane Friedman has to say about paying to display at BEA. (Jane's website is an amazingly comprehensive and useful resource on all aspects of writing and publishing; you should definitely bookmark it.)
Aside from the Author Market [a designated area of the exhibit floor where self-published authors can buy display space], there are a handful of opportunities for authors to get visibility for their work at BEA. As far as I’m concerned—as someone who attended this show for 10 years, mainly as an editor with a traditional publishing house—it is not worth the investment. Here’s why.

The emphasis of the show is on traditional publishing, rights sales and pre-publication marketing, and does not favor indie title promotion. It is a New York industry event where traditional publishing insiders talk to other traditional publishing insiders. Yes, there are librarians and booksellers, but they’re rarely paying attention to the places where an indie book may be showcased or promoted.

Nobody is going to notice your book there. Your book is likely to be promoted with many other books, with no way of attracting attention even if someone did pause for a second within 50 feet of your book. Imagine setting a copy of your book down in the world’s largest book fair, and expecting someone to not only notice it, but be entranced by it so much they can ignore 10,000 other things happening at the same time.

If you—the author—are not present to advocate for it, your book doesn’t stand a chance. Services that offer to promote your book at BEA are rarely, if ever, hand-selling or promoting your book in a meaningful way. But they will be happy to cash your check and say that your book had a “presence” at BEA. If you want to satisfy your ego, go ahead. But it’s not going to lead to meaningful sales. (I challenge anyone in the comments to provide evidence that a self-published book gained traction at BEA because the author paid a fee to secure placement—and the author was not present.)
I'll add a fourth consideration: You will likely be hugely overcharged, especially by companies that sell book fair packages, or re-sell the exhibit services of others.

SOLICITATIONS YOU MAY ENCOUNTER


1. You may already have received an email from the Combined Book Exhibit's New Title Showcase. The CBE, an area of standing bookshelves outside the entrance to the BEA display floor, offers display packages for a few hundred dollars. For a few hundred more, you can buy an ad in its catalog; for many hundreds more, you can buy an autographing session.

Your book will be placed on a shelf with hundreds of others, in no particular order: there are no separate areas for genres, for instance. I've attended BEA many times, and the CBE is often completely deserted, with not a customer or a staff person in sight. I've never seen more than a handful of people browsing it at any one time. There is definitely no handselling involved.

A number of predatory marketing companies re-sell CBE services for enormous markups. The CBE is aware of this, and has posted a warning on its website (it's no coincidence that all the companies named in the warning appear on the scam list in the sidebar of this blog).

2. If you've chosen an assisted self-publishing company, you may be encouraged to buy presence in their BEA booth.

The Author Solutions imprints sell BEA as part of a package that includes several fairs and costs nearly $3,000. (What do you get for that? Basically, a spot on a shelf, higglety-pigglety in among an unknown number of other books by writers no one has heard of). Xulon Press sells BEA on its own, but with multiple options for spending big bucks, from shelf space only ($599) to a "Boutique High Top Table with 30 Books" ($1,999--do you get to take the table home?).

Outskirts Press re-sells CBE services--for over $150 more than you'd pay if you dealt with CBE directly.

3. Vanity publishers (yes, vanity publishers do attend and display at BEA and other fairs) may offer their authors the "opportunity" for BEA presence--at extra (possibly significantly extra) cost.

Here's my post about SterlingHouse, a vanity publisher that is now defunct but in its heyday charged its authors as much as $9,500 for BEA display of their books, signings, and other perks. (As Jane indicates above, being present to advocate for your book may make a difference--but $9,500 worth? Even if the author sold all 150 books included in the package, they wouldn't come close to making that money back.)

Here's one of the many BEA-related solicitations with which the late, unlamented PublishAmerica bombarded its authors:


4. Some unscrupulous literary agents sell slots in catalogs or portfolios that they claim to bring to BEA, supposedly to market to publishers.

Examples of this scheme that I've seen involve fees of anywhere from $150 to four figures (here's one that charges $300). If your agent is the kind of agent who exploits clients in this way, they are not the kind of agent who has contacts with publishers.

This sort of thing is far less common than it used to be, thank goodness (there are fewer literary agent scams in general, thanks to self-publishing and the many small presses that deal directly with authors), but it's still a ripoff. Don't do it.

5. The most aggressive solicitations--especially by phone--come from unscrupulous or scammy marketing companies.

Services run from the basic--a spot on a shelf in a not-always-very-professional-looking display area (you have to supply the book)--to basic with perks--mostly junk marketing, like press releases, a listing in the company's proprietary magazine, and a "post fair fulfillment report"--to elaborate packages that include an autographing session.

Prices I've seen range from $750 for shelf space only, to mid-four figures for signing packages. For instance, here's Stonewall Press's deluxe offering, which doesn't even include author presence. Note the effort to create faux urgency by pretending that space is limited.


Looking for a bargain? AuthorCentrix is a tad more economical--here are its 2019 BEA packages. The "standard" doesn't include a badge, which would add around $400 to the total.


BOOK FAIR RIPOFFS AREN'T LIMITED TO BEA

Multiple predatory marketing companies and PR services hawk book fair presence to authors. It's one of the most common marketing solicitations you'll receive. Why? Because it's insanely lucrative--for the predator.

The photo below is last year's BEA booth for publishing and marketing scammer URLink Print and Media.


More than 100 books can be counted in this photo. All the authors have paid to be there. URLink also sells ad space in a 50-page catalog, with most of the pages listing eight book per page. Writers have bought the banners shown in the photo, and others have paid to host signings. Still others have bought ads and features in URLink's fake magazine, Harbinger Postwhich sits in piles on a table on the off chance someone picks one up.

The minimum cost for any of these "services" is several hundred dollars, with more elaborate packages running into the mid-four figures (see the examples above). From one book fair, a company like URLink can gross well over $100,000--a considerable profit, even taking into account the cost of booth rental, travel, and badges. Now multiply that by multiple book fairs attended per year.

The Miami Book Fair, which along with BEA is one of the fairs most frequently targeted by marketing scammers, appears to be aware of the exploitation, and provides a warning.

THE TAKEAWAY

My feeling about book fairs is the same as Jane Friedman's: book fairs are not the best place for authors to self-promote. If you do decide to attend, do it with the aim of learning and having fun--not getting "discovered"--and don't pay someone else to take you or your books there. At best, you'll get little return on your money. At worst, you'll be ripped off.




play

She Got Played

Beeps continues to try




play

Покончил с собой Дмитрий Босов — владелец Artplay, денег на выкуп «Ведомостей» и просто миллиардер-сырьевик

Состояние предпринимателя составляло по Forbes $1,1 млрд — по итогам рейтинга 2020 года он занял 86-е место среди богатейших людей страны..




play

Animal Sanctuary Farm Invites Puppies For a Pawsome Playdate

The Gentle Barn is an animal sanctuary in California that is currently closed to human visitors due to the coronavirus pandemic.

In order to allow their lonely animals some companion and fun, the farm invited five adorable puppies from a nearby pet shelter for a day of playtime, just before they go to their forever homes. 

Too cute to handle. 




play

Touken Ranbu's 8th Stage Play Casts Former Takarazuka Actress as 1st Female Cast Member

Ryō Tsukamoto, Yuzuki Hoshimoto also join cast




play

Xenoblade Chronicles: Definitive Edition Switch Game's Trailer Previews Story, Gameplay, New Epilogue

Remake of Monolith Software's Wii game launches on May 29





play

Cosplay Contest Announced, Plus Dresden Coloring Pages!

The headline says it all! Let’s dive right in. Costume Contest We had such fun with our Fanart Contest that we want to honor another section of the Dresden fandom’s creatives: cosplayers and cosplay photographers! Read all the rules, then submit your Cosplay Contest entries to yearofdresden@gmail.com by May 12th. Coloring Pages Running low on [...]




play

Friday Polynews Roundup — Activists on the Tamron Hall show, two poly plays, poly-mono crises, my mission, and more





play

Worst song possible plays as Trump tours mask plant

As the president touts plans to reopen the economy, Live And Let Die blares over a loudspeaker.




play

A CLI podcast player built in Go

#308 — April 17, 2020

Unsubscribe  :  Read on the Web

Golang Weekly

Broccoli: Using Brotli Compression to Embed Static Files in Go — There’s been talk about making static file embedding a standard part of Go, but for now you might find this project interesting. It uses the Brotli compression system to embed a virtual file system of static files in your Go executables as tightly as possible.

Aletheia

How Thanos Would Program in Go — An introduction to the Thanos Go Style Guide built for Thanos, the distributed metrics system project, not the Marvel super-villain, BTW ????

Bartek Płotka

Introducing GoLand 2020.1 — A variety of upgrades for Go Modules support, code-editing features that require little to no interaction from the user, an expanded code completion family, and more! Try free for 30 days.

GoLand sponsor

Understanding Bytes in Go by Building a TCP Protocol — There is a lot more in this long-ish tutorial than just learning about bytes. This is great if, let’s say, you are stuck at home and need a challenge. (Note: If you’ve got deja-vu, we linked this in last week’s brief non-issue.)

Ilija Eftimov

Ebiten 1.11.0 Released: The Go 2D Gamedev Library — Ebiten is one of those genuine gems of a project. Maybe use it to take part in this weekend’s Ludum Dare game jam? More Go entries would be neat..

Ebiten

Generics in Go: How They Work and How to Play With Them — Generics are a lot closer than you might think. So much so that you can try them today in a browser or compile locally.

Chris Brown

???? Jobs

Senior Software Engineer (Go) – 100% Remote (UK/EU Only) — Form3 is building the most exciting banking technology on the planet and are looking for Talented Engineers to join the team.

Form3

Golang Developer at X-Team (Remote) — Join X-Team and work on projects for companies like Riot Games, FOX, Coinbase, and more. Work from anywhere.

X-Team

Find a Job Through Vettery — Vettery specializes in tech roles and is completely free for job seekers. Create a profile to get started.

Vettery

???? Articles & Tutorials

Statically Compiling Go Programs — If you thought all/most Go binaries were static, you might be surprised to find out that some core packages use cgo code and result in dynamically linked libraries.

Martin Tournoij

How To Create Testable Go Code — Structure your code and tests to be mockable, testable, and maintainable, even if it calls external services.

Dave Wales

The Go Security Checklist — Ensure the infrastructure and the code of your Go applications are secure with the latest actionable best practices.

Sqreen sponsor

Build Your Own Neural Network in Go — A beginner’s guide to building the simplest parts of a neural network completely from scratch.

Dasaradh S K

'How I Built a Cloud Gaming System with WebRTC and Go'

Thanh Nguyen

???? Code & Tools

podcast-cli: A Podcast Player with a Terminal-Based Interface

Goulin

Godocgen: A Go Documentation Generator — Godocgen can output to multiple formats/destinations, making it easy to host as a static site. More background here.

Holloway Chew Kean Ho

3mux: An i3-inspired Terminal Multiplexer — Imagine something like tmux but easier to learn and with sensible defaults. Plus, it’s written in Go so you can tweak it as much as you like :-)

Aaron Janse

Micro 2.5: A Go Micro Services Development Framework

Micro

Beta Launch: Code Performance Profiling - Find & Fix Bottlenecks

Blackfire sponsor

Goph: A Native Go SSH Client — Supports connections using passwords, private keys, keys with passphrases, doing file uploads and downloads, etc.

Mohamed El Bahja

GeoDB: A Persistent Geospatial Database with Geofencing and Google Maps Support — Built using Badger gRPC and the Google Maps API. Track the geolocation of objects across boundaries or in relation to other objects.

Coleman Word

oneinfra: A 'Kubernetes as a Service' Platform — Provide or consume Kubernetes clusters at scale, on any platform or service provider.

oneinfra

Gocorona: Track COVID-19 Statistics From Your Terminal — A short and sweet demonstration of what you can throw together quickly using termui, a customizable Go-powered terminal dashboard and widget library.

Ayooluwa Isaiah




play

Playing With React and D3

D3 is great at data visualizations, but it manipulates the DOM directly to display that data. Rendering DOM elements is where React shines. It uses a virtual representation of the DOM (virtual DOM) and a super performant diffing algorithm in order to determine the fastest way to update the DOM. We want to leverage React’s highly efficient, declarative, and reusable components with D3’s data utility functions.

At this point, we can safely say that React is the preferred JavaScript library for building user interfaces. It is used practically everywhere and is almost as pervasive as jQuery. It has an API that is simple, powerful, and easy to learn. Its performance metrics are really impressive thanks to the Virtual DOM and its clever diff algorithm between state changes. Nothing, however, is perfect, and React too has its limitations. One of React’s greatest strengths is the ease with which it integrate third-party libraries, but some libraries, especially opinionated ones, are more difficult to integrate than others.

An extremely popular library that can be tricky to integrate with React is D3.js. D3 is an excellent data visualization library with a rich and powerful API. It is the gold standard of data visualizations. However, Because this library is opinionated about data, it is no trivial endeavour to get it to work with React. A few simple strategies permit these two libraries to work together in very powerful ways.

Editor’s Note: Check out our upcoming workshop, React and D3, a crash course in learning how to create data visualizations with these two in demand libraries. Reserve your spot now on Eventbrite and get 20% off admission. Learn more at the Eventbrite page

What is React?

React is an open-source JavaScript library for creating user interfaces that addresses the challenges of building large applications with data that changes over time. Originally developed at Facebook, it is now seen in many of the most commonly used web applications including Instagram, Netflix, Airbnb, and HelloSign.

React helps developers build applications by helping manage the application state. It’s simple, declarative, and composable. React is not a traditional MVC framework because React is really only interested in building user interfaces. Some have called it the “V(iew)” in MVC, but that’s a little misleading. React’s viewpoint is different. As application logic has reoriented toward the client, developers have applied more structure to their front-end JavaScript. We applied a paradigm that we already understood from the server (MVC) to the browser. Of course, the browser environment is very different from the server. React acknowledges that client-side applications are really a collection of UI components that should react to events like user interaction.

React encourages the building applications out of self-contained, reusable components that only care about a small piece of the UI. Other frameworks such as Angular also attempt to do this, but React stands out because it enforces a unidirectional data flow from parent component to child component. This makes debugging much easier. Debugging is the hardest part of application development, so while React is more verbose that other libraries or frameworks, in the end it saves a lot of time. In a framework like Angular’s, it can be hard to figure out where a bug is coming from: The view? The model? The controller? The directive? The directive controller? Data in Angular flows in many different directions, and this makes it hard to reason about that state of your application. In React, when there is a bug (and there will be!), you can quickly determine where the bug originated from because data only moves in one direction. Locating a bug is as simple as connecting the numbered dots until you find the culprit.

What is D3?

D3 (Data-Driven Documents) is a JavaScript library for producing dynamic, interactive data-visualizations. It’s fairly low level, and the developer has a lot of control over the end result. It takes a bit of work to get D3 to do what you want, so if you’re looking for a more prepackaged solution, you’re probably better off with highcharts.js. That said, it is fairly simple to pick up once you get the hang of it.

D3 does four main things:

  1. LOADS: D3 has convenient methods for importing data from CSV documents.
  2. BINDS: D3 binds data elements to the DOM via JavaScript and SVG.
  3. TRANSFORMS: data can be adjusted to fit your visual requirements
  4. TRANSITIONS: D3 can respond to user input and animate elements based on that input

Why Would We Want To Use React with D3?

D3 is great at data visualizations, but it manipulates the DOM directly to display that data. Rendering DOM elements is where React shines. It uses a virtual representation of the DOM (virtual DOM) and a super performant diffing algorithm in order to determine the fastest way to update the DOM. We want to leverage React’s highly efficient, declarative, and reusable components with D3’s data utility functions. Also, once we create a chart component, we can want to be able to reuse that chart with different data anywhere in our app.

How to use React and D3?

D3, like React, is declarative.D3 uses data binding, whereas React uses a unidirectional data flow paradigm. Getting these two libraries to work together takes a bit of work, but the strategy is fairly simple: since SVG lives in the DOM, let React handle displaying SVG representations of the data and lett D3 handle all the math to render the data.

Of course, we’ll have to make compromises. React is unopinionated and flexible, thereby allowing you to accomplish whatever needs to be done. Some tasks, like creating axes, are tedious. We can let D3 directly access the DOM and create. It handles axes well, and since we only need to create very few, this tactic won’t affect performance.

Let’s go through a simple example. I created a repository you can use to follow along here: playing-with-react-and-d3. You can follow in the unfinished directory and if you get stuck you can take a look at the finished directory.

Let’s generate a random list of X-Y coordinates and display them on a ScatterPlot chart. If you’re following the tutorial, a finished example is provided for you under the “finished” directory, but you can also follow along under “unfinished.” I’ve gone through the trouble of doing all the setup for you. The build will automatically be created from “unfinished/src/index.jsx”

Let’s start by creating a simple “Hello World!” React component. Create a file under “components” named “chart.jsx”

// unfinished/src/components/chart.jsx
import React from 'react';

export default (props) => {
  return <h1>Hello, World!</h1>;
}

This example is simple, but let’s go over the explanation anyway. Since we’re rendering a simple H1 with no state, we can just export a function that returns the HTML we expect. If you’re familiar with Angular or Ember, it might look weird to insert HTML directly into our JS code. On the one hand, this goes against everything we’ve learned about unobtrusive JavaScript. But on the other hand, it actually makes sense: we’re not putting JavaScript in our HTML, we’re putting our HTML into our JavaScript. React sees HTML and client-side JavaScript as fundamentally bonded together. They’re both concerned about one thing – rendering UI components to the user. They simply cannot be separated without losing the ability to see what your component is going at a glance. The great benefits of this approach is that you can describe exactly what your component will look like when it’s rendered.

Also, keep in mind that this is only possible with JSX, which translates HTML elements into React functions that will render the HTML to the page.

Now, let’s move on and mount our component to the DOM. Open up “index.jsx”

// unfinished/src/index.jsx
import './main.css';
import React    from 'react';
import ReactDOM from 'react-dom';
import Chart    from './components/chart.jsx';

const mountingPoint = document.createElement('div');
mountingPoint.className = 'react-app';
document.body.appendChild(mountingPoint);
ReactDOM.render(<Chart/>, mountingPoint);

You probably noticed a few things. You might be wondering why we’re requiring a CSS file. We’re using Webpack, which allows us to require CSS files. This is very useful when we modularize both our stylesheets and our JavaScript. We’re also creating a div in which we want to mount our React app. This is just a good practice in case you want to do other things on the page then render a React component. Lastly, we’re calling render on ReactDOM with 2 arguments, the name of the component and the DOM element we want to mount it on.

Now, let’s install all the dependencies by navigating to the unfinished directory and running npm i. Then, fire up the server with npm run start and go to localhost:8080

Awesome! We have rendered our first React component! Let’s do something a little less trivial now.

Let’s compose some functions that will create an array of random data points and then render a scatter plot. While we’re at it, we’ll add a button to randomize the dataset and trigger a re-render of our app. Let’s open up our Chart component and add the following:

// unfinished/src/components/chart.jsx
import React       from 'react';
import ScatterPlot from './scatter-plot';

const styles = {
  width   : 500,
  height  : 300,
  padding : 30,
};

// The number of data points for the chart.
const numDataPoints = 50;

// A function that returns a random number from 0 to 1000
const randomNum     = () => Math.floor(Math.random() * 1000);

// A function that creates an array of 50 elements of (x, y) coordinates.
const randomDataSet = () => {
  return Array.apply(null, {length: numDataPoints}).map(() => [randomNum(), randomNum()]);
}

export default class Chart extends React.Component{
  constructor(props) {
    super(props);
    this.state = { data: randomDataSet() };
  }

  randomizeData() {
    this.setState({ data: randomDataSet() });
  }

  render() {
    return <div>
      <h1>Playing With React and D3</h1>
      <ScatterPlot {...this.state} {...styles} />
      <div className="controls">
        <button className="btn randomize" onClick={() => this.randomizeData()}>
          Randomize Data
        </button>
      </div>
    </div>
  }
}

Since we want our component to manage it’s own state, we need to add a bit more code than was necessary for our previous “Hello World” stateless functional component. Instead of just a function, we’re going to extend React.Component and describe our component in the render() method. render() is the heart of any React component. It describes what our component is supposed to looks like. React will call render() on initial mount and on every state change.

Inside of render(), we are both rendering a scatter plot component as if it were an HTML element and setting some properties or “props”. The ... syntax is a convenient JSX and ES2015 spread operator that spreads the attributes of an array or object instead of doing all of that explicitly. For more information check out: JSX Spread Attributes. We’re going to use render() to pass our data and a style object that will be used by some of our child components.

In addition, we’re also rendering a button with an onClick event handler. We’re going to wrap this.randomizeData() with an arrow function and bind the value of this to our Chart component. When the button is clicked, randomizeData() will call this.setState() and pass in some new data.

Let’s talk about this.setState(). If render() is the heart of a React component, setState() is the brains of a component. setState explicitly tells React that we’re changing the state, thereby triggering a re-render of the component and its children. This essentially turns UI components into state machines.

Inside of setState(), we’re passing an object with data set to the randomDataSet(). This means that if we want to retrieve the state of our application, we need only call this.state.whateverStateWereLookingFor. In this case, we can retrieve the randomData by calling this.state.data.

A little side note on how React works: React offers great performance for rendering UI components by implementing a diff algorithm and comparing a virtual DOM in memory with the actual DOM. When you think about it, the DOM is really a large tree structure. If there’s one thing we have learned from decades of computer science research, it’s how to compare and manipulate trees. React takes advantage of clever tree diffing algorithms, but in order to work, each component can only render one parent element (i.e., you cannot render sibling elements). That’s why In the render function we’re wrapping all our elements in one parent div.

Let’s get started with the scatter plot component. Create a file unfinished/src/components/scatter-plot.jsx :

// unfinished/src/components/scatter-plot.jsx
import React        from 'react';
import d3           from 'd3';
import DataCircles  from './data-circles';

// Returns the largest X coordinate from the data set
const xMax   = (data)  => d3.max(data, (d) => d[0]);

// Returns the highest Y coordinate from the data set
const yMax   = (data)  => d3.max(data, (d) => d[1]);

// Returns a function that "scales" X coordinates from the data to fit the chart
const xScale = (props) => {
  return d3.scale.linear()
    .domain([0, xMax(props.data)])
    .range([props.padding, props.width - props.padding * 2]);
};

// Returns a function that "scales" Y coordinates from the data to fit the chart
const yScale = (props) => {
  return d3.scale.linear()
    .domain([0, yMax(props.data)])
    .range([props.height - props.padding, props.padding]);
};

export default (props) => {
  const scales = { xScale: xScale(props), yScale: yScale(props) };
  return <svg width={props.width} height={props.height}>
    <DataCircles {...props} {...scales} />
  </svg>
}

There’s a lot going on here, so let’s start with the stateless functional component that we’re exporting. D3 uses SVG to render data visualizations. D3 has special methods for creating SVG elements and binding data to those elements – but we’re going to let React handle that. We’re creating an SVG element with the properties passed in by the Chart component and which can be accessed via this.props. Then we’re creating a DataCircles component (more on that below) which will render the points for the scatter plot.

Let’s talk about D3 scales. This is where D3 shines. Scales takes care of the messy math involved in converting your data into a format that can be displayed on a chart. If you have a data point value 189281, but your chart is only 200 pixels wide, then D3 scales converts that value to a number you can use.

d3.scale.linear() returns a linear scale. D3 also supports other types of scales (ordinal, logarithmic, square root, etc.), but we won’t be talking about those here. domain is short for an “input domain”, i.e., the range of possible input values. It takes an array of the smallest input value possible and the maximum input value. range on its own is the range of possible output values. So in domain, we’re setting the range of possible data values from our random data, and in range we’re telling D3 the range of our chart. d3.max is a D3 method for determining the maximum value of a dataset. It can take a function which D3 will use to give the max values of the X and Y coordinates.

We use the scales to render the data circles and our axes.

Let’s create the DataCircles component under unfinished/src/components/data-circles.jsx

// unfinished/src/components/data-circles.jsx
import React from 'react';

const renderCircles = (props) => {
  return (coords, index) => {
    const circleProps = {
      cx: props.xScale(coords[0]),
      cy: props.yScale(coords[1]),
      r: 2,
      key: index
    };
    return <circle {...circleProps} />;
  };
};

export default (props) => {
  return <g>{ props.data.map(renderCircles(props)) }</g>
}

In this component, we’re rendering a g element, the SVG equivalent to a div. Since we want to render a point for every set of X-Y coordinates, were must render multiple sibling elements which we wrap together in a g element for React to work. Inside of g, we’re mapping over the data and rendering a circle for each one using renderCircles. renderCircles creates an SVG circle element with a number of properties. Here’s where we’re setting the x and y coordinates (cx and cy respectively) with the D3 scales passed in from the scatter plot component. r is the radius of our circle, and key is something React requires us to do. Since we’re rendering identical sibling components, React’s diffing algorithm needs a way to keep track of them as it updates the DOM over and over. You can use any key you like, as long as it’s unique to the list. Here we’re just going to use the index of each element.

Now, when we look at our browser, we see this:

We can see our random data and randomize that data via user input. Awesome! But we’re missing a way to read this data. What we need are axes. Let’s create them now.

Let’s open up ScatterPlot.jsx and add an XYAxis component

// unfinished/src/components/scatter-plot.jsx

// ...

import XYAxis       from './x-y-axis';

// ...

export default (props) => {
  const scales = { xScale: xScale(props), yScale: yScale(props) };
  return <svg width={props.width} height={props.height}>
    <DataCircles {...props} {...scales} />
    <XYAxis {...props} {...scales} />
  </svg>
}

Now, let’s create the XYAxis component;

// unfinished/src/components/x-y-axis.jsx
import React  from 'react';
import Axis   from './axis';

export default (props) => {
  const xSettings = {
    translate: `translate(0, ${props.height - props.padding})`,
    scale: props.xScale,
    orient: 'bottom'
  };
  const ySettings = {
    translate: `translate(${props.padding}, 0)`,
    scale: props.yScale,
    orient: 'left'
  };
  return <g className="xy-axis">
    <Axis {...xSettings}/>
    <Axis {...ySettings}/>
  </g>
}

For simplicity’s sake, we’re creating two objects which will hold the props for each of our X-Y axes. Let’s create an axis component to explain what these props do. Go ahead and create axis.jsx

// unfinished/src/components/x-y-axis.jsx
import React from 'react';
import d3    from 'd3';

export default class Axis extends React.Component {
  componentDidMount() {
    this.renderAxis();
  }

  componentDidUpdate() {
    this.renderAxis();
  }

  renderAxis() {
    var node  = this.refs.axis;
    var axis = d3.svg.axis().orient(this.props.orient).ticks(5).scale(this.props.scale);
    d3.select(node).call(axis);
  }

  render() {
    return <g className="axis" ref="axis" transform={this.props.translate}></g>
  }
}

Our strategy up to this point has been to let React exclusively handle the DOM. This is a good general rule, but we should leave room for nuance. In this case, the math and work necessary in order to render an axis is quite complicated and D3 has abstracted that pretty nicely. We’re going to let D3 have access to the DOM in this case. And since we’re only going to render a ma




play

Players of Mali enter to the field

KOLKATA, INDIA - OCTOBER 28: Players of Mali enter to the field prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players from Mali enter the field

KOLKATA, INDIA - OCTOBER 28: Players from Mali enter the field prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

: A player from Mali prays before entering the field

KOLKATA, INDIA - OCTOBER 28: A player from Mali prays before entering the field prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players Mali warm up

KOLKATA, INDIA - OCTOBER 28: Players Mali warm up prior to the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




play

Players of Brazil warm up

KOLKATA, INDIA - OCTOBER 28: Players of Brazil warm up prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players Mali warm up

KOLKATA, INDIA - OCTOBER 28: Players Mali warm up prior to the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




play

Players of Brazil warm up

KOLKATA, INDIA - OCTOBER 28: Players of Brazil warm up prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players of Brazil line up for a picture during the FIFA U-17 World Cup India

KOLKATA, INDIA - OCTOBER 28: Players of Brazil line up for a picture during the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players of Brazil and Mali enter to the field

KOLKATA, INDIA - OCTOBER 28: Players of Brazil and Mali enter to the field prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players of Brazil and Mali enter to the field

KOLKATA, INDIA - OCTOBER 28: Players of Brazil and Mali enter to the field prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players of Brazil and Mali line up for the National Anthems

KOLKATA, INDIA - OCTOBER 28: Players of Brazil and Mali line up for the National Anthems ahead of the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players of Brazil and Mali enter to the field

KOLKATA, INDIA - OCTOBER 28: Players of Brazil and Mali enter to the field prior the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




play

Players of Mali line up for a picture

KOLKATA, INDIA - OCTOBER 28: Players of Mali line up for a picture during the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)