Shared posts

29 Jun 15:00

JavaScript API for Face Recognition in the Browser

files/images/Big_Bang_Faces.PNG

Vincent Mühler, ITNext, Medium, Jul 16, 2018


This is documentation of a script you can use on your website to classify and recognize faces. Though it's based on recognition of faces on photos, the obvious application of this is to use it as a way to identify who is looking at your website. Of course, you would have to turn on the reader's camera (sometimes without telling them). But what could go wrong? More generally (and usefully) it's a way to use AI-supported interactivity in your website, doing much more interesting things like face recognition.

Web: [Direct Link] [This Post]
29 Jun 15:00

"The problem for anyone declaring the death of liberalism is that it has not one but several pillars..."

“The problem for anyone declaring the death of liberalism is that it has not one but several...
29 Jun 15:00

Eine Woche mit dem BlackBerry KEY2

by Volker Weber

IMG 3766

Wenn ich das BlackBerry KEY2 kurz beschreiben müsste, würde ich sagen: "Kleines Android-Handy mit Tastatur unten dran". BlackBerry Mobile sagt: "An Icon Reborn". Das Icon soll der BlackBerry Bold 9900 sein, eine Maschine aus einer anderen Zeit. Eine Zeit, in der Handys kompliziert waren, schlechte Tastaturen hatten und nichts konnten. Und in der das iPhone gerade anfing, alles aufzumischen. Der Bold war optimiert auf geringen Datenverbrauch und Email.

Diese Zeit kommt nicht mehr zurück. Smartphones können alles, Tastaturen sind super, und Email ist auch nicht mehr das, wonach der Handybesitzer giert. Was bleibt, ist die Tastatur. Manche schwören auf diesew Mäuseklavier und ich beherrsche es "im Schlaf". Allerdings bin ich mittlerweile auf einer iPhone-Tastatur schneller. BlackBerry redet auch nicht von Geschwindigkeit sondern Präzision.

Android Oreo 8.1 ist an Bord, relativ naturbelassen und dazu eine Tonne eigener BlackBerry-Software, die ich nicht als Last empfinde. Darunter sehr clevere Sachen wie der Privacy Shade, der den Bildschirm bis auf einen kleinen verschiebbaren Schlitz verdunkelt, fals der Sitznachbar einen langen Hals macht. Darin enthalten der Redactor, mit dem man den Bildschirminhalt mit schwarzen Balken zensieren kann, bevor man einen Screenshot macht. Ein Password Keeper passt auf Passwörter auf, ein Locker schließt Privates hinter Passwort oder Fingerabdruck weg. Die Kamera hat zwei Auslöser: den normalen und die Leertaste für private Bilder. So werden sie sortiert, bevor die Cloud sie abgreift. Dazu gibt es DTEK, eine Software, die aufpasst, dass die Sicherheitseinstellungen stimmen und die Alarm schlägt, wenn Apps zu viel herumfummeln. Das finde ich alles sehr charmant. Was mir persönlich weniger nützt, ist der Hub, der das ganze digitale Leben in einem Stream vereint. Email, Slack, Social Networks, alles bunt gemischt. Kann man nutzen, muss man aber nicht. Und BBM, tja.

Die Hardware kann was. Schlank, eckig und griffig, solide. Kleiner 4.5" Bildschirm in 3:2 Format, vorne eine 8 MPixel-Kamera, hinten zwei mit 12 MPixel, wegen Zoom und Portraitmodus. Bei viel Licht ist die Kamera toll, der Bildschirm weniger. Bei wenig Licht ist es umgekehrt. USB-C, Mono-Lautsprecher, Mono-SIM, eine Kopfhörer-Buchse!

KEY2 ist wie zwei KEYone: Viel schneller, doppelt so viel RAM (6 statt 3 GB), doppelt so viel Speicher (64 statt 32 GB). Die selbe 3500 mAh-Batterie. Mit 4.5" Bildschirm und SD660 Chipset hat sie leichtes Spiel. Zwei Tage sind drin, ein Tag immer. Mit Quickcharge 3.0 ist sie ruckzuck voll.

Eigentlich alles super. Wenn da nicht der Preis wäre. 650 Euro soll das schöne Stück kosten. KEYone und Motion sind mittlerweile beide unter 400 Euro angekommen. Da gehört der Preis auch hin. Wer 650 Euro in der Hand hat, der hat viele Alternativen, die mehr drauf haben. Pixel 2, Galaxy S9, Huawei P20 Pro, OnePlus 6. Für viel weniger Geld gibt es Motorola Z3 Play mit dickem Akku huckepack oder Nokia 7 plus.

BlackBerry Mobile hält das "sicherste Android" dagegen. Wenn es darum geht, kauft man gleich ein iPhone 8. Das kostet in etwa das Gleiche, wird "ewig" mit Softwareupdates versorgt und kann rundum mehr. Und genau das machen zum Leidwesen von BlackBerry Mobile auch viele Unternehmen.

29 Jun 15:00

Photo of PEI's First Webserver

by peter@rukavina.net (Peter Rukavina)

My friend Simon, engaging in some admirable proactive librarianship, passed along a clipping from the July 23, 1993 edition of The Guardian with a story headlined “Crafts Council going high tech,” concerning the post I’d started 5 months previous to harvest data about crafts supply sources for Island crafts producers.

I’m pictured in my tiny cubicle in the back of the Crafts Council’s shop on 156 Richmond Street, sitting in front of the IBM PS/2 that I used to do my work.

That computer was running Windows 3.1 at the time; within a year I’d installed Slackware Linux, and it became the server that powered Prince Edward Island’s first website. As far as I know, this is the only photo ever taken of that machine.

The Guardian, Charlottetown, Friday, July 23, 1993 (page 5)

29 Jun 14:55

The Coming Software Apocalypse | James Somers

The Coming Software Apocalypse | James Somers: “When we had electromechanical systems, we used to be...
29 Jun 14:55

Audio Hijack 3.5 Adds the Ability to Broadcast Audio

by Paul Kafasis

Today, we’ve got a big (and free!) update to our popular audio recording utility Audio Hijack. Audio Hijack 3.5 is all about internet radio streaming, with a brand new Broadcast output block that makes it possible to send any audio to Shoutcast and Icecast servers. It’s perfect for running livecasts of podcast recordings, as well as live streaming DJ sets, and powering all types of internet radio streams.

Broadcasting In Action

If you’re already using Audio Hijack to record audio, broadcasting will be a snap as well. Adding a Broadcast block to your audio chain makes it possible to take what Audio Hijack is pulling in, and send it to an MP3 or AAC streaming server, allowing listeners around the world to tune in. Have a look:

This simple chain is pulling audio from iTunes and a microphone, recording it, then passing it out to an external server. It’s simple, straight-forward, and tremendously powerful. Of course, the new Broadcast block offers plenty of features for broadcasting experts to appreciate. Let’s go to the bullet-point list!

Multiple Server Types

Stream to Shoutcast 2, Shoutcast 1, and Icecast 2 streaming audio servers. Broadcast can even automatically detect your server type.

MP3 and AAC Streaming

With Broadcast, you can stream in either the popular MP3 streaming format, or the more modern AAC streaming format.

Intelligent AAC+ (HE-AAC) Streaming

If you’re streaming AAC, Broadcast will automatically work to achieve the best quality for a given bitrate by switching to the superior-sounding HE-AAC when possible.

Powerful Track Titles

The Broadcast block can be configured to automatically read track titles from supported sources, then embed them in your stream for listeners to see. It’s also possible to manually add and update track titles, as you broadcast.

Multi-Broadcast Support

Using multiple Broadcast blocks in one session, you can stream a high and a low quality broadcast, or in multiple audio formats. You can even easily copy server settings between blocks, with Audio Hijack’s powerful Presets feature.

We’ve also created a new Template to help get you started with an Internet Radio broadcast. You can find the “Internet Radio” template in Audio Hijack’s Template Chooser. Just click “New Session” to select the template (or any of our other templates), and start experimenting!

The new Broadcast block will open up many additional uses for Audio Hijack, and we can’t wait to see (and hear) how folks make use of it!

Another New Block

As a result of beta tester feedback, we’ve also added a second new block to Audio Hijack 3.5: the Input Switch block. With an Input Switch, you can toggle from input A to input B (and back) with one click. This can be useful for broadcasting, but it’s also handy for easily testing audio effects, and more.



Input Switch in action

In the setup above, introductory music for a livestream is being played from iTunes, while the mics are not yet heard. Switching between sources is just a matter of clicking the switch. The source will fade from A to B, and the co-host’s microphone audio will be heard, while iTunes is not.

Get Audio Hijack 3.5 Today

Audio Hijack 3.5 is a free update for all current owners of Audio Hijack 3. Just select “Check for Update” from the Audio Hijack menu to move up to the latest.

While Audio Hijack 3 originally shipped way back in 2015, users of any older version of Audio Hijack or Audio Hijack Pro are still eligible for a discounted upgrade to version 3!

And if you’re entirely new to Audio Hijack, there’s no time like the present to see what you’ve been missing. Visit the Audio Hijack page to learn more, and download the free trial.


A Note for Nicecast Users

Current and former users of our now-retired broadcasting tool Nicecast should make sure to read this secondary post. It’s full of a wealth of additional information on broadcasting in 2018 and beyond, as well as tips on moving your broadcasting setup to Audio Hijack, and an exclusive discount.

29 Jun 14:54

Migrating Your Broadcast From Nicecast to Audio Hijack

by Paul Kafasis

As you may already know, our internet radio broadcasting app Nicecast was retired back in February. When we made the difficult decision to end development of the app, we knew it would pain users who still relied on Nicecast to power their Internet broadcasts. To help both those users, as well as others looking to stream online, we set out to provide a more modern solution for creating internet radio broadcasts.

Today, we’ve released Audio Hijack 3.5, which includes powerful new broadcasting functionality. Using the new Broadcast block, you can broadcast to Shoutcast and Icecast streaming servers right from within Audio Hijack.

At this time, we strongly encourage all Nicecast users to migrate to a modern Audio Hijack setup for broadcasting. Read on for more details.

Broadcasting Basics

Whether you’re new to Audio Hijack or a long-time user, you’ll be able to get started broadcasting with ease. Audio Hijack’s intuitive audio grid provides a pipeline-style view to show exactly how audio is flowing. By adding the new Broadcast block, any audio chain can now send audio to a Shoutcast or Icecast streaming server.

Above, you can see a very basic broadcasting setup. Audio is being pulled in from two sources: a USB microphone and iTunes. It’s then passed on to a remote server, via Broadcast. Audio chains can be much more complex than this, including audio effects, recorders for archiving your broadcast, and more, but even this basic chain will stream audio out.

Configuring the Block

To set up the Broadcast block, you just need to enter your server information in the “Setup” tab, and you’ll be ready to connect.

Once you’ve got the block configured properly, your broadcast will be triggered by running the session in Audio Hijack. As soon as you start your session, the Broadcast block will connect to your remote server and begin streaming.

After downloading Audio Hijack, you should be able to recreate your old Nicecast setup in just a few minutes. Of course, if you have questions or need assistance, our top-notch support team is here to help.

Audio Hijack’s Many Improvements Over Nicecast

Streaming with the new Broadcast block in Audio Hijack offers many advantages over Nicecast. Here are just a few of the improvements and enhancements you’ll find upon migrating your broadcasting setup to Audio Hijack.

Shoutcast 2 support

While Nicecast could only work with Shoutcast 2 servers in their Shoutcast 1 compatibility mode, the new Broadcast block has full support for Shoutcast 2 servers.

AAC Streaming

In addition to standard MP3 streaming, the new Broadcast block can also stream in AAC/AAC+ (HE-AAC) format. When streaming AAC, Broadcast automatically switches to the superior-sounding HE-AAC whenever possible.

Send to Multiple Servers at Once

By placing multiple Broadcast blocks in one Audio Hijack session, you can create multiple streams for multiple servers. It’s a snap to stream your audio at multiple qualities or in multiple audio formats.

Track Titles

We’ve overhauled and improved the track titles system which originated in Nicecast. You can now select supported application sources to automatically have their information embedded in the stream for listeners to see. You can also customize the exact display, and even manually enter track titles in real time as you broadcast.

A Beautifully Designed Interface

Audio Hijack’s pipeline shows you exactly how your audio is flowing through the app. With an easy-to-understand view of your broadcast, complex audio processing with effects and more is now simpler than ever.

Fully Accessible

Due in large part to its advanced age, Nicecast had some unfortunate holes in its accessibility, particularly when it came to using to audio effects. Audio Hijack is fully accessible, and great for our visually impaired users. It’s even been awarded a Golden Apple by the AppleVis community, recognizing great and accessible applications.

Audio Hijack will make a fantastic replacement for your older Nicecast setup, and we hope you’ll try it today. Read on for details on making the move to Audio Hijack.

Moving to Audio Hijack

Nicecast is no longer in development, having been retired earlier this year. The last version of Nicecast (v1.11.13, available from our Legacy page) works as expected on MacOS 10.13 (High Sierra) and lower, and should continue to work there indefinitely without needing updates. However, it’s very likely it will experience issues running on the forthcoming MacOS 10.14 (Mojave). Further, due to changes made by Apple, the app will not run at all on MacOS 10.15 and up.

Given the above, we strongly encourage all active users of Nicecast to move to Audio Hijack. Audio Hijack is fully supported and in active development, with frequent updates. The app offers nearly all the functionality Nicecast had1, with many additional features and improvements as described above.

If you already own Audio Hijack, just grab version 3.5 (or higher), and get started. This is a free update for owners of Audio Hijack 3, and re-creating your setup should be quick.

If you’re a Nicecast user who doesn’t yet own Audio Hijack 3, we’re providing an exclusive discount to make this transition easier. With your valid license for Nicecast, you can save $20 off the purchase of Audio Hijack. To access your exclusive discount, just click this button:

Act now, as this offer is only available through the end of 2018.

We’re excited to see how folks take advantage of Audio Hijack’s new broadcasting ability, and former Nicecast users are sure to be a big part of that. We hope to hear you using Audio Hijack to broadcast soon!


Footnotes:

  1. There is one difference between the old Nicecast application and the new Broadcast block which must be noted. The Broadcast block does not offer a built-in server, as Nicecast did. We know that the majority of Nicecast users were already using an external server, so this will only affect a minority of folks migrating to Audio Hijack.

    If you were previously using Nicecast’s built-in server, however, you’ll need to find remote hosting in order to broadcast. See this knowledge base article for several good options. The more technically inclined can also self-host Shoutcast or Icecast, right on their own server. ↩︎

29 Jun 14:54

OnePlus Software Maintenance Schedule Outlines Two Years of Software Updates, Three Years of Security Patches

by Evan Selleck
OnePlus has made a decision to put software at the forefront of its efforts with its smartphones, and, as a result, has outlined how it plans on improving the update process for its devices out in the wild. Continue reading →
29 Jun 14:54

I'm also blogging over at the Job Garden blog

It's been a little quiet on this site lately. A bunch of my writing energy has been going into weekly posts on the Job Garden blog.

Job Garden is a new kind of social job board. I started building it because I know a bunch of great startups, and I want to help them with their hiring. It's a real scratch-my-own-itch kind of thing. Right now on my personal job board there are 38 open roles at 12 companies, and you can check them out here.

It's only 12 weeks old. I try to add something to it every week. So this week: somebody other than me has created a job board. Last week: I launched weekly email updates of new jobs. The week before that, the ability to focus down on just London jobs.

It's super simple (the tech is entirely within my comfort zone), there's zero visual design, in terms of stage it's like pre-pre-alpha, and it's fun to stretch these muscles that haven't had a workout in a long ol' while.

The weekly posts can be a bit rambly, and occassionally stray into the realm of "half-thought-through opinions about code" which, who knows, might be entirely up your street.

To read from the beginning, the blog has a weeknotes categories.

29 Jun 14:54

Clojure Error Messages are Accidental

by Eric Normand

I’ve recently shifted my thinking about Clojure error messages. It is more useful to think of them as non-existent than to think of them as bad. We end with the role Spec can play in improving error messages. 

I have the good fortune of helping many people learn Clojure. One of the most common complaints is the bad error messages. I have been looking for different ways to improve the error messages for beginners. I’ve tried better stack trace printers. I’ve tried implementing some prototype solutions to catch bad arguments to functions. I’ve been looking at other languages, particularly Elm, for inspiration. I’ve also just been exploring how error messages are actually implemented in Clojure. What I’ve discovered has been kind of surprising. I have a completely new perspective on error messages in Clojure, and I want to share that with you.

Before I go on, I want to make something clear: Clojure error messages are bad. They make it harder for beginners. I don’t think anyone really argues with that. I like Clojure and think it’s well designed in general. I wanted to figure out what was going on with error messages.

It will be important to distinguish between the error messages and the stack traces. The stack traces are those horribly long printouts you get when you get an exception thrown. It’s one of those cases where Clojure is relying on the host platform. That’s just what JVM stack traces look like.

The worst sin of stack traces is that the most important information is printed first, then followed by less and less important information, usually a few screenfuls of it. In essence, the stack traces are printed backwards in the terminal. You have to scroll way back, looking for the beginning of the trace. The default stack traces are ergonomically difficult.

The second worst sin is that lots of details from Clojure’s implementation is included in the stack trace, making them longer and noisier, and, frankly, more intimidating. Both sins suck. I lived with them for years. And they are easily solvable. I happen to use and like Pretty, which reverses the stack trace and filters out noise.

But both of these sins combined are not as bad as the Exceptions themselves. Let’s dig into those.

There are actually two major types of errors in Clojure. There are compile-time errors and run-time errors. Compile-time errors are things like syntax errors, unresolvable symbols (missing variables), and errors during macro expansion. These errors tend to be decent, on average. The Exception type makes sense and the error message points to the problem.

(f)
;; throws clojure.lang.Compiler$CompilerException: 
           java.lang.RuntimeException: 
              Unable to resolve symbol: f in this context, compiling:(*cider-repl pftv*:2780:15)

It’s not beautiful, but it’s acceptable. Some Clojure macros had incomprehensible error messages, but that seems to have gotten better. It used to be:

(defn foo a)
;; throws IllegalArgumentException:
            Don't know how to create ISeq from clojure.lang.Symbol, compiling:(*cider-repl pftv*:2780:15)

It seems like Clojure just assumed the parameter list was a vector and tried to iterate over it. Now (Clojure 1.8 even) it’s much nicer:

(defn foo a)
;; throws java.lang.IllegalArgumentException:
            Parameter declaration "a" should be a vector

Runtime errors, on the other hand, are not as good. There has never seemed to be any consistency to them. The Exception type is sometimes correct, but sometimes it seems to have nothing to do with what I am doing. The error messages rarely describe the actual problem. Here’s an example where the error message is just wrong:

(def my-val 1)
@my-val
;; throws java.lang.ClassCastException: 
            java.lang.Long cannot be cast to java.util.concurrent.Future

Who said anything about a Future? Why is Clojure bringing that up? You don’t know how many times I’ve looked for Futures in my code, only to realize I had a stray @ somewhere.

And what’s more, very often, no error is thrown at all. Maybe nil is returned, or some other unexpected value. Here’s an example:

(keyword 5)   ;=> nil
(keyword nil) ;=> nil

That’s not very helpful. Try passing different types to keyword to see what happens. Wouldn’t you expect an error?

Before I started exploring, these behaviors seemed lazy and neglectful. However, they have been something I’ve learned to live with. Sometimes the error is something I’ve seen before. But more frequently, I don’t even read the error message. I work in small increments. Any error must be somewhere in the code I just wrote. I didn’t pay much attention to error message design until I started exploring it more.

Through that exploration, I’ve realized that it’s not so much that Clojure’s errors are bad. It’s more that they’re accidental. Clojure’s core functions are, for the most part, implemented without checks on the arguments. They only code the “happy path”. They assume that the arguments are of the correct type and shape, and proceed without caution. When they do explicitly throw an Exception, it’s deep inside a conditional where there clearly isn’t a way to proceed.

What happens if they’re not correct? That’s up to chance. Sometimes you get an Exception from something that does implicitly check its arguments. For example, trying to call any method on nil will throw an Exception. And numeric functions will die on non-numbers. But sometimes, after trying all of the tests in a conditional, the conditional fall through to nil. That’s what happens with keyword. It appears that it worked, when nothing was done at all, and nil is returned.

I’ve come to believe that Clojure’s errors aren’t bad by design. No, it’s something totally different. Clojure’s errors are actually missing.

We’re used to languages doing runtime argument checks. One robust way to implement checks is to implement them in the most central core of the language. Then you build new functions on top of that core. Those new functions can choose to check their own arguments and throw meaningful errors, or rely on on the underlying core’s errors if they’re sufficient (or you’re lazy). It’s a systematic way to ensure that bad runtime behavior throws an error. Even a language like JavaScript will eventually bottom out with “undefined is not a function” (meaning method not found) or a null pointer exception. Even if the errors are bad like JavaScript’s, at least they exist. That’s one way to do it, but that’s not what Clojure does.

What has Clojure done?

Clojure, in typical “de-complecting” style, has separated out the implementation of a function from enforcing the preconditions of that function. We have the implementations, which are the “happy paths”. What is missing–and has always been missing–are the preconditions. It’s almost as if Clojure’s functions’ implementations assumed some kind of external check on their arguments would happen.

Enter Spec. Spec is that external check. Spec is not there to make the error messages better, as is widely believed. Spec is there to have error messages at all. Since the runtime error messages you see are accidental, any consistently applied error checks will be beneficial. Once we have error messages, we can begin the work of making them better.

Speculation

There’s a concern that Spec may make error messages worse, and those concerned point to some macros’ error messages where it actually did get worse once the macros were Specced. This is a valid concern. However, I believe that it is far worse to have accidental error messages (like we have now) than consistent error messages, even if they’re bad. Spec’s messages may be bad (I don’t like them that much; they remind me a lot of Haskell’s type error messages), but they will cover the core functions of the language. Functions that call those will also get error messages. I used to be skeptical of the benefit of Spec, but now I’m looking forward to its release.

I think Spec is going to surprise us. Once Clojure’s core functions are specced, we will be surprised by how much of our code violates the assumptions of the functions we use, but somehow worked anyway by accident. For instance, I can imagine nils flowing through functions like get that seem to tolerate them and returning nil themselves. Since nil is a valid return from get, we handle it and it may work out. But is nil really a valid argument to get? Probably not, and that would be reflected in the Spec. We’ve probably got a lot of code like that. When we turn on Spec instrumentation and run our tests, we’ll have to face all of these violated assumptions that happened to work. There will be many errors in our existing code.

Even those of us who have worked in Clojure for a long time will have to internalize those assumptions. We’re not used to a pre-condition checks. We’re used to thinking of Clojure’s functions as loose and dynamically typed. Before we internalize the logic of Spec, we will write code that doesn’t pass the spec the first time. We will be like beginners. And some may not like the language that it will have become because it will be picky in unfamiliar ways. Lucky for them, they can completely turn it off. But we will be better off with instrumentation on.

I think we will be equally surprised by how simple the types are. For example, it’s easy to see clojure.set/union as a really complex function. It takes two collections and returns a new collection with all of the elements of both collections. However, sometimes the type it returns is from the first argument, and sometimes from the second argument, depending on which one is bigger. That’s so complicated.

(clojure.set/union #{0} [1 2 3 4])   ;=> [1 2 3 4 0]
(clojure.set/union #{0 1 2 3} [4])   ;=> #{0 1 4 3 2}
(clojure.set/union '(0 1 2 3 4) [5]) ;=> (5 0 1 2 3 4)

When we first use union, we are trying to apply rules that make sense in other areas of Clojure. Shouldn’t the arguments be coerced to Sets, like all collections are coerced to seqs in the sequence functions? Or shouldn’t it really always use the type of the first argument, like in protocol methods? And there can’t be something wrong with the types, otherwise it would have thrown an error, right?

But these rules don’t apply. All of the union calls above are wrong. The fact that they do anything at all is an accident. The type of clojure.set/union is so simple. It simply assumes all of the arguments are Sets. If that’s true, it will always return a Set. In Haskell, you’d say Set -> Set -> Set. And that type does work with Clojure’s union. We can predict that Spec will choose exactly that type. Most experienced Clojure programmers will agree to that. So what was once complex behavior will be replaced by simple behavior or an error message.

But I think there will be some cases where we don’t agree, or at least we will have to rebuild our understanding.

Finally, there will be times when speccing a function will inform the implementation. Currently, the type for clojure.core/nth is quite complicated. There are eight different types that it can take. And there’s no nice abstraction that covers them all. I mentioned this on Twitter and Alex Miller pointed out that we might need a new notion here, perhaps called nthable?, which would simplify the spec.

The least obvious consequence of my new perspective (that we are adding error messages where none really existed) is that we have an opportunity to correct some mistakes in the implementation. For example, should you really be able to get out of anything?

(get (java.io.File. "hello.txt") :foo) ;=> nil

Does that make any sense? Is that the expected behavior? Maybe we should stop wondering about the expected behavior when you pass in garbage input, and talk instead about the expected input. Spec will let us talk about that.

Maybe Rich has learned a lot since a lot of these functions were defined ten years ago and he wants to use the release of Spec as a way to correct those mistakes without breaking backwards compatibility. Or maybe the core specs will be extremely conservative. It wouldn’t surprise me either way. But if the official spec doesn’t restrict get, Spec will let people redefine the spec for get for themselves. They can choose whatever subset of the type they want. I can imagine many companies adopting strict specs that catch bugs they find in their code, like some companies release their linter configs today.

In fact, you can do this right now in your code. If get is a source of bugs for you, define a spec for it, instrument, and run your tests.

Finally, this new perspective has helped me understand Cognitect’s stance on the error message issue. People have been complaining about error messages for years, and the response from Cognitect has been alienating. Perhaps I’m dense, but it hasn’t been until I made this mental shift that I’ve understood some of what they’re getting at.

Conclusions

I’m finding it useful to see Clojure error messages as missing. In practice, they’re still bad, but this perspective helps me understand why and gives Spec more meaning. Clojure’s core specs, where every function has a spec, will finally give us error messages. However they are, they are better than what we have now. Will core specs also uncover lots of problems in our existing code? Will core specs change our understanding of the difference between runtime behavior and valid input? Who knows. But I’m looking forward to a release of clojure.core.specs. It will contain lots of insights into Rich’s design and about how to best understand Clojure. And once we have error messages, we can finally begin the work of making them better.

The post Clojure Error Messages are Accidental appeared first on LispCast.

29 Jun 14:52

The Best Bluetooth Headset

by Marianne Schultz and Daniel Varghese
The Best Bluetooth Headset

After 80-plus hours of researching headsets and testing more than 18 models over the past few years, including testing three new models over 20 hours for the latest update, we’ve determined that the Plantronics Voyager 5200 is the best mono Bluetooth headset for making and taking calls, whether you’re in a quiet office or a noisy coffee shop. The Voyager 5200 offers the most comfortable and secure fit and the best dedicated call-management controls of the headsets we tested. It also has better mic quality than stock earbuds or most Bluetooth earbuds, plus battery life that can last most of a workday.

29 Jun 14:52

Trying Out Spatialite Support in Datasette

by Tony Hirst

A recent datasette release included improved support for the SpatiaLite geo-extensions for SQLite, so to complement some other bits of geo-tinkering I’ve been doing lately – and which I still need to blog – I thought I’d give it a spin.

The write up is in a Jupyter notebook which you can find here and which is embedded in markdown export format below:

SpatiaLite Datasette Demo

This notebook provides a quick walkthrough of getting started with a SpatiaLite geo-database and using it with Datasette.

Get the Data

The SpatiaLite database can be used to store, index and perform various geo-related query operations on various geographical objects including points and shapefiles.

To help me get up to speed, I’m going to try to load in a shapefile delimiting various bits of the UK into a SpatiaLite database, publish it as a datasette, retrieve a boundary for a particular region from the datasette API and then plot the boundary on a map.

The shapefile I’m going to use is of UK administrative areas described by the Ordnance Survey Boundary-Line product.

You can get a copy of the data from https://www.ordnancesurvey.co.uk/opendatadownload/products.html by selecting the Boundary-Line product and providing contact details, at which point you should be emailed a download link.

Download the data and unzip it. This should create a folder named bdline_essh_gb, or something similar. (The paths used in this notebook assumes that it is running inside that directory.)

Inside the bdline_essh_gb ditectory is a Data subdirectory, and inside that is a GB subdirectory containing a variety of unpacked shapefiules, including bit not limited to:

district_borough_unitary_region.dbf parish_region.shp
district_borough_unitary_region.prj parish_region.shx
district_borough_unitary_region.shp scotland_and_wales_const_region.dbf
district_borough_unitary_region.shx scotland_and_wales_const_region.prj
district_borough_unitary_ward_region.cpg scotland_and_wales_const_region.shp
district_borough_unitary_ward_region.dbf scotland_and_wales_const_region.shx
district_borough_unitary_ward_region.prj scotland_and_wales_region.dbf
district_borough_unitary_ward_region.sbn scotland_and_wales_region.prj
district_borough_unitary_ward_region.sbx scotland_and_wales_region.shp
district_borough_unitary_ward_region.shp scotland_and_wales_region.shx
district_borough_unitary_ward_region.shx

Loading Shapefile Data into SQLite

The datasette docs currently suggest creating a SpatiaLite database using a command of the form spatialite DATABASE.db and then loading shapefiles into it using a SpatiaLite commandline command of the form: .loadshp SHAPEFILE TABLENAME CP1252 23032.

That bit of voodoo actually unpacks a bit further as:

.loadshp PATH_AND_SHAPEFILE_NAME TABLENAME FILE_ENCODING [PROJECTION]

The CP1252 file encoding is for the default Microsoft Windows Latin-1 encoding, so I’m guessing that if your shapefile use another encoding you need to change that. (Internally, SpatiaLite uses UTF-8. UTF-8 is also acceptable as a file encoding value in the above commandline command; a full list of acceptable values can be found by trying to load a shapefile using spatialite_gui.) The file encoding is a required argument, as are the path to the shapefile name and the table name. The projection is optional.

The projection relates to the projection used within the shapefile. Setting this correctly allows you to transform the data to other projections, such as the WGS84 (aka EPSG:4326, GPS, latitude / longitude) projection.

The projection is identified using its SRID (Spatial Reference System Identifier) code (lookup). If no code is provided, no projection is identified with the shapefile geodata in the database (it’s give a -1 code). (I had expected the projection to be identified from the .prj (projection) file which contains a WKT description of the projection used in each .shp shapefile.)

I didn’t meet with much success looking for a Python library to identify the required SRID from the Ordnance Survey shapefiles, but did find an online API that seemed to do the trick:

#Load in the shapefile projection details
with open('./Data/GB/district_borough_unitary_region.prj', 'r') as myfile:
  prj=myfile.read()
prj

‘PROJCS[“unnamed”,GEOGCS[“unnamed”,DATUM[“D_OSGB_1936”,SPHEROID[“Airy – 1848”,6377563,299.319997677743]],PRIMEM[“Greenwich”,0],UNIT[“degree”,0.0174532925199433]],PROJECTION[“Transverse_Mercator”],PARAMETER[“latitude_of_origin”,49],PARAMETER[“central_meridian”,-2],PARAMETER[“scale_factor”,0.999601272],PARAMETER[“false_easting”,400000],PARAMETER[“false_northing”,-100000],UNIT[“METER”,1]]’

#Look up the correpsonding SRID
import requests

#http://prj2epsg.org/apidocs.html
params = {'mode': 'wkt', 'terms':prj}
r = requests.get('http://prj2epsg.org/search.json', params=params)

#Use the first hit as the most likely SRID
srid = r.json()['codes'][0]
srid
{'name': 'OSGB 1936 / British National Grid',
'code': '27700',
'url': 'http://prj2epsg.org/epsg/27700.json' }

This tells us that the co-ordinates used in the shapefile as given as OSGB Notrhings and Eastings.

Use this code value (27700) to load our shapefile in with the correct projection code:

# Load the data into a new SpatiaLite database
! spatialite adminboundaries.db ".loadshp ./Data/GB/district_borough_unitary_region adminboundaries UTF-8 27700"
SpatiaLite version ..: 4.3.0a Supported Extensions:
- 'VirtualShape' [direct Shapefile access]
- 'VirtualDbf' [direct DBF access]
- 'VirtualXL' [direct XLS access]
- 'VirtualText' [direct CSV/TXT access]
- 'VirtualNetwork' [Dijkstra shortest path]
- 'RTree' [Spatial Index - R*Tree]
- 'MbrCache' [Spatial Index - MBR cache]
- 'VirtualSpatialIndex' [R*Tree metahandler]
- 'VirtualElementary' [ElemGeoms metahandler]
- 'VirtualXPath' [XML Path Language - XPath]
- 'VirtualFDO' [FDO-OGR interoperability]
- 'VirtualGPKG' [OGC GeoPackage interoperability]
- 'VirtualBBox' [BoundingBox tables]
- 'SpatiaLite' [Spatial SQL - OGC]
PROJ.4 version ......: Rel. 5.1.0, June 1st, 2018
GEOS version ........: 3.6.2-CAPI-1.10.2 4d2925d6
TARGET CPU ..........: x86_64-apple-darwin17.3.0
the SPATIAL_REF_SYS table already contains some row(s)
========
Loading shapefile at './Data/GB/district_borough_unitary_region' into SQLite table 'adminboundaries'

BEGIN;
CREATE TABLE "adminboundaries" (
"PK_UID" INTEGER PRIMARY KEY AUTOINCREMENT,
"NAME" TEXT,
"AREA_CODE" TEXT,
"DESCRIPTIO" TEXT,
"FILE_NAME" TEXT,
"NUMBER" INTEGER,
"NUMBER0" INTEGER,
"POLYGON_ID" INTEGER,
"UNIT_ID" INTEGER,
"CODE" TEXT,
"HECTARES" DOUBLE,
"AREA" DOUBLE,
"TYPE_CODE" TEXT,
"DESCRIPT0" TEXT,
"TYPE_COD0" TEXT,
"DESCRIPT1" TEXT);
SELECT AddGeometryColumn('adminboundaries', 'Geometry', 27700, 'MULTIPOLYGON', 'XY');
COMMIT;

Inserted 380 rows into 'adminboundaries' from SHAPEFILE
========

The Northings/Eastings projection used by the OS shapefile is not directly plottable using many simple interactive web maps. Instead, they need GPS style latitude/longitude co-ordinates. Given that we know the projection of the original shapefile, we can create a new set of transformed co-ordinates using the required lat/long (WGS84) projection.

Let’s create a simple text file containing a SQL script to handle that transformation for us:

%%bash
echo '''
BEGIN;
ALTER TABLE adminboundaries ADD COLUMN wgs84 BLOB;
UPDATE adminboundaries SET wgs84 = Transform(Geometry, 4326);
COMMIT;
''' > project2wsg84.sql
! cat project2wsg84.sql
BEGIN;
ALTER TABLE adminboundaries ADD COLUMN wgs84 BLOB;
UPDATE adminboundaries SET wgs84 = Transform(Geometry, 4326);
COMMIT;

We can now read and execute that script against our database (once again, the file encoding appears to be required?)

! spatialite adminboundaries.db ".read project2wsg84.sql utf-8"
SpatiaLite version ..: 4.3.0a Supported Extensions:
- 'VirtualShape' [direct Shapefile access]
- 'VirtualDbf' [direct DBF access]
- 'VirtualXL' [direct XLS access]
- 'VirtualText' [direct CSV/TXT access]
- 'VirtualNetwork' [Dijkstra shortest path]
- 'RTree' [Spatial Index - R*Tree]
- 'MbrCache' [Spatial Index - MBR cache]
- 'VirtualSpatialIndex' [R*Tree metahandler]
- 'VirtualElementary' [ElemGeoms metahandler]
- 'VirtualXPath' [XML Path Language - XPath]
- 'VirtualFDO' [FDO-OGR interoperability]
- 'VirtualGPKG' [OGC GeoPackage interoperability]
- 'VirtualBBox' [BoundingBox tables]
- 'SpatiaLite' [Spatial SQL - OGC]
PROJ.4 version ......: Rel. 5.1.0, June 1st, 2018
GEOS version ........: 3.6.2-CAPI-1.10.2 4d2925d6
TARGET CPU ..........: x86_64-apple-darwin17.3.0

Accessing the SpatiaLite database Using Datasette

Having created our database and generated a projection approropriate for plotting using an interactive web map, let’s publish it as a datasette and then see if we can access the data from the datasette API.

Here’s a trick I just learned via a tweet from @minrk for running a simple web service from within a Jupyter notebook code cell without blocking the notebook execution:

# Example of running datasette server from inside a code cell
# via https://nbviewer.jupyter.org/gist/minrk/622080cf8af787734805d12bec4ae302
from threading import Thread

def app_in_thread():
    ! datasette adminboundaries.db --load-extension=/usr/local/lib/mod_spatialite.dylib --config sql_time_limit_ms:10000 --cors

t = Thread(target=app_in_thread)
t.start()

# Alternative multitasking package
# https://github.com/micahscopes/nbmultitask
Serve! files=('adminboundaries.db',) on port 8001
[2018-06-28 18:08:04 +0100] [91760] [INFO] Goin' Fast @ http://127.0.0.1:8001
[2018-06-28 18:08:04 +0100] [91760] [INFO] Starting worker [91760]

We should now be able to access the datasette API.

#What region shall we search for a boundary for?
#How about the diamond isle just off the south coast...
region='wight'
import requests

params = {'sql': 'SELECT AsGeoJSON(wgs84) FROM adminboundaries WHERE name LIKE "%{}%"'.format(region)}
json_url = "http://localhost:8001/adminboundaries.json"

r = requests.get(json_url, params=params)
results = r.json()

[2018-06-28 18:30:29 +0100] – (sanic.access)[INFO][1:2]: GET http://localhost:8001/adminboundaries-f771041.json?sql=SELECT+AsGeoJSON%28wgs84%29+FROM+adminboundaries+WHERE+name+LIKE+%22%25wight%25%22 302 0
[2018-06-28 18:30:29 +0100] – (sanic.access)[INFO][1:2]: GET http://localhost:8001/adminboundaries-a912e25.json?sql=SELECT+AsGeoJSON%28wgs84%29+FROM+adminboundaries+WHERE+name+LIKE+%22%25wight%25%22 200 398206

# Get geojson feed served from datasette - the result is actually a string
# so convert the string to actual json, qua py dict
import json
geojson=json.loads(results['rows'][0][0])

Now let’s see if we can render that region as a map.

#folium is a handy package I've used for ages for displaying maps in Jupyer notebooks
import folium
# Get example point from geojson to help center the map
lat,lng = tuple(geojson['coordinates'][0][0][0])
#Render the map
m = folium.Map(location=(lng,lat), zoom_start=10)
m.choropleth(geo_data=geojson, line_color='blue',line_weight=3)
m

So that all seems to work… :-)

Next up, I’ll see if I can load some lat/lng points, cast them as Point datatypes, then run a query to pull out just locations within a specific region…

29 Jun 14:51

Motorola Will Unveil Its Next Smartphone on August 2

by Evan Selleck
August is looking to be a packed month. With Samsung already slotting August 9 as a big day for itself, now Motorola is getting in a week earlier. Continue reading →
29 Jun 14:51

Porsche und Porsche Design

by Volker Weber

Heute wieder gelesen:

Partnerschaft zwischen dem deutschen Autohersteller Porsche und dem chinesischen Telecomkonzern Huawei

Das ist ein (beabsichtigtes) Missverständnis. Um das zu verstehen, muss man mal kurz in den Stammbaum des Porsche-Clans gucken. Ferdinand Porsche ist der Ingenieur, der für Hitler den KdF-Wagen, später Volkswagen Käfer, entwickelte. Ferdinand hatte zwei Kinder: Louise und Ferry. Louise heirate Anton Piëch. Ferdinand Piëch ist ein Kind von Anton und Louise. Ferry gründete die Sportwagenmarke Porsche. Sein Sohn Ferdinand Alexander "Butzi" Porsche entwarf den 911, gründete aber sein eigenes Unternehmen "Porsche Design Studio", als er beim Sportwagenhersteller keine Führungsposition mehr einnehmen durfte.

1972 waren alle Mitglieder der Porsche-Familie von wichtigen Posten beim Autohersteller Porsche ausgeschlossen worden.

Bereits 1974 zog F.A. Porsche mit seinem Unternehmen nach Zell am See in Österreich, dem Stammsitz der Familie. Erst 2003 verkaufte er Anteile von Porsche Design an eine Tochtergesellschaft der Porsche AG. 2017 übernahm die Porsche AG dann die restlichen Anteile, so dass Porsche Design wirtschaftlich zur Porsche AG gehört.

Dennoch ist Porsche Design kein Autohersteller. Vielmehr werden Lifestyle-Produkte entworfen und entwickelt, die von anderen Firmen als Lizenzvergabe hergestellt und unter dem eigenen Markennamen verkauft werden. Siehe Huawei.

29 Jun 14:51

Introducing a new web editor: Andriko Lozowy

by Andriko Lozowy
Dr. Andriko Lozowy is a photographer-researcher interested in social spatialization, classical and contemporary theory, disability, gender, architecture and design, experimental methods, and work. He has published on the Tar Sands and Northern Alberta, collaboration, and visual and participatory method. Stay in touch via andrikolozowy.com
29 Jun 14:51

Automattic’s First New Board Member: General Ann Dunwoody

by Matt

As Automattic keeps growing we’ve been bringing in a lot of talented people behind the scenes to help expand on our vision as we go from hundreds to thousands of colleagues, and hundreds of millions to billions in revenue. Recently, former New York Times digital executive Kinsey Wilson joined our team as president of WordPress.com, the Chief Design Officer of Axios Alexis Lloyd has joined as head of Design Innovation, the former CEO of Bluehost James Grierson is leading Jetpack partnerships, and today I’m excited to announce a change to my bosses, the board of directors.

Gen. Ann Dunwoody served for 37 years in the U.S. Army, and she is the first woman in U.S. Military history to achieve a four-star officer rank. She’s also the author of A Higher Standard: Leadership Strategies from America’s First Female Four-Star General, a book I really loved and highly recommend. Automattic’s board has had no new members since its founding in 2005, so this is our first addition in 13 years. I became familiar with General Dunwoody’s work while researching distributed organizations outside of technology, which led me to the military, which led me to geek out on logistics, which led me to her book and eventually flying out to Florida to meet in person.

Below is a brief interview with Gen. Dunwoody — we chatted with her about global leadership, finding your passion, and building a business.

We’re excited to have you onboard, General Dunwoody. It’s interesting — at Automattic we like to point out that we’re all over the globe (over 740 employees in more than 60 countries) but you oversaw 69,000 military and civilians across 140 countries! Were there any big leadership lessons from managing operations across such a wide range of distances, timezones, and cultures?

That’s a great question. When I started out as a young officer in the Army, the leadership philosophy that was espoused back then was “Leadership by walking around.” When you’re in charge of a platoon, a company or even a battalion or Brigade that is not globally dispersed this philosophy is very sound. When you’re running a global organization with 69,000 folks in 140 countries, you have to leverage technology to keep real-time communications flowing and keep leaders updated. I would host (with the leadership) a global video teleconference every Wednesday connecting every organization from Afghanistan, Kuwait, Iraq, Europe, etc. and sites — hundreds across the United States. Our headquarters  would provide an operational update and then we go around the globe to get update from from everyone — what’s going well, where they need help or additional resources. In the old days I think people believed information was power and often withheld information to use for personal advantage, but I believe shared information is power. By leveraging the power of the entire industrial base we could solve problems in real time. I still travelled around a lot to see our people, but it is not possible to keep everyone informed and in the loop with current operations without leveraging technology.

I love your answer about “shared information is power.” Did you ever find it difficult to break down the silos and embrace that concept?

Oh my, yes. They weren’t just silos, they were silos with concertina wire around them!   Parochialism was rampant and everyone wanted their own system and own their own information. We had over 200 stand alone systems that didn’t talk to each other. So to field and design an enterprise IT system that leveraged systems with the needed information to support “foxhole to factory” was challenging and exciting.

And how did you decide what technological means to communicate an idea or a directive, versus, say, meeting in-person?

I would say it depended on the idea. If it was personal, probably a phone call (one on one); if trying to generate support for an idea or transformational concept, meet in-person with my initiatives group to socialize the idea and get their input modifications and buy-in. Then Commanders conference to socialize idea with them, as they will have to implement it. Once socialized with leadership, we worldwide videoconference with the entire organization to define and describe the purpose, intent, how, and why — so everyone knew what we were trying to do and what their role was in execution. I found you cannot over-communicate when trying to make changes.

It’s an incredible accomplishment to become the first woman in U.S. Military history to achieve the four-star officer rank. Can you tell me about how things changed (or maybe still need to change further) in terms of your experience during your 37 years of service, and how you addressed diversity and inclusion in the military?

First, I certainly didn’t accomplish this by myself — I had a lot of help along the way! I joined the Army as part of the Women’s Army Corps (WAC) back in 1975. A few years later they disestablished the WAC and began the integration of women into the regular Army. This was the first time women had the opportunity to have the same career opportunities as their male counterparts in the branches now open to women. The challenge for the women who came into the Army back then was to force the integration — fight being put into traditional jobs like being a secretary, admin, clerk, or cook — and fight to be platoon leaders, etc., to support and move the integration of women into the regular Army.

What I witnessed during my time in the Army was that the doors continued to open. Yes, there were roadblocks — but there were also many leaders along the way who were willing to help. I never worked for a woman. I worked for men who either believed in me or didn’t. My experience in my almost four decades was that the doors continued to open for women. I thought jumping out of airplanes was really neat — now my niece in the USAF is an A-10 fighter pilot, and we have women graduating from Ranger school!  

On diversity, I realized that being the only female in many forums, my voice was hard to be heard. And I also realized that most folks promoted and surrounded themselves with people in their own image. What my philosophy was — and I still think it is an issue today — is that diversity is not about numbers, it’s about getting the best and brightest from all walks of life, to help leaders solve the very complex issues that face us today. Don’t surround yourself with only people that think or act or look like you.

Who are the leaders that inspire you today?

I think we are products of our past — Mom and Dad, even though not here on earth, gave me the values that still guide me. Many of my military mentors, Gen. Hugh Shelton, Gen. Pete Schoomaker, Gen. Gordon Sullivan, Gen. Dick Cody, are still coaches and mentors to me today.  

Folks I admire: Warren Buffett, only met him once but I like his concern for the betterment of our country; Oprah Winfrey, although I have never met her I admire her for what she does for our country how she presents herself and how she handles herself — awesome; Gen. Mattis — wow, I admire him for taking on this extremely tough assignment for the good of our country and our defense. Secretary Gates served two administrations, Republican and Democrat.

People that inspire me are people I believe are true leaders — valuing honesty and having the best interests of the country at heart. No hubris!

29 Jun 14:51

Uncle Whisky

When I was a kid we spent more time with my Mom’s family than with my Dad’s, but we still spent lots of holidays with my Dad’s family.

My Dad is the oldest of four siblings. The youngest, his brother, is only 10 years older than me. I remember my uncle and his sisters when they were teenagers.

The thing about the family was that everyone was constantly joking and laughing. I loved this.

I wanted to join in, so I did, from an early age. And sometimes I even got laughs! But most of the time I didn’t.

One day my uncle — who must have been about 20 then — gave me some advice about it. He said, “Hey, you don’t have to say everything you think of. Just the ones that are actually funny.”

Okay, I thought, so now it wasn’t enough to be fast enough to think of something that might be funny — I had to also evaluate it for likeliness? All in the space between sentences? And make it seem natural? Who can think that fast?

I think what he was doing was trying to get me to be less annoying. But I took it as earnest advice. And, well, I remember thinking, after a while, that it worked.

* * *

My uncle, Peter Simmons, became an actor and writer. He lives these days in Minneapolis, and he surely remembers none of this conversation.

* * *

My uncle had a dog named Whisky who was born the same spring when I was born. I called him Uncle Whisky, and I believed, until I was about 10, that of course dogs can be uncles too. Perfectly natural.

* * *

Whisky — sometimes called Wick for short — enjoyed hors d’oeuvres in the afternoon. There was always chips and that sour cream and onion dip. When you picked up a bad chip, you gave it to the dog. Those were called Wicker Chips.

To this day when I get a bad chip I mentally set it aside for Whisky, who was a good dog and a great uncle.

* * *

I’m a terrible introvert. The other introverts around me seem extremely outgoing. I marvel at them.

But!

But I had this weird family training, and so I can, for instance, go around a room at a conference with a microphone and talk to every single person, put them at ease, quickly think of things to say, make it seem natural — and even be a little funny.

Not only that — I enjoy it!

And I can do a podcast. And I can point to the latest episode with Aaron Cherof as one of the better episodes. I suspect Aaron may have had a family kind of like mine.

29 Jun 14:51

Twitter Favorites: [SnarkySteff] Essential nomad equipment: Paperclip for easy SIM installation. Half the countries sell SIMs at kiosks. I once had… https://t.co/SMXXA68jBO

Steffani Cameron, the Full Nomad @SnarkySteff
Essential nomad equipment: Paperclip for easy SIM installation. Half the countries sell SIMs at kiosks. I once had… twitter.com/i/web/status/1…
29 Jun 14:51

Twitter Favorites: [robmclarty] @sillygwailo Exactly. Have you seen the sign #biketo uses? Even when standing directly under it, it took me a minut… https://t.co/mlCnvwETsn

Rob McLarty @robmclarty
@sillygwailo Exactly. Have you seen the sign #biketo uses? Even when standing directly under it, it took me a minut… twitter.com/i/web/status/1…
29 Jun 14:51

Twitter Favorites: [PostTweetism] @sillygwailo The wording from @TorontoStar @justagwailo was bizarre. "Wrong" can't be used to describe an action ba… https://t.co/jrqPVyQVqe

Postassium 🍌 @PostTweetism
@sillygwailo The wording from @TorontoStar @justagwailo was bizarre. "Wrong" can't be used to describe an action ba… twitter.com/i/web/status/1…
29 Jun 14:50

Twitter Favorites: [JohnBiehler] Celebrating the unveiling of the National Portrait with @DougCoupland at the @OttawaArtG #3dcanada https://t.co/gPE1KuKHQa

John Biehler @JohnBiehler
Celebrating the unveiling of the National Portrait with @DougCoupland at the @OttawaArtG #3dcanada pic.twitter.com/gPE1KuKHQa
29 Jun 14:49

Complete Site Update

Once a year I like to go through a complete page-by-page refresh of each site, checking for various issues, inconsistencies, needed corrections, and improvements that can be made. That takes a bit of time, as this site has grown to about 1500 pages.

29 Jun 14:49

Sony Can Do

Update: Oops. The 3.0 update has been pulled by Sony temporarily while they investigate some issues. 

At Sony Kando 2.0, Sony staff, including engineers from Japan, were listening to the Sony Ambassadors, the press, and the customers who had signed up. 

29 Jun 14:49

Samsung Galaxy Note 9 Specs and Features Revealed in Detailed Hands-on

by Rajesh Pandey
Just yesterday, Samsung sent out invites for the Galaxy Note 9 unveiling on August 9. Now, spoiling Samsung’s launch event, Eldar Murtazin from Mobile Review has posted a detailed hands-on of Samsung’s next flagship phablet. Continue reading →
29 Jun 14:48

CAT-M Evolution in 3GPP Rel. 14

by Martin

It’s been a while since I talked about LTE based technologies for the Internet of Things (IoT) or Machine to Machine (M2M) communication. Slowly but steadily, we are now seeing NB-IoT and CAT-M1 technology deployed in practice even though I would have thought things would move faster. 3GPP has not slept in the meantime, however, and has continued to evolve both the standards for NB-IoT and also for CAT-M. In this post, I’d like to describe some interesting additions to the CAT-M system that has resulted in specifications for CAT-M2 devices.

In case you don’t remember, CAT-M1 devices are basically stripped down LTE devices that do not have to listen to the full 20 MHz channel of an LTE carrier but are limited to a channel bandwidth of 1.4 MHz with a maximum theoretical throughput of 1 Mbit/s in uplink and downlink. Also, they are usually operated in half-duplex mode, i.e. they can only transmit or receive at a particular time. While this requires a whole new set of signaling channels, the advantage of CAT-M1 devices is that they can be built with less complexity, and power consumption might also be lower than that of full LTE devices. If capacity of a single 1.4 MHz CAT-M1 channel is not sufficient, several CAT-M1 channels can be configured in a cell and activated and deactivated as required. The quick activation and deactivation is important, as additional 1.4 MHz CAT-M channels reduce the bandwidth that is available for LTE devices. To increase the range of CAT-M transmissions in both the uplink and the downlink direction, coverage enhancement mode A with levels 0 and 1 can be configured for re-transmitting data many times to increase redundancy. While this sounds great, it obviously reduces overall cell capacity significantly.

In Release 14, 3GPP has now specified a number of additional features. In addition to the CAT-M1 channel bandwidth of 1.4 MHz, CAT-M2 defines a channel bandwidth of 4×1.4 MHz, i.e. 5 MHz with a maximum theoretical data rate of 4 Mbit/s in uplink and downlink. Again, several CAT-M2 channels can be activated in a cell should that be necessary from a capacity point of view. But since CAT-M1/M2 has to share capacity with LTE devices, I suppose that few operators would be keen to actually take away that much capacity from broadband Internet services for that. But that’s an assumption at this point in time as there are only few CAT-M1 deployments in practice so far.

To further increase the coverage range, coverage enhancement mode B with coverage enhancement levels 3 and 4 has been introduced. These feature an even higher number of configurable repetitions, this time without power control. This makes sense at higher repetition factors as each transmission has to use the highest power level anyway to keep the number of repetitions as low as possible. It sounds nice on paper but repeating data several dozen times totally kills cell capacity.

Surely, these are interesting ideas that have gone into Release 14, so lets see if and when they will find themselves in real networks. Judging by the current state of NB-IoT and CAT-M deployments, I don’t think we’ll see this anytime soon.

P.S.: If you google for CAT M2, you will still find a lot of articles that state that CAT M2 is NB-IoT. This has been changed by 3GPP in the meantime however, with NB-IoT now being referred to as CAT-NB1 devices!

29 Jun 14:48

LeBron James legacy versus championship-winning

by Nathan Yau

LeBron James decides where he takes his talents this summer, and the sports news outlets continue to review every scenario as rumors trickle in. Neil Paine and Gus Wezerek for FiveThirtyEight present their quantitative solution, sending James to the Philadelphia 76ers.

On one hand, they consider the chances of winning a championship in the next four years, based on projection models. On the other hand, they consider a more subjective rating in legacy-building. All in good fun of course.

I always wonder what it’s like for professional athletes who have to make these sort of decisions. Much of their job is seemingly data-driven, but does someone like James even care about this stuff? Or is it all by feel? I imagine switching jobs to a new city, and I think I’d look at a few numbers initially, but it’d all filter down to the place where my family was happiest, data be damned.

Tags: basketball, FiveThirtyEight, Lebron James, prediction

29 Jun 14:46

Facebook payout in Oculus copyright dispute halved to $250 million

by Bradly Shankar
Oculus Rift on floor

A U.S. District Judge has ruled that Facebook must pay $250 million to Zenimax Media for using stolen computer code, half of the amount it was ordered to pay in February 2017.

According to Bloomberg, U.S. District Judge Ed Kinkeade affirmed the jury’s original award of $200 million for breach of contract and $50 million for copyright infringement, while wiping out the additional $250 million. Kinkeade also rejected Zenimax’s request for a ban on Rift sales.

Back in 2014, Zenimax sued Facebook shortly after it acquired virtual reality startup Oculus. Zenimax claimed that Oculus founder Palmer Luckey, Zenimax’s id Software developer John Carmack and other former Zenimax employees stole intellectual property from the company to use in developing the Rift VR headset.

During the trial, Zenimax alleged that Carmack didn’t possess the knowledge or expertise to design the Rift on his own, thus leading him to steal its intellectual property.

Oculus, meanwhile, contended that the copyright infringement wasn’t “substantial” and called for damages to be thrown out. Oculus claimed that only seven lines of computer code from Oculus software were copied from Zenimax, out of “approximately 42 billion lines” presented as evidence during the trial.

In a statement, Zenimax said it was pleased with the $250 million win, although it expressed disappointment that the sum was half of what was originally ruled. “Based on strong evidentiary record, the jury in this case found that ZeniMax was seriously harmed by the defendants’ theft of ZeniMax’s breakthrough VR technology and its verdict reflected that harm,” said Zenimax.

Facebook vice president and deputy general counsel Paul Grewal said the new ruling “was a positive step toward a fair resolution” and that the company will be looking to appeal the remaining claims. “We’ve said from day one the ZeniMax case is deeply flawed, and today the court agreed,” Grewal added. “Our commitment to Oculus is unwavering and we will continue to invest in building the future of VR.”

Source: Bloomberg

The post Facebook payout in Oculus copyright dispute halved to $250 million appeared first on MobileSyrup.

29 Jun 14:45

Google had interest in buying GitHub, lost out to Microsoft: report

by Jonathan Lamont
GitHub website on mobile

Google allegedly had interest in purchasing GitHub as well, but lost out to Microsoft.

Microsoft agreed to pay $7.5 billion for the online code repository and developer community earlier this month. However, Google was in the running as well, according to a Bloomberg report.

Google’s Diane Greene, the head of the search giant’s cloud arm, said the company was interested at a Fortune Magazine event.

“I wouldn’t have minded buying them, but it’s okay,” Greene said at the event in San Francisco on Wednesday.

However, Google hasn’t confirmed reports that it bid on GitHub.

According to The Verge, GitHub founder Chris Wanstrath chose Microsoft over Google due to his relationship with Microsoft’s CEO Satya Nadella.

Developers have raised concerns over Microsoft’s purchase of the platform. A lot of the concerns revolve around trust and whether Microsoft will be able to maintain it.

However, those concerns would have remained, regardless if Google or another tech company took over. The issue for many developers is that GitHub is now beholden to a tech company. Before it was beholden to nobody; it was its own entity by developers for developers.

The Verge also asked Google whether it will continue to use GitHub. A spokesperson said the company won’t comment on ongoing acquisitions. Facebook, however, has committed to GitHub “as long as GitHub remains a great place to share our projects and collaborate with the open source community.”

Source: Bloomberg Via: The Verge

The post Google had interest in buying GitHub, lost out to Microsoft: report appeared first on MobileSyrup.

29 Jun 14:45

LG reportedly supplying Apple with 2 to 4 million OLED displays

by Bradly Shankar
LG logo

LG’s Display division will soon become Apple’s second supplier of OLED displays for an upcoming iPhone model, according to a report from Bloomberg.

LG is reportedly set to provide Apple with two to four million OLED units, a small amount compared to what it gets from current supplier Samsung.

However, Bloomberg notes that the agreement with LG will help Apple reduce its dependence on Samsung for the key iPhone components. Further, this would give Apple leverage in price negotiations with Samsung over future OLED display orders.

Currently, the expensive OLED displays are a key reason why Apple’s iPhone X carries an expensive $1,319 CAD price tag, and has contributed to an underperformance in sales. LG, meanwhile, is facing a slide in the price of its liquid crystal displays, making a new arrangement with Apple particularly beneficial.

“Securing a second supplier for OLED screens is crucial for Apple as it will allow the company to reduce its reliance on Samsung, which is currently the sole supplier,” Jerry Kang, a senior principal analyst at IHS Markit, told Bloomberg. “At the same time, it will help accelerate a broad adoption of OLED screens. More suppliers means more volume, and in turn, lower pricing.”

Source: Bloomberg

The post LG reportedly supplying Apple with 2 to 4 million OLED displays appeared first on MobileSyrup.

29 Jun 14:24

‘Ant-Man and The Wasp’ content coming to Marvel Strike Force mobile game

by Bradly Shankar
Ant-Man and The Wasp Hope and Scott

Marvel has announced that its Strike Force mobile game is receiving special Ant-Man and The Wasp-themed content.

To coincide with next month’s Marvel Studios film, Marvel Strike Force is currently running the ‘I Am Ant-Man’ in-game event.

Players have until July 11th to collect enough Ant-Man shards through a special event campaign to add the hero to their squads. The Wasp, meanwhile, will join the game “in the coming weeks” alongside Star-Lord and Groot from The Guardians of the Galaxy. Once available, The Wasp will have her own special event campaign.

Marvel Strike Force Ant-Man

Marvel Strike Force can be downloaded for free on Android and iOS.

Strike Force isn’t the only Marvel mobile game to offer content related to the new film; Lego Marvel Superheroes 2Marvel Future Fight and Marvel Contest of Champions are some of the other Marvel titles that are featuring the pint-sized heroes. A full breakdown of Ant-Man and The Wasp promotional game events can be found here.

Ant-Man and The Wasp, which stars Paul Rudd and Alberta’s own Evangeline Lilly, will fly into theatres on July 6th.

Image credit: Marvel Studios

The post ‘Ant-Man and The Wasp’ content coming to Marvel Strike Force mobile game appeared first on MobileSyrup.