Shared posts

07 Feb 19:10

7 Essential Inexpensive Ergonomic Office Tools That Prevent Wrist & Hand Injury

by Christina Wood
home office interior

Photo by Oladimeji Ajegbile on Pexels.com

My essential list of inexpensive ergonomic office tools that will prevent wrist and neck injuries

I spend most of my work day at a keyboard. I have RSI. I have tried every kind of ergonomic solution, from standing desks to crazy keyboards to unconventional solutions like working from an armchair.

I have found, though, that the best cure is prevention. And that means building a well-designed, ergonomic workspace and good habits.

I get up frequently, walk when I’m talking on the phone, go for walks, and move from my desk to a big leather armchair — and my phone or a notebook — whenever possible.

Working, even for an hour, on a laptop with a glide pad or any poor ergonomic setup will destroy my hands for days. So I have an ergonomic office chair, an adjustable keyboard, an adjustable monitor, and more.

Here are my favorite affordable ergonomic office tools for creating a home office that protects you from hurting yourself.

An Adjustable Monitor Mount

I have two big monitors. This allows me to see without squinting and to work on several things at once. More important than the actual monitor size, though, is that it is at the perfect height. To make that happen easily, I mount both of mine to an adjustable arm so I can alter the angle and height as I change my sitting position.

Setting the monitor at exactly the right height for each task means I don’t hurt my neck looking up or down. It also means I can push it out of the way to use my desk. This VIVO single monitor mount is perfect for this and affordable. I love mine. There are sizes available for larger monitors, too. It moves easily, installs easily – and it’s $40!

The Best Inexpensive Ergonomic Office Chair


The most important of the inexpensive ergonomic office tools on your list should be a chair. It is an absolute essential. I have bought The Alera Elusion chair twice. (I moved. Sold one. Bought another.) It is an excellent, completely adjustable office chair at an affordable price. I have worked in the fancy and often-hailed-as-the-best Herman Miller Aeron chair that costs nearly $2000. This inexpensive one works just as well for me.

It comes in a low-back version, too. That’s a lot of coin to save on a single purchase! Granted, the Alera requires assembly. But consider what you are getting paid per hour to do it!

An Inexpensive Ergonomic Keyboard To Prevent Pronation


Pronation. That’s the problem with keyboards. They make you hold your hands horizontally while you type. This is awkward for the tiny nerves that go down your arm, through the carpal tunnel. They don’t like to make that twist while those muscles are hard at work. A keyboard that allows for even a slight inward horizontal turn of your wrist makes those nerves happier. I’ve used a lot of keyboards that do this.

My favorite keyboard is the Microsoft Sculpt keyboard. Microsoft has outsourced it to Incase, which makes beautiful bags and cases. You can get an entire desktop kit, in this line, from their site for a very reasonable $179. That includes the keyboard, an excellent ergonomic mouse, and a numeric keyboard. They are all wireless and connect to your computer via a USB receiver.

An Adjustable, Ergonomic Keyboard Tray

best affordable ergonomic office equipment

The keyboard placement is very important to an ergonomic setup. It needs to be at exactly the right height for your body. And a desk is very rarely that height. So, an adjustable keyboard is a necessary piece of equipment for anyone who types. It took me a long time to find one I liked that didn’t cost an arm and a leg and that didn’t require me to hire someone to install it.

This Kensington ($71) is it. It has room for both the mouse and the numeric keypad, pushes under the desk so I can get it out of the way, adjusts, and doesn’t require an engineer to attach it to the underside of the desk.

A footrest

Elevating your feet can correct a lot of ills in an office rig. That urge to put your feet up on the desk or rest them on a trash can is your body asking for help. Give your feet somewhere soft to rest, such as this inexpensive, soft, and perfectly sized foot rest ($14) for under your desk.

An Ergonomic Office Mouse

A good, vertical mouse will prevent a lot of hand, wrist, and thumb pain. And the investment is small. This ProtoArc Ergonomic Vertical mouse puts your hand in a handshake position as you work. It is easy to reast your hand on, doesn’t pronate your hand, and puts a plethora of controls literally at your fingertips. I highly recommend it, especially for the ~$20 investment.

The Wrist Brace I Wear When I’m Not Typing

best affordable ergonomic office equipment wrist brace

I work all day, every day, typing at a keyboard. And despite all my efforts not to do damage, that’s hard on my RSI. When I’m overworked, I wear this wrist brace ($18) while I sleep (and sometimes when I do yoga.)

It is like a safe place for my hands, providing instant comfort. And my wrists feel rested and well again in the morning. (Wearing a brace while typing is, in my experience, very bad. I never do that.)

When you purchase anything through links on this site, GeekGirlfriends.com sometimes earns a little money. It doesn’t cost you any extra, but you are making this content possible. We only recommend products that we own, have tried through the company’s review program, or covet. Thanks for your support.

Join my Mailchimp audienceSubmitting form

By clicking submit, you agree to share your email address with the site owner and Mailchimp to receive marketing, updates, and other emails from the site owner. Use the unsubscribe link in those emails to opt out at any time.

Processing…
Success! You're on the list.
Whoops! There was an error and we couldn't process your subscription. Please reload the page and try again.

The post 7 Essential Inexpensive Ergonomic Office Tools That Prevent Wrist & Hand Injury appeared first on Geek Girlfriends.

07 Feb 19:10

BC Place Naming Rights Up for Grabs

by Colin Stein


Today, Minister of Tourism, Arts & Culture Lisa Beare announced an RFP for corporate naming rights for BC Place, the 54,500-seat stadium right next to the smaller, 12-years-newer, Rogers Arena.

Boasting the largest retractable roof in the world, BC Place is one of the many legacies of Expo ’86, and is operated by B.C. Pavilion Corporation, the Crown corporation responsible for the BC Pavilion, in that seminal year of, well, showcasing BC.

In addition to operating BC Place Stadium and the Vancouver Convention Centre, PavCo has also administered the ground lease and development of the land west of the stadium (now known as Parq Vancouver, a Paragon Gaming hotel-casino-spa-fitness concept).

But for the past decade, ever since Roofgate — sorry, Deflategate was taken — and the 2014 completion of the roof reno, BC Place has largely flown under the radar as a major, name-brand venue for a generation of youth looking for something to do.


You go to BC Place for the Whitecaps or Lions, and you go for the occasional auto or boat show. Or…some people do.

But other facilities get Childish Gambino or Arctic Monkeys, and so other facilities pull in the younger generation.* Could that change with the influx of cash through a naming deal?

Over to you. They’re not asking, but we are:

What name and corporate affiliation would you like to see for BC Place?

*If you don’t know who those artists are, that’s also kind of the point…

07 Feb 19:09

Surrey Langley Skytrain — TransLink Website

by Ken Ohrn

Skytrain rapid transit continues to be a much-discussed topic in Metro Vancouver.  HERE’s Nathan Pachal, Langley City Councillor and friend of Price Tags, writing in his South Fraser Blog about the Skytrain to Langley being proposed for Surrey.

With the switch from light rail along King George Boulevard and 104th Avenue in Surrey to SkyTrain from King George Station to Langley City, TransLink has set up a new website about the proposed Surrey Langley SkyTrain Project.

Surrey Langley Skytrain Website

Among other items collected on TransLink’s website are documents, including some from the Mayor’s Council.

From page 73 of THIS PDF, a project development timeline, showing the all-important business plan approval finishing around May 2020 and start of service targeted for 2025. Costs likely to surface around January 2020.   This is well after the October 21, 2019 Federal election — so Federal money will have to match their share to existing estimates (~ $ 2.9 B), and without an approved business plan.

Getting Skytrain to Langley

 

07 Feb 19:09

Putting Users and Publishers at the Center of the Online Value Exchange

by Denelle Dixon

Publishers are getting a raw deal in the current online advertising ecosystem. The technology they depend on to display advertisements also ensures they lose the ability to control who gets their users’ data and who gets to monetize that data. With third-party cookies, users can be tracked from high-value publishers to sites they have never chosen to trust, where they are targeted based on their behavior from those publisher sites. This strips value from publishers and fuels rampant ad fraud.

In August, Mozilla announced a new anti-tracking strategy intended to get to the root of this problem. That strategy includes new restrictions on third-party cookies that will make it harder to track users across websites and that we plan to turn on by default for all users in a future release of Firefox. Our motive for this is simple: online tracking is unacceptable for our users and puts their privacy at risk. We know that a large portion of desktop users have installed ad blockers, showing that people are demanding more online control. But our approach also offers an opportunity to rebalance the ecosystem in a way that is in the long-term interest of publishers.

There needs to be a profitable revenue ecosystem on the web in order to create, foster and support innovation. Our third-party cookie restrictions will allow loading of advertising and other types of content (such as videos and sponsored articles), but will prevent the cookie-based tracking that users cannot meaningfully control. This strikes a better balance for publishers than ad blocking – user data is protected and publishers are still able to monetize page visits through advertisements and other content.

Our new approach will deliver both upsides and downsides for publishers, and we want to be clear about both. On the upside, by removing more sophisticated, profile-based targeting, we are also removing the technology that allows other parties to siphon off data from publishers. Ad fraud that depends on 3rd party cookies to track users from high-value publishers to low-value fraudster sites will no longer work. On the downside, our approach will make it harder to do targeted advertising that depends on cross-site browsing profiles, possibly resulting in an impact on the bottomline of companies that depend on behavioral advertising. Targeting that depends on the context (i.e. what the user is reading) and location will continue to be effective.

In short, behavioral targeting will become more difficult, but publishers should be able to recoup a larger portion of the value overall in the online advertising ecosystem. This means the long-term revenue impact will be on those third-parties in the advertising ecosystem that are extracting value from publishers, rather than bringing value to those publishers.

We know that our users are only one part of the equation here; we need to go after the real cause of our online advertising dysfunction by helping publishers earn more than they do from the status quo. That is why we need help from publishers to test the cookie restrictions feature and give us feedback about what they are seeing and what the potential impact will be. Reach out to us at publisher-feedback@mozilla.com. The technical documentation for these cookie restrictions can be found here. To test this feature in Firefox 65, visit “about:preferences#privacy” using the address bar. Under “Content Blocking” click “Custom”, click the checkbox next to “Cookies”, and ensure the dropdown menu is set to “Third-party trackers”.

We look forward to working with publishers to build a more sustainable model that puts them and our users first.

The post Putting Users and Publishers at the Center of the Online Value Exchange appeared first on The Mozilla Blog.

07 Feb 19:09

this guy is bad at game theory

From the spam folder:

I am a well known hit man on deep web. Someone paid me 1000 USD to beat you and broke your right arm. (Why? I don't know) I will take 1000 USD more after my client sees your broken arm!

If you send 2000 USD to me, I will cancel the job, and I will give you the name of my client. Else, I will finish my job asap!

Send the above amount on my BTC wallet (Bitcoin): 3JDLJWW5K6AsP1VBUD1Dgsxk9ydtcdMFvz As soon as the payment is completed I will receive a notification and a new email with the client's details will follow.

You have 24 hours from now on!

Hold on a minute.

He has a reputation, but he's going to ruin it, and burn an existing customer, in order to earn 1.5x what he was originally going to earn from the deal?

Where did this clown learn his game theory?

Nobody would take an established brand, fail to deliver the product or service that the brand was originally known for, and leak their good customer's private info, just to go chase incremental revenue driven by unproven new technology, right?

07 Feb 19:08

Actual work work

by Liz

I should mention my actual work while I’m blogging about stuff. “My” Firefox release is now in beta, Firefox 66. We have a team of release managers so can rotate ownership of upcoming releases. Usually this means you’re in the hot seat every 3 releases, about every 4 months. We have a bigger team now so there is more breathing room and we can support each other more; basically that means we’re less burned out. Yay! (A couple of years ago there were like, 3 of us and one was the team manager.)

The feeling of ownership is somewhat silly since it is an enormous collaborative effort, but it helps in the job to follow one version closely, you care about it and are able to filter out & not pay so much attention to the other versions in development. (In practice, that is a lot of email I can skim and archive when it isn’t for “my” release.) The release engineers also rotate through version ownership. It’s a good system.

If you’d like to see all the bugs fixed for Firefox 66 so far, between its birth as Firefox Nightly last December and now, here’s a Bugzilla query which you shouldn’t click if you’re on your phone or a slow connection because it’s going to take a while to load – it will show a list of the 3000+ bugs already fixed. Probably don’t click that unless you really want to wait a minute and a half for the page to load.

While Firefox 66 is in beta, I’m watching for fixes in the version right behind it, Firefox 67, that we might be able to bring to users more quickly. We backport, or uplift, between 200 and 400 issues while a version is in beta. Here’s what I’ve approved to uplift so far, patches from about 40 bugs. It’s helpful when looking at these lists to sort the information different ways (by clicking on the column headers.) These next few weeks till March 19 (the release date) will be my crunch time.

Today I did about one million different things. Hilariously, as so much of our work is right out in the open, you can see some of those one million things (in 68 bugs), at least the bits of it that were me reading a lot of bug reports and figuring out what to do with them (poke someone from another team, engineers, QA, etc, add relevant tags or other info, and while I’m looking, decide how important it is for it to be in Firefox 66.)

07 Feb 19:08

What Are Your Members Proud Of?

by Richard Millington

You can ask this question about their lives or about the community.

It works on two levels.

1) It reveals what members are proud to have/have achieved which they can share with others. This creates a more positive atmosphere in the community.

2) It also reveals which aspects of the community members are proud of. You can spend more time promoting these aspects (or relevant metrics) to members.

What are your members proud of?

07 Feb 19:08

my chief sin

by Justin

aside from too frequent pastrami sandwiches, air travel is my chief sin. It is the guilty thing I cannot help and cannot countenance. If you roll down your windows driving into an airport, you know what I mean. You can't breathe it but you're about it. I talk to jetsetting friends about our trips past and upcoming and I think we're all filthy sinners.

So I think, I should practice better carbon offsets - make my air transit reflect the cost to the collective air/water/earth resources spreadsheet. Expecting to be somewhere far away in less than a day feels like a wild luxury in appropriate to the gravity of suffering already due to our collective resource prioritization, and the upheaval pending as the seas rise and forests dry. And how can I say I enjoy it so; the friends and family anchored to their lives in another place, the chance to taste some other air, to imagine myself as a person inscribing memories with distant nodes.

Sometimes traveling I look up and notce I'm in a room, with other people, seeking food or drink, sex, love or stimulation. I think, why did I need to leave my local rooms to practice want-fulfillment somewhere else?

07 Feb 19:07

Recursive painting in real life

by Nathan Yau

It started with a mom holding her painting of a bird. Then someone painted that photo and took a picture of himself holding the painting. Then someone painted the photo of the man holding the painting of the picture of the mom holding the bird. The recursion continued. Luckily someone diagrammed all of the iterations:

Just wow.

Tags: painting, recursion

07 Feb 19:07

VAR Tools

by noreply@blogger.com (VeloOrange)
by Igor

Ok, tools may not be the flashiest or Instagram-able part of your bike setup or shop, but having dependable, accurate, and easy to access tools makes for quicker builds and repairs. Everyone has had a frustrating experience on the side of the road doing a repair in the rain or just having lost that screw in the grass. Your portable toolkit should be the least of your worries. These VAR Tools are highly precise, easy to use, and actually quite handsome.
This Pro Wrench Set has all of the sizes from 1.5mm to 10mm, for tiny set screws, rack hardware, crank arms, hex stem bolts, bottle cage screws, chainring bol...well you get the picture. The insertion and removal is so exceptionally smooth, you'll find reasons to loosen and tighten screws and bolts all around your bike and house. So smooth when I showed them to Master Mechanic Tommy of Cutlass Velo, I saw a smile of the largest proportions appeared on his face - it was confirmation enough for me. In addition to the regular flat hex side, it also has a ball-end for hard to reach places like bridges for fender installs.


Out on the trail, this lightweight and minimalist multi-tool has all the necessary items for on-the-road adjustments. At only 80 grams, be careful it doesn't float away!
This Chainring Nut Driver is a nice piece of kit for folks who often change chainrings either for themselves at the track or for customers' bikes in the stand. Since the prongs are on the end of the shaft, you don't have to worry about getting your forearms jabbed by shark-toothed chainrings.

The last piece of kit is this VAR Tool Bottle. But it can, in fact, hold other items as well. Hard to believe right? In addition to your multi-tool it can also hold your credit card, cash, power gels, 400-speed film, or bandana. It fits in a standard bottle cage and weighs a meager 48g.


All three tools are made in France and the bottle is made in Taiwan. 

07 Feb 19:06

“The Linux of social media”—How LiveJournal pioneered (then lost) blogging

Steven T. Wright, Ars Technica, Feb 05, 2019
Icon

I was never really a LiveJournal person but I might have been. It was a coin toss when I opted for Blogger instead. LiveJournal competed well with blogs but weren't able to match social media. It wasn't lack of features; it was usability. "We had basically all the major features you see today, like a friends page. But we didn’t quite figure out how to tell the story or keep people interested. We had every option, but nobody could get it to work." Eventually the site was sold to Russian investors. My LiveJournal page has long since been deleted, but I sorta miss it.

Web: [Direct Link] [This Post]
07 Feb 18:59

.ART is the Domain Name for the Creative Community

by Guest Author

In the world of domain names, .ART is not just a domain – it is a platform for like-minded individuals. Creativity is everywhere: whether you make paintings, music and sculpture, sell hand-made T-shirts, or simply believe that your collection of holiday photos is awesome, .ART is for you. Learn how to stand out from the crowd and declare who you are to the rest of the world. Have a look at these incredible members of the .ART community to know who you will be joining. A digital gallery helps display their work to the global online community.

www.generalpublic.art

Australian-American model, philanthropist, and actress Portia de Rossi retired from the screen to launch General Public, a project which lets you experience art like never before. Instead of printing art on a flat canvas like it’s normally done, she incorporated a new type of 3D-printing technique, called synograph, that prints the artwork as it is – with all the tiniest brushstrokes, multiple layers and texture oddities.

 

stevemiller art domain name

stevemiller.art

Steve Miller is a multi-media artist and an early adopter of .ART. Paintings, screen-prints, artist books and sculptures are all among his mediums. For him .ART is about participating in a new hierarchy of the digital world, a way to represent himself differently, and an extension of his artistic impression. His website a full-on experience: from painted surf and skateboards to photography books, it makes you remember how fascinating nature is.

hilbrandbros art domain name

www.hilbrandbos.art

Hilbrand Bos is a fashion illustrator and designer who lives in Amsterdam. One of his favorite projects is an ongoing collaboration with Universal Studios on the cartoon The Secret Life of Pets, for which he creates merchandise prints. Hilbrand’s website is sleek and stylish like his own drawings, which often look like a one-liner. In his own words, he chose a .ART domain “because it looks nice and because it contains only what it should – the two things that I have to offer – my personality and my art”.

lightheartdance.art

Lightheart Dance art are the kind of people you would want to spend Sunday night with. Jeff and Kay McLean are a duo of dance photographers passionate about camping, border issues and their daughters. Their website is a harmonious mixture of beauty that surrounds them – not only in their profession, but in private life too.

christianschaffer.art

Christian Schaffer and her website will make you feel like you are missing out on life. Having quit a corporate Abercrombie & Fitch career, she travels the world in search of her next temporary home, adventure, and creative projects. Her website tells a story: through stunning white-washed imagery and a domain name that fittingly emphasizes her knack for artful living.

randalford.art

Few photographers in the world have photographed as many animals in studio as Randal Ford. Animal portrait photography is captivating: putting wilderness in a human setting creates the kind of absurd and memorable beauty every artist strives for. Soon to be published in a print edition, Randal’s photos are the protagonists of his website. Ever wanted to make eye contact with a lion? Dive in.

ANASTASIA SUKHANOV – EDITOR-AT-LARGE, .ART

Anastasia is a journalist and writer, covering topics from art and design to society and travel. You can connect with her on LinkedIn.

07 Feb 18:59

Vote Shane Pendergast

by peter@rukavina.net (Peter Rukavina)

The Pendergast family has been an important presence in our life on Prince Edward Island: they are an enormously talented bunch, whether concerning matters of food, books, music or philosophy. And among the kindest lot you’ll ever encounter.

The talent has made it to the next generation: young Shane Pendergast–you may remember him from the film he made about John Bil–is an entrant in the CBC Searchlight competition, and you can vote for him right now as easily as clicking right here, listening to his track (you don’t have to listen to it to vote, but it’s a good track, and you should), and clicking Vote.

You can do this, apparently, up to once a day.

Shane Pendergast (detail from YouTube video)

07 Feb 18:59

Books inhaled lately

by Liz

I’m still pecking away at the Morland Dynasty books by Cynthia Harrod-Eagles and still recommend them! If you like Regency romances, or anything Napoleonic War related, Master & Commander, or whatever, you might like this series a lot. It has solid historical research behind it, which I find very satisfying and also alluring (It leads me to fall into giant Wikipedia sinkholes.) I’m on #16, The Devil’s Horse, which is very exciting as railways (tramways really) are just starting to be a Thing. There are more scenes in Manchester & some mention of Castlereagh (and his wife Emily or Lady Castlereagh, who you may recall from your Regencies was a Lady Patroness of Almack’s who could get you vouchers) and Canning. Lady C: “Her own parties were considered dull, and her manner was somewhat eccentric: guests described her conversation as an endless flow of trivial information delivered in an oddly detached manner.” I like her already. I hope she had a lot to say about trains.
There are lots of scandalous and miserable events – affairs, deaths (maybe murders – I have THOUGHTS about Flaminia).

Also reading How Long ‘Til Black Future Month, which is great! More details when I finish it.

I also re-read Archivist Wasp and the sequel to it, and T. Kingfisher’s Swordheart. Not reading quite as much as usual lately because I’m thinking about Inform7 so much.

07 Feb 18:59

Santa Cruz Waves: "Blix Bicycle Brings the E-bike Craze to Santa Cruz"

by Blix PR

Last month, J.D. Ramey with Santa Cruz Waves conducted an interview with Blix Electric Bike founder Pontus Malmberg to learn more about electric bikes as well as the purpose and goals of Blix. As a local Santa Cruz company, Blix is familiar with the city's constant traffic, environmental focus, and active lifestyle. Highlighted below are some of the main points discussed by Pontus and J.D.!

                                                                                     

Transportation as a means of "freedom"

Pontus argues that cars no longer have the same "freedom" potential as before since"there are situations in some places where cars are basically the opposite of freedom" due to traffic, population size, or limited space. As J.D. notes, this was one of the leading factors in Pontus' decision to design a line of electric bikes. 

What are electric bikes?

As J.D. concludes, electric bikes "don't look much different from other bicycles," rather they are different in the sense that "ebikes have battery-powered electric motors that can add up to 20 mph to the speed generated by pedaling." Blix electric bikes also include varying battery sizes, throttles, and four levels of pedal assist which determine the power emitted from the motor.

Benefits of electric bikes

While there are many benefits of riding an electric bike, Pontus argues that the pedal assist allows riders to go farther and conquer hills with the option of not breaking a sweat. He explains, "You don't necessarily want to sweat every time you go to work, go buy something, or visit a friend." With pedal assist levels, riders choose their own levels of exercise and change accordingly.

Another benefit, particular to Blix Electric Bikes, is the choice of folding ebikes. As J.D. states, folding makes for "easy storage (the better to be brought aboard a bus or train)" and excellent options for alternative methods of transportation for commuting. 

Leading factors in the ebike revolution

J.D. wondered why ebikes have gained popularity over the last few years and Pontus highlights four reasons that may explain this phenomenon.

1. Increased gas prices
2. Rising awareness of wellness and the environment
3. Decrease in convenience of cars
4. Heightened safety of electric bikes
These factors encourage people to find sustainable, active, and economical modes of transportation that are also safe to use and reliable.

 

Why Santa Cruz?

When J.D. asked Pontus why he choose Santa Cruz as Blix Electric Bike's home, Pontus says, Santa Cruz offers "the active-lifestyle mindset upon which the company is built." This city continually supports environmentally-friendly products and their focus on health and wellness has helped Blix make a difference in the community.

Thank you to J.D. and Santa Cruz Waves for featuring us in last month's Company Feature!

                                                                      

Check out the article here

Check out Blix Electric Bikes here

Follow us to stay updated with all things Blix!

 

 

 

 

07 Feb 18:59

Interview: Hackathons sind Innovationstreiber in der Unternehmenskultur

by Carsten Thomas
Große Unternehmen nutzen zunehmend Hackathons, um Innovationsziele zu erreichen. 2018 wurden weltweit 5.636 externe und interne Hackathons organisiert, fast 40% mehr als 2016. Zu diesem Ergebnis kommt Hackathon.com. (Weiter unten finden Sie eine anschauliche Infografik) [...]
07 Feb 18:59

The Community Managers Who Go The Extra Mile

by Richard Millington

The hardest community managers to replace are the ones who care the most.

These are people who don’t just answer questions but go the extra mile to make sure the members feel respected, cared for, and appreciated for bringing issues to the community’s attention.

These are the people who realise they are a vessel for every member to feel like they have influence, support, and are important to the brand. Sure, your organization might not be able to adapt to the whim of every customer with a problem, but you certainly can.

These are the people who don’t just respond to the question but acknowledge the frustration, find a solution instead of just an answer and try to end the interaction on a positive note. Better yet, they follow up to check the answer work.

These are the people who realise you’re not just spending time crafting an answer to a single member but to the dozens, hundreds, possibly even thousands of people who will read the answer.

The best way to find these people isn’t by asking them if they care in a job interview, but by seeing how they participated in their last community.

If you’re not sure if you’re one of these people, you can test yourself. Take your last 5 community posts and see how you would fit into the community standards below.

Next month repeat the process and see if you improved. Caring might be free but the community managers who really care are rare and worth the premium you should pay for them. Anyone who goes the extra mile often enough is going to cover a lot of distance.

07 Feb 18:58

The Magic Flying Circus :: Ein bescheidener Erfolg

by Volker Weber

00c176208e53d7148d23f05a9abd3a65

Eigentlich wollte ich die Gruppe ja "vowe's magic flying circus" nennen, aber das sind 26 Buchstaben und damit einer zu viel. So wurde es dann "The Magic Flying Circus". Und was ist das? Ein lockerer Chat zwischen ein paar Dutzend Menschen, die ich zum Teil kenne, aber die alle mich kennen.

Nach nicht einmal zwei Wochen ist die Anfangsturbulenz vorüber, die Menschen kennen sich mit dem Tool aus und die Probierphase ist beendet. Jetzt genießen wir einfach die unglaubliche Themenvielfalt. Registriert haben sich mehr als 300, aber viele davon schauen nur ab und an mal rein, vermute ich. Der Ton ist sehr freundlich und inklusiv. Ich musste nur ein paar mal steuernd eingreifen. Das Löwenbändiger-Diplom, das ich mir als Fidonet-Moderator erworben habe, war dabei hilfreich. Wer die Signale nicht verstand ist nun nicht mehr bei uns.

Einfache Regeln: Mit vollem Namen registrieren, ein Profilfoto, das den Menschen erkennen lässt (Schau mir in die Augen), und die anderen akzeptieren. Knötterei brauchen wir nicht.

Wir machen das mit Kaizala, ein Stück Microsoft-Software, das man privat nutzen kann. Sieht aus wie WhatsApp, nur ohne Facebook halt. Man kann es natürlich auch wie WhatsApp nutzen und braucht keine Telefonnummern von Circus-Besuchern. Anders als WhatsApp plaudert Kaizala solche Informationen nicht aus.

Der Circus bleibt erst mal da, wo er ist. Ich baue die Einladung irgendwann in die Seitenleiste ein.

Android-User: Einladung antippen, App installieren, Android booten, nochmal Einladung antippen.

07 Feb 18:58

Sonos Amp ab 12. Februar

by Volker Weber

amp-connections

Sonos Amp, sozusagen der neue Connect:Amp, wird ab nächste Woche ausgeliefert. Mehr Kraft und eine HDMI ARC Schnittstelle, so dass man ihn auch am Fernseher betrieben kann. Mit speziellen Sonance Lautsprechern für Decke und Wand kann er auch TruePlay. Damit wir uns recht verstehen, dieses Gerät ist vor allem für die Ausrüster gebaut, die in einem Haus überall Lautsprecher verstecken und dann noch einen Fernseher integrieren wollen. Was das Ding genau kann, vor allem im Hinblick auf Mehrkanalton, entzieht sich meiner Kenntnis.

  • Der neue Sonos Amp ist ab 12. Februar auf sonos.com und bei ausgewählten Handelspartnern verfügbar
  • Die passiven Sonos In-Ceiling und In-Wall Speaker by Sonance lassen sich per Trueplay an jeden Raum anpassen und sind ab heute vorbestellbar
  • Die passiven Sonos Outdoor Speaker by Sonance sind ab April verfügbar
  • Busch-Jaeger sowie das Berliner Start-up Senic erhalten neben weiteren internationalen Marken die Zertifizierung „Works with Sonos“
07 Feb 18:57

Invoxia Pet Tracker :: Der Test beginnt

by Volker Weber

8026ca536dcd40f440d6e33f940f0315

Invoxia hat ein Sample des Pet Trackers geschickt und den trägt ab jetzt Frau Brandlinger. Wir haben ihr gestern extra ein neues Halsband gekauft. Wie man sieht, ist das ein kleines Kästchen mit einem GPS-Empfänger, einem Akku und einem Modem für Sigfox/LoRa. Ein dreijähriges Abonnement für Sigfox ist im Kaufpreis enthalten. Selbst wenn man den Tracker nach drei Jahren in die Tonne wirft, reduziert das die monatlichen Kosten auf unter drei Euro.

b392ae76b8e54b9b549a985b6ae95c01

Ich habe den Tracker gestern erst in Betrieb genommen. Es gibt eine iOS-App, die für Android folgt am Freitag. Auf Anhieb funktioniert noch nicht alles, aber ich brauche noch ein paar Tage für ein Urteil. Invoxia ist gerade erst gestartet, da will ich ihnen noch ein bisschen Zeit lassen.

Aber ich habe große Erwartungen. Der Tracker zeichnet nicht alle Bewegungen auf. Er taugt also nicht zur haargenauen Verfolgung. Aber das muss er auch nicht. Man kann sich entweder alle 10 oder 5 Minuten einen Ort schicken lassen, wenn das Tier in Bewegung ist. In Ruhe sendet er nur alle vier Stunden. So spart das Gerät Strom und der Akku soll monatelang halten.

Noch nicht aktiv ist der Fitness Tracker, der schaut, ob das Tier auch genug Bewegung hat. Das interessiert mich allerdings auch nicht die Bohne.

Invoxia hat zwei Bauformen: Einen Pet Tracker für's Halsband und etwas schickeren GPS Tracker für Senioren. Man lasse sich von den schlechten Bewertungen nicht irritieren. Die sind zum Teil auf falsche Erwartungen zurückzuführen. Die Tracker erzeugen nicht einen genauen Überwachungstrail. Aber sie erlauben einem, ein Tier oder auch einen senilen Senior wiederzufinden. Wir hatten ja letztens erst einen entlaufenen Hund in der Nachbarschaft. Mit dieser unpräzisen Information hätten wir gewusst, wo wir ihn suchen müssen und hätten ihn ohne Probleme auch gefunden.

Wie gut der Tracker wirklich ist, wird sich in den nächsten Wochen zeigen. Ich werde weiter berichten.

More >

07 Feb 18:57

Why does WeChat block competitors, while Facebook doesn’t?

by WalktheChat
Western tech companies protect their castles; Chinese firms play guerrilla warfare.
07 Feb 18:57

The kindness of blogging

by admin

Photo by Robert Baker on Unsplash

My blog is always at the back of mind, quite often I deliberately put it there as I haven’t found the time to write anything and post!  Last week, a couple of things made me start to reflect on my blog and my blogging journey (again).

Firstly the next PressEd conference call for submissions is open. I watched this twitter conference from a bit of a distance last year and felt the very positive tsunami of twitter love for it from both presenters and delegates. Then I was in a room with both Natalie Lafferty (conference co-organiser) and Anne-Marie Scott at a QAA Scotland Enhancement theme meeting (note to self – should write a blog post about that). They very skilfully shepherded a conversation to a point where I almost talked myself into submitting something.

Later in the week Lorna Campbell wrote, probably the best post about academic blogging I’ve read, based on her own experience and the work she is leading at Edinburgh just now.  If you’ve ever thought about blogging but still are a bit unsure -just read the post and go for it.

In the post, Lorna mentions a few of her favourite academic bloggers and I was thrilled to be included in there, to feel valued by my peers and community.  That made me think again on notions of academic kindness which I reflected on after the recent SocMedHE conference.  For me one of the most rewarding parts of blogging is when people either link to a post of mine,  or when colleagues like Kate Bowles point their students to my blog, or when people take the time to leave a comment. When colleagues such as Frances Bell leave a comment on a post, they always enrich the original post and push forward my thinking.  

All these acts of engagement with my, often quite rambling posts, is such as motivator to keep writing. It helps validate my thought processes and my own sense of worth and value. 

I think that that level of open, reciprocal acknowledgement is a key part of academic practice in our digital, or even post digital age. We all need to support and encourage as diverse a range of voices as possible to be heard.

In this respect, Maha Bali’s blog has been a revelation to me, reminding me of inequalities, dominant voices and the need to think beyond my global north norms. Connecting with her through her blog has expanded my horizons hugely and allowed me to connect with a wider community and hear more diverse narratives around many, many aspects of educational development and practice.

I’ll never forget the first time I met Maha in person at the OER17 conference. She mentioned my response to a pre conference blog post she had written. We had a hug in the middle of her keynote. I know not everyone is a “huggy” type of person, but to me that personified academic kindness. We connected (and continue to do so) through our shared (and different) perspectives on a range of topics from digital capabilities to what to wear at a conference keynote to open education.

There is also so much hope to be found in Maha’s writing too.   That kindness of critically sharing different perspectives is what I aspire to, and what I see in so many blogs from my network.  

Blogging for me has never been about SHOUTING or stats- though data about your blog can be “interesting”. It’s about sharing experiences, about enacting open practice through sharing work, thoughts, hopes and fears. 

Although I have been blogging for quite a while now, I do still struggle to keep in the blogging habit. Time is always the enemy, and over the last year I have been spending a bit of my writing time on somethings else. Also, having spent many years finding my voice, recently the world has seemed such a crazy place that it has almost silenced me.

However there is something about the freedom of writing in a blog that just keeps me going.  I love the freedom from the norms and standards of the tyranny of a  peer reviewed academic article.  The freedom to think aloud and have the power to publish when and where I choose to.

On reflection, I feel that my sustained engagement with blogging has been a key part of personal and professional and personal development process. The act of blogging has been a critical part of my own agency and sense of continuously developing, reflecting and understanding of my own praxis.

So I think I may have now just about convinced myself that I should submit  to pressed this year, and I want to thank  you, dear reader for all your kindness in reading this blog over the years.

07 Feb 18:57

You are in a maze of deeply nested maps, all alike [TALK]

by Eric Normand

People complain a lot about difficulties with deeply nested maps in Clojure. I’ve never had that problem. I looked at other people’s code to see what they were doing to get into trouble. In this talk you’ll get a good idea of the wrong turns people take and you’ll leave with some techniques to find your way out and to avoid getting lost in the first place.

Video

Slides

You are in a maze of deeply nested maps, all alike

Download slides

Transcript

Eric Normand:  How is everybody doing today? I’m very happy to be here in India. Thank you to the organizers of IN/Clojure for inviting me. I’ve just had such a warm welcome. I know this won’t be my last time in India. Thank you very much.

I’m going to talk about a problem that I hear a lot of people complain about in the Clojure world. It has a lot to do with using data. We get these deeply nested maps. We forget what keys we have, what entity we’re supposed to use in certain places, and what’s supposed to be in this map.

Let’s talk about the symptoms of this problem. A very common complaint is, “I can’t remember what keys I’m supposed to use in this map.” Very common. First, show of hands. Who feels this? Oh, wow. About half of you have raised you hands.

I was talking to someone yesterday here at the conference. It just seem like they’re all, “Yes, yes. How do I do that?” I’m glad I’m talking about this. I don’t know what kind of map I have. What is this even? I got this passed to me in this function. What is it?

Another common problem — awkward code for manipulating these deeply nested structures. Here’s an example. This is a map that represents this space voyage. You all recognize him I suppose. Yes? Rakesh Sharma.

Here’s some code that will manipulate this. We basically want to capitalize all of the names of the crew members of different missions. We can analyze it just by looking at it. We’re doing maps. Mapv, which means we’re mapping over a vector. It’s a vector of missions. Inside the crew key, there’s another vector of crew members.

We’re doing two updates. We need to define three anonymous functions. This is awkward code. It takes a while…This is actually well-written, well-formatted, well-organized. Everything is well-named. Still, look at the indentation. Look at how big it is and how deeply nested it is. This is the problem I see a lot.

Then, long functions. We’re told that we’re supposed to have functions one to three lines. You go into your code base and there is this big monster 30-line function.

It’s usually stuff like this, four times. Four things like this, trying to manipulate these data structures, and put new things together, and come up with new combinations of them. We do it all in one big function. It’s a problem I see.

There’s a couple of technological solutions. These are common problems. There’s Spec and there’s Specter. Spec is good at at least checking that you’re using the right keys. It’ll help you with that. It’ll also help you remember them because at least you had to write them down somewhere and you can go look it up. Also, what kind of entity you have. It can help you with that.

There’s the library, Specter. You’re all familiar with Specter? It’s not very commonly used as far as I know. It helps manipulate this deep data structures. It has this composable system for reaching deep down into a data structure. You could do stuff like capitalize every other name, something like that. Instead of having to pull it apart and then put it back together, you just do it in one step.

I don’t think there’s anything really for dealing with long functions. I don’t know if it’s really even a technological solution. I just wanted to mention these because I think that they do show that the problem is real and that people are feeling this problem.

I’m not going to go into them anymore. I don’t want to deal with this on a technological level. I don’t think it’s a technological problem. I actually think it is a social problem or a design problem let’s call it.

The underlying cause of all these symptoms is that we’re working at the wrong level of meaning. We have this expression. I actually heard it a few time yesterday here. “It’s just data.” It’s one of the advantages of Clojure. You don’t have to make all these classes, other kinds of abstractions, just to start working.

You just treat the thing as data. It’s just data, but I think that that is misunderstood. It doesn’t mean you don’t come up with new levels of meaning and neglect the data. It’s data and it’s got meaning. As an example, this is some data. What’s the outer thing? What is this piece of data? What kind of data is this? What kind of data structure? Someone shout it out.

Audience Member:  [indecipherable 6:04] .

Eric:  A map. Yes, it’s a map, but it’s also something else. It’s also, this first thing is a character. It’s a bunch of characters. This is what I mean by going at different levels. You can actually see that there’s this code. It’s a map but it’s also just a sequence of characters.

Actually, you can go down. It’s bytes on a disc, and to turn in into characters, you put it through a Reader to take those characters. You do a read that turns it into syntax. Then you can eval it, turns it into Clojure semantics.

Then you have all the code that you wrote that makes it, at another level of meaning, about space travel. This is your domain code. This is your job, is this last step.

What I’m trying to say is that “it’s just data” means that you can always go up and down this tree, but you should want to work up at the top.

Let’s just look at that top part. You have Clojure code at the bottom. This forms the base of your system. Then you’re going to import a bunch of libraries and they’ll sit on top of Clojure. Then you write your domain code on top. These are like layers of meaning that you’re adding.

Clojure code is very abstract. It’s general purpose. It doesn’t know anything about space travel. Neither do your libraries, usually, but then your domain code is all about that.

Let me show you one of the problems, like an illustration of this problem, and how we get to here where we forget the keys. We have these gigantic maps that we don’t know what belongs in them, what they mean.

Here’s some reagent code. You’ll notice it’s got a component up at the top, so it defines an atom, a reagent/atom. It’s got a component. Then another component that uses that component.

But I want to focus on this line here. This makes a button, so it has an on-click handler. Notice what it does. It swaps directly into the atom. It’s just data. We’re just adding something to this map that’s in the atom, a favorite color. Now that’s cool.

Let me graphically represent this. Let’s say we add another component that lets you select your favorite animal. It also just associates right into the atom. We add another thing, and another thing, and another thing.

Pretty soon, we’ve got all these key words that could be in that atom, but where are they defined? All throughout the UI. The definition of what we will find in that atom is smeared all over your code. There’s no one place where these are listed. When you go to say, “Let’s re-factor,” you don’t even know where to look.

How do we know what is modifying this user-info thing? You might be able to grep for associates to user-info, but even that won’t find everything. So, just little by little, we’ve started with data and we never turned it into a new layer of meaning. We just added one thing after another.

Pretty soon, you’ve got a team of 10 people. You’ve got hundreds of components, all of them are adding stuff to this map and you’re in a mess. You don’t know what to do.

Every time you make one of those things, you’re thinking up here at your domain level. You’re thinking, “Oh yeah, favorite color, that’s a really important concept. We’ve got to save that to the atom.” But really you just write a little swap within an assoc. You’re writing down at the data level. You’re just doing this little basic operation.

That’s the mismatch. You’re thinking up here and you’re writing down here. You need to write where you’re thinking.

Here’s how we could fix this. Here’s that same line of code extracted out. It’s all just Clojure core libraries. How do you turn it into something at higher layer of meaning?

Not a higher level of abstraction. It’s actually less abstract than…Assoc is very abstract. It’s any key-value pair. We want just favorite color. How do we turn this into a new layer of meaning? The only thing we can do — we give it a name. We give this operation a name. We define a function, and there we have it.

I see some maybe skeptical looks that maybe this is too simple, that I’m giving something too basic. It might be basic but we don’t do this enough. We don’t actually sit there and think about what our operation should be.

Let’s look at it some more. Here’s the old code. This is what it’s going to look like when we change it. I suggest adding a new name space called user-info where all those operations are going to go. We add this set-favorite-color function there. We can also add the other ones, so set-favorite-animal, set-favorite-fruit.

They all look very similar but now we have this nice check .Before, if you misspelled the keyword, nothing was going to bother you. Nothing would check that you got it wrong. If you’re calling a function instead of associating a keyword, if that function doesn’t exist Clojure’s going to tell you. That’s another advantage to this.

Another objection you might have is that this is a lot of code. It’s true. It’s more code. Let’s count it up. We had one line before. Now we have three. It’s three times the code. That’s the con. The pros. It’s three times the code but you can find it in one-third of the time. You can see all of the keys right there in that one name space.

Another thing is as you do this, as you factor things out into their own operations, you’ll probably find some duplication, like you were setting the favorite color in two different places. You won’t have to make a separate function for each of those.

Another thing is that the parts can evolve separately. You’ve got one layer of indirection where you can make changes without having to touch your UI. Before, if you wanted to change the key for favorite color, you’d have to go to the UI and then to whatever else is looking in that atom for the favorite color. Now you just can change it in one place.

Also, it’s less to keep in your head. You won’t have to think about, “What are all of the key words I might encounter here?” You have these operations. They can be tested. They’re well defined. It’s a smaller set to keep in your head.

Let’s go back to this layer of meaning diagram. As you add more and more code, you’re increasing the size of your domain code. It’s getting bigger and bigger. At some point, you’re going to reach a limit where you’re going to need some other organizing principle for this code. You can’t just rely on, “Oh I’m just moving it to name spaces and stuff.”

What do you need to do? You make more layers. Your code becomes different layers. Let’s take a look at that. Here’s a similar map to what we had before with the Soyuz T-11 mission.

Let’s say Rakesh needs to do some centrifuge training. His crewmates are wishing him luck. “Good luck. It’s really hard. They’re going to spin you around in this big machine really fast. Good luck.” He passes. It’s close but he passes.

We need a set that he passed it in this map. Take a look at this assoc-in. We get a mission and in the crew key, under the research-cosmonaut position, in that person’s training map, under the centrifuge training, set the status to pass.

Who has stuff like this in their code? These really long paths. Yeah, I see a few shy hands going up. [laughs]

This is a problem. This is an indication that you have deeply nested maps. You haven’t really thought about segmenting it into different things that have their own coherent meaning to them, that they form a kind of integral concept.

I would break this up. I drew some lines. The crew and the research-cosmonaut, I’m calling that…that’s a part of the mission. The mission knows the crew key and that there’s going to be position keywords under that. Training is part of the crew member — the person. The centrifuge and status, that is something that I’m going to call training record.

I’m breaking this up into different parts. I think two or maybe three is probably the longest path you should use, so this will work for this.

Sorry, I had the diagram here. Mission, person, and training. That means we’re going to have to make name spaces for these.

Up at the top, we have the training. We are going to do a set-status. It takes the training record, and it takes the name of the training, and it sets the status in that record. Very easy. All this code is very easy to write, by the way. That’s the nice thing about it.

Person. Instead of knowing what the training record looks like, it calls the training set-status on whatever is in its training key. Mission doesn’t know what the person record looks like. It just knows where to find it and then what operation it’s trying to call on it. This a separation so that they can evolve separately. They can change separately.

If you’ve got a couple of paths like that in your code, some deep assoc-ins or update-ins, you’re coupling the structure of those maps all along that path to this other place in the code where it’s just being used. You want to have these isolated entities that you can deal with on their own. Modify, update, and evolve on their own.

Then, what this turns into is we have these layers on top of libraries. We have our training layer. Then a person refers to that training layer, so we’ll put it above it. Then a mission has many people in it, so that goes above it. There’s probably some more in there, but somewhere up top we’ve got the UI.

In the OO world, they talk about this all the time. They call it the Law of Demeter. In the OO world, you’re not supposed to do a long chain where you’re like the missions, crew members, research cosmonauts, training…you know, the dot. You can’t have a long chain of dots.

That’s actually considered bad form because you’re tying in that whole chain. You’re reaching into the object and you have to know so much about this huge chain of objects. You should know as little as possible about everything down the line, how things are implemented.

I mention object-oriented programming and the Law of Demeter. I expect that someone out there is thinking, “Aren’t I just encapsulating? It’s all supposed to be data. Why would you want to encapsulate this?”

My answer is we are encapsulating, and it is just data. They’re not in conflict. We’re encapsulating it mentally. Mentally, we can operate on this map as if it were this very small, well-understood thing. But then, at the end of the day, it is just data.

There’s actually a tension between a map, a generic key-value store, and an entity, which is a thing which has meaning and its own operations — the things that are valid — on it. We can move between these two, and we have to be conscious of where we are or how we’re thinking about it when we’re writing code.

There’s nice things about treating it just like a map. It’s an entity, but it’s also we can treat it like a map. You can print it out. You can serialize it to JSON. You can enumerate the keys if you need to. You can store it in a database, compare it with equals. There’s all these things that we can do when we just treat it like data.

That’s great. You can’t do that with a class, an object-oriented class. You have to write your own equals method. You have to write your own hash code. With this, it’s a map. It just works with all these things that work well with maps.

Lastly, I want to say that you don’t have to do the design up front. At the REPL, you can do an assoc. You can do an update-in right there without writing the operation. You can figure it out first. You can write those in your UI. Then later, refactor it out. It’s faster, but you should refactor it out, at some point, into the entity.

When we’re talking about the entity, we’re talking about domain operations — a small, defined set of things that are valid to do on this object. It makes it conceptually smaller, easier to understand. It lets us program at high level.

It also lets us maintain these invariants. You wouldn’t want a crew member with an empty name or number for the name. This is something that a map will never be able to do, but if you put constraints in there you can have an entity that makes sense.

At this point, I just want to talk about some more tricks and ways to think about this. What we’re talking about here with all these layers of meaning is called stratified design. We talk about it in the structure and interpretation of computer programs.

The idea behind stratified design is that you’re building layers of meaning on top of existing layers of meaning, and there’s some constraints to it.

I’m using this example here of cooking/cuisine. At the bottom, there’s chemistry. You can’t escape chemistry, acids and bases, and proteins and starches. Those are all there. On top of that you’ve got some very basic concepts, like applying heat, and chopping, some skills like that. Then on top, we’ll put ingredients.

Now, this is a designed system. It’s designed. These concepts do…you could put them in another order but this is how I chose to do it. I put ingredients on top of chopping because you have to…The ingredients will know how they need to be chopped.

You can say a carrot needs to be chopped this way but an onion chopped this way. Then, on top of that, there’s the basics. How to make a basic sauce or how to make a dough. Those things will have to know about ingredients. Then finally, at the top, we can start talking about recipes.

We can start talking about how to make a dosa. Something like that. The nice thing about this is when you draw it out like this, there’s some nice constraints that help you figure out where your layers are.

The first principle is that you can separate things according to rates of change. Chemistry does not change. It’s always the same, but then the dishes can change. The recipes can change. You can imagine if…This I did Indian cuisine but if you went to French cuisine, how much staff would you have to change?

Chemistry obviously is going to work the same there in France. Applying heat and chopping, those are probably the same. Maybe you’d have to add or remove some vegetables or some other ingredients but then, definitely, the dishes and the basics are going to be different.

The stuff at the top changes much more frequently than the stuff at the bottom. That’s great because it means that you’re actually finding stuff that is universal, that you can use and reuse for the lifetime of your software. Then the stuff at the top — yeah, that changes and it [inaudible 24:59] , but look nothing is depending on it. Nothing is built on top of it and that’s fine.

Usually, at the top you’ll have something like your business rules or your UI, which changes a lot. I’ll move this button over here. That kind of stuff. Those things change very quickly.

Another principle is that the dependencies have to point downward. Just as a kind of an absurd example.

It would be weird if two things at the same level referred to each other. One should be on top, unless…If they don’t refer to each other, they can be at the same level. It would be weird if applying heat depended on chopping. It would also be weird if the carrot knew the dishes that it could be made in. You want the dependency to be the other way, so let’s X those out.

Similarly, it’s not wrong to skip layers but it might be a code smell if you’re skipping layers. For instance, you wouldn’t want to define your dosa in terms of chemistry. You wouldn’t want it to be like creative starch and water solution with this pH and apply heat. That’s your dosa recipe, right? You actually want to build it out of stuff that’s higher level than that.

Be careful of skipping layers. Sometimes you’re going to skip layer though. Like if you got a map, you probably going to still assocs into it. You’re still using the Clojure core when you’re talking about the high level but you can also define it in terms of other stuff.

Another trick that I use for avoiding these kinds of problems is I use constructors. When I define an entity type, I make a function that would generate that entity with all the keys that I need. This function is great because it gives you a place to define the keys, check them for required ones, maintain some invariants, those kinds of things.

Let’s look at an example. Here, I’m using this convention of ->person to mean construct a person and I’m using the keyword argument destructuring. I use the ampersand and then a map destructuring with keys so I can get some keys out of there.

This is just a very simple one. I’ve got name and trainings as the two arguments. Notice I’ve got a default for training, so an empty vector. I’m also checking that the name is a string. That’s an invariant I want to check.

I’m doing a little calculation. I’m trimming it, getting rid of the white space on the outside. Then, I’m making sure that it’s not empty. That’s an invariant I wouldn’t want to mess up. Then I’m naming the keys and making the map.

Does anyone do this? Define constructors? It’s very common to just do an inline map. If you want to change something, you want to change a key, now you have to go find all the places where that inline map defines that entity.

It doesn’t look that different. It’s going to open paren, ->person, and then key value pairs. It’s not that different from just open braces. It gives you a place to, if you need to, to change things and a good place to look for all the definitions.

This tip is a little harder to explain, but I think it’s really important. As people progress in functional programming, they often get to this stage where they say, “Well, it’s all about data transformation pipelines,” and that’s true.

We use data transformation pipelines a lot and it’s a very powerful thing. There’s more beyond that and, unfortunately, we don’t talk enough about that. That you can actually go beyond just pipelines of data transformation.

This is one thing that’s beyond it, combining operations. We choose to do these operations because they’re hard. They’re the hardest ones. It’s really easy to do an operation that is just an assoc. That’s easy. It’s so obvious, it’s kind of pointless. When you’ve got these combining operations…What do I mean by combining operations?

If I’m writing a contact app, so I’m keeping my friends, their email addresses, their phone numbers, and I want to sync it. What data do I need to combine this stuff on my phone with the stuff on my computer?

I’ve got this record of their email address on this computer and I change it on this computer. Then when they sync, how does it choose which one? That’s a hard operation. It’s going to constrain the kinds of data you have to keep.

You can’t just keep a map because if you have two maps, and you merge them, something’s going to get deleted. You need something more. You need either the time it was changed, or what computer it was changed on. Maybe you need a way to maintain multiple email addresses.

You can say, “Oh, you had this email address and this one,” now you’ll have both. This is a design problem that you have to think about.

It’s easy to say, “Set this person’s email address.” That’s too easy to start with. You want to start with the, “How do we combine the two?” If you start with that, there’s all sorts of constraints that actually make the data, make it easier. It’s a good thing that you have constraints. We can’t just keep a map. We need something more. That’s a constraint.

Then also, it gives you a potential for algebraic reasoning. For instance, you might want to say, “Look, I don’t want it to depend on what order these computers connected to the Internet.” No matter which one connects first, at the end, when they’ve both connected, I’ve got the same answer. That’s an algebraic reasoning. A plus B is the same as B plus A.

Let’s look at some simple code for this. This is in my training namespace. Let’s say Rakesh was doing some training in India and some training in the USSR. When you combine these, there’s a rule that says if you pass the centrifuge in India but you failed in the USSR, that’s fine, you still can go to space. You passed somewhere, that’s good enough.

We make a function that captures that idea. We call it combined training statuses. It takes two training statuses, A and B. If A or B is a pass, it returns pass, otherwise it returns fail.

Then, we can make a function that takes two training records and does a merge with this status-combining operation. That way, India can keep its records. Russia keeps its records. Then boom, at the end of the day, you can merge them.

This is what I mean by combining operations. This isn’t like some inline if statement where I’m like, “Oh, if Rakesh did this, and then that, and then…” This is like defining how these records can combine, in one place, as an operation.

Now I want to go over some code smells, for what to look for in your code that could lead you to find layers of these meanings. We went over this one — really deep paths, really long paths. I think three or more is a smell.

Two is OK, because you have some structure in each entity. When you’ve got three, definitely when you’ve got four, you’re crossing a conceptual boundary. That’s going to limit your speed. It’s going to make it so that things can’t evolve independently and you’ve got keep so much more in your head.

Large hash maps. Like I showed before with the user info, where we’re setting the favorite color, favorite animal, all that stuff. There’s no organization. Every component is probably a team of 20 people, like every component, everybody’s just throwing stuff into a big map.

If at any point, you would print it out, you would just get this huge list of stuff. What kind of organizing principles are in there? Nothing. Just like a sock drawer where you just throw all your socks.

Here’s an example. Here’s my information. This is me. You see I have email, phone, street one street two, some favorite things at the bottom. This isn’t that big but it’s already got enough stuff that you could start to see, some things are more related than others.

For example, does my email address go with my favorite color? No, probably not. Not as much as, say, the email address and the phone number. This, I kind of refactored it, reorganized it. We can see that we went from 10 top level keys to 3, and contact info becomes its own thing with its own keys.

Then address, “Oh all those things are very related, let’s put them in their own map.” I even did this other thing with the favorites, where I split up the key. From favorite color, favorite animal, I made favorites and then a little sub map.

You can already start to see that there’s a little concepts showing up, like maybe address, we use them enough that we make it our own namespace just for address, with its own operations.

Maybe contact info has its own stuff too, so we know we call it email and not email-address. We call it phone and not phone number. The same with favorites. We have to know that the color is a string and animal is a keyword.

Here’s another code smell. When we’re talking with other systems, especially third-party systems, we want to isolate ourselves from them. They could change. The data they give us is not necessarily in the structure that we want it.

Here is an example. This is an API I use. This is actually 14 screens tall. It’s JSON, but I turned it into EDEN. This is something I had to use. Whenever I’d be at the REPL, like, “What keys do I have? Where did they store the title of this thing?” It was three things deep. It was a pain.

I went through and I re-factored it. I figured out this is is the stuff I actually need. It’s very small, fits on a slide. A few of these things are just taken out directly. Sometimes, I re-named the key. Sometimes, I had to dig deep to get one of these things out. Sometimes, I actually had to do a little bit of calculation. I combined two keys, two values into one value.

There it is. Now, this is something stable that my code can rely on. I just have this one little layer of indirection. This one little translation from what the API gives me to what I let into my system that I can trust. Before, what I was doing, was everywhere I needed the thing,

I would just write some little code that knew about the structure of this JSON that I was getting back. It was turning into a mess so I did this.

Here’s my concluding slide. The main thing I want to drill home is know what level of meaning you are at when you’re coding. Are you treating it like a hash map? That’s fine. That might be the right thing. Or are you working the domain level? If you’re treating it like a domain level, don’t use just assoc, or whatever. You should be using an operation that has a name that has meaning.

We want to look for these semantic layers and we don’t want this deep paths. We don’t want to cross into…For instance, in a person, you don’t want to be talking about the training record. You don’t want the person to have to know the structure of that training record.

We want to organize these things so that we’re not just adding keys willy-nilly all around the code. They should be put into a central place where that defines the thing. Combining operations are so important. Because we can, we tend to just start reaching into data, doing stuff inline wherever we are, combining, do some math on it and then, boom, we got our answer.

What does that mean? Can it have a name? Is it possible that you did some complex operation with combining two things that really should be its own operation semantically? Put some gap, some margin, some indirection between third party systems and yours. I like using constructors.

Then use good names. You should be able to have a small number of operations for each of your little entities that have semantic meaning.

Thank you very much. My name is Eric Normand. You can find me on the Internet, lispcast.com, also purelyfunctional.tv. Follow me on Twitter. You can find me in LinkedIn.

While we’re here, I’d love to get to know all of you. Thank you very much.

[applause]

Eric:  We have a microphone up here. Oh, and back there.

[pause]

Audience Member:  I was just curious if you’ve come across libraries in the Clojure ecosystem where it achieved something along the lines of lenses in Haskell, which solve a similar type of problem? Did you come across something like that?

Eric:  Specter is very close to lenses. When I first heard the talk, I thought it was a very impressive system, but for a problem that I didn’t experience.

He’s a very smart guy — Nathan Marz, the guy who wrote Specter — and so he must have this problem. He spent a lot of time on Specter. Check it out if that’s what you’re looking for, but I prefer to avoid that problem, not deal with nested stuff so much.

Someone once told me the issue is that people are making these really big…If you thought about it in types, that people are making these really big types. They should be thinking in terms of small types. Even a list, you think it can be infinite, but the type is small. It just has a head and a rest; a first and a rest. It’s just a cons cell, and you can make a whole list out of that.

You should be thinking in these small pieces that compose together instead of this is all the stuff I have, so I’ll put it in one big type.

The post You are in a maze of deeply nested maps, all alike [TALK] appeared first on LispCast.

07 Feb 18:57

Spotify Acquires Podcast Producer Gimlet Media and App Maker Anchor

by John Voorhees

Rumors have been circulating for several days that Spotify was in talks to acquire podcast producer Gimlet Media. Today, Spotify announced officially that it is not only acquiring Gimlet but also Anchor, the company that makes mobile apps for podcast creation.

Terms of the deals were not disclosed, but Recode’s sources say the Gimlet deal is in the neighborhood of $230 million. Although Recode hasn’t reported on the value of the Anchor deal, it also says that Spotify expects to spend up to $500 million this year on podcast acquisitions.

The two deals are part of a broader strategy by Spotify to offer audio content beyond music and use original content to entice people to sign up for its streaming service. In a blog post today, Spotify CEO Daniel Ek elaborated on the company’s strategy:

With the world focused on trying to reduce screen time, it opens up a massive audio opportunity.

This opportunity starts with the next phase of growth in audio — podcasting. There are endless ways to tell stories that serve to entertain, to educate, to challenge, to inspire, or to bring us together and break down cultural barriers. The format is really evolving and while podcasting is still a relatively small business today, I see incredible growth potential for the space and for Spotify in particular.

In just shy of two years, we have become the second-biggest podcasting platform. And, more importantly, users love having podcasts as a part of their Spotify experience. Our podcast users spend almost twice the time on the platform, and spend even more time listening to music. We have also seen that by having unique programming, people who previously thought Spotify was not right for them will give it a try.

Although the Gimlet purchase comes as no surprise following days of speculation, it’s fair to say no one saw the Anchor deal coming. Spotify has grown quickly in the two years that it has offered podcasts and now has the second largest podcast platform behind Apple. By purchasing Gimlet and Anchor, Spotify gains a stable of popular, professionally-produced podcasts as well as the means for anyone with a smartphone to record and share a podcast, covering a broad spectrum of the podcasting world with just two acquisitions.

Ek believes Spotify can bring the same value to podcasting that the company has brought to music:

Just as we’ve done with music, our work in podcasting will focus intensively on the curation and customization that users have come to expect from Spotify. We will offer better discovery, data, and monetization to creators. These acquisitions will meaningfully accelerate our path to becoming the world’s leading audio platform, give users around the world access to the best podcast content, and improve the quality of our listening experience while enhancing the Spotify brand.

To be clear, this doesn’t make music any less important at Spotify. Our core business is performing very well. But as we expand deeper into audio, especially with original content, we will scale our entire business, creating leverage in the model through subscriptions and ads. This is why we feel it is prudent to invest now to capture the opportunity ahead. We want Spotify to continue to be at the center of the global audio economy.

Although Ek hints in his blog post that podcasts are just the start of Spotify’s audio ambitions, what remains to be seen is how podcasts fit within Spotify’s business model. Spotify has studied video streaming and could follow suit making Gimlet’s podcasts like Reply All and other original content available only as part of a Spotify subscription. Spotify also says it will offer ‘monetization for creators,’ which could mean many different things including dynamic ad insertion in podcasts offered on its platform. Whatever approach Spotify takes with podcasting, the coming year will certainly be an interesting one for podcast creators and fans alike.


Support MacStories Directly

Club MacStories offers exclusive access to extra MacStories content, delivered every week; it's also a way to support us directly.

Club MacStories will help you discover the best apps for your devices and get the most out of your iPhone, iPad, and Mac. Plus, it's made in Italy.

Join Now
07 Feb 18:40

Twitter Favorites: [TeamUfYH] Periodic reminder that OCD is an actual mental health disorder and not a funny personality quirk. It doesn’t mean s… https://t.co/QbolvxIgOz

Unfuck Your Habitat @TeamUfYH
Periodic reminder that OCD is an actual mental health disorder and not a funny personality quirk. It doesn’t mean s… twitter.com/i/web/status/1…
07 Feb 18:40

Twitter Favorites: [bmann] I’m obviously fully down the rabbit hole, but I see decentralized web tooling as making this possible. Multiple pl… https://t.co/TqMpm2ahfl

Boris Mann @bmann
I’m obviously fully down the rabbit hole, but I see decentralized web tooling as making this possible. Multiple pl… twitter.com/i/web/status/1…
07 Feb 18:40

Twitter Favorites: [RobCottingham] Just me launching a new podcast about speaking and speechwriting tomorrow at 11 am Pacific. There will be cake.*… https://t.co/l55xCEMYse

Rob Cottingham @RobCottingham
Just me launching a new podcast about speaking and speechwriting tomorrow at 11 am Pacific. There will be cake.*… twitter.com/i/web/status/1…
07 Feb 18:37

Twitter Favorites: [raymondcamden] @sillygwailo The last few times I've used the Twitter API I've dreaded the approval process. Once my app was never… https://t.co/JjerKuL6lt

Raymond Camden @raymondcamden
@sillygwailo The last few times I've used the Twitter API I've dreaded the approval process. Once my app was never… twitter.com/i/web/status/1…
07 Feb 18:37

Twitter Favorites: [knguyen] pic of me interviewing for a job at The Verge https://t.co/tRjP9OtXN9

Kevin Nguyen @knguyen
pic of me interviewing for a job at The Verge pic.twitter.com/tRjP9OtXN9
07 Feb 18:37

Twitter Favorites: [humantransit] @schmangee The nonsense word here is network, which reflects the underlying belief that communications networks som… https://t.co/ByqLoVJQBw

Jarrett Walker @humantransit
@schmangee The nonsense word here is network, which reflects the underlying belief that communications networks som… twitter.com/i/web/status/1…