Doug Belshaw: How I've achieved notification nirvana with a smartphone / smartband combo |
TL;DR I’m using a cheap Sony SmartBand SWR10 to get selective vibrating notifications on my wrist from my Android phone. I never miss anything important, and I’m not constantly checking my devices.
Every year I take between one and two months away from social media and blogging. I call this period Belshaw Black Ops. One of the things I’ve really enjoyed during these periods is not being constantly interrupted by notifications.
The problem with notifications systems on smartphones is that they’re still reasonably immature. You’re never really sure which ones are unmissable and which ones are just fairly meaningless social updates. When a pre-requisite of your job is ‘keeping up to date’ it’s difficult to flick the binary switch to off.
Thankfully, I’ve come across a cheap and easy way to simplify all of this. After finding out about the existence of Sony smartbands via HotUKDeals (a goldmine of knowledge as well as deals) I bought the SWR10 for about lb20. It connects via NFC and Bluetooth to Android smartphones.
The battery life of the smartband is about 3-4 days. I wear it almost all of the time - including in bed as I use the vibrating alarm to wake me up when I start to stir. I choose not to use the Sony lifelogging app as I’m not really interested in companies having that many details about me. It’s the reason I stopped wearing a Fitbit.
My wife and I use Telegram to message each other, so my wrist vibrates discreetly when she sends me a message. I’ve also got it configured to vibrate on calendar events, phone calls, and standard SMS messages.
All of this means that my smartphone is almost permanently in Silent mode. The vibration on my wrist is enough for me to feel, but not for others to hear. It’s pretty much the perfect system for me - notification nirvana!
Comments? Questions? I’m @dajbelshaw or you can email me: mail@dougbelshaw.com
|
Armen Zambrano: mozci 0.8.2 - Allow using TreeHerder as a query source |
|
Mike Taylor: Upcoming changes to the Firefox for Android UA string |
If there's one thing that developers love more than the confusing nature of User Agent strings, it's when they change.
Great news, everybody.
Beginning in Firefox for Android 41, the default UA string will contain the Android version in the platform token (bug here):
Mozilla/5.0 (Android
And perhaps the only things that developers love more than changing UA strings is when they change conditionally.
So, for interoperability with the wild and crazy web, if a user is on a version of Android lower than 4 (which we still support), we will report the Android version as 4.4. Versions 4 and above will accurately reflect the Android version.
And in case you've forgotten, Firefox for Android is the same across Android versions, so sniffing the version won't tell you if we do or do not support the latest cool feature.
As always, send all complaints to our head of customer satisfaction.
https://miketaylr.com/posts/2015/07/upcoming-changes-to-the-firefox-for-android-ua-string.html
|
This Week In Rust: This Week in Rust 86 |
Hello and welcome to another issue of This Week in Rust! Rust is a systems language pursuing the trifecta: safety, concurrency, and speed. This is a weekly summary of its progress and community. Want something mentioned? Tweet us at @ThisWeekInRust or send us an email! Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub. If you find any errors in this week's issue, please submit a PR.
107 pull requests were merged in the last week.
Every week the teams announce a 'final comment period' for RFCs which are reaching a decision. Express your opinions now. This week's RFCs entering FCP are:
connect
to join
.slice::tail()
/init()
with new methods.stdio
of child processes to open file handles.&
or &mut
temporary. Modify the ||
expression sugar so that it can expand to either F
, &F
, or &mut F
, where F
is a fresh struct type implementing one of the Fn
/FnMut
/FnOnce
traits.#![no_std]
attribute.'_
. Allow using an undeclared '_ wherever an explicit lifetime can be used, but is optional, such as function argument/return types and any path inside a function.IntoRaw{Fd, Socket, Handle}
trait to complement AsRaw*
.Interior
data-type, to allow moves out of the dropped value during the drop hook.If you are running a Rust event please add it to the calendar to get it mentioned here. Email Erick Tryzelaar or Brian Anderson for access.
"Greek constitution to be rewritten in #rustlang to deal with their ownership and borrowing problem." — @bigthingist
Submit your quotes for next week!.
http://this-week-in-rust.org/blog/2015/07/06/this-week-in-rust-86/
|
Planet Mozilla Interns: Jonathan Wilde: Gossamer Sprint Two, Day Three |
Want more context? See the introduction to Gossamer and previous update.
Let’s say you make a code change to your browser and you want it today. After making your change, you need to restart the app, or in the case of browser.html clear caches and refresh the page.
With our experimental fork of browser.html, we can now apply a lot of different types of changes without a refresh.
Let’s say we want to change the experiments icon in the upper right of our browser and make it red and larger. You just make the change and hit save. The changes appear in your running browser, without any loss of state.
We’re doing this with Webpack Hot Module Replacement and React Hot Loader.
In the demo, I’m running browser.html from Webpack’s development server. It watches and serves the browser.html files from my working copy, performs incremental module builds, and has an open socket.io connection to the browser notifying it of build status.
When the working copy changes, it performs an incremental build and notifies the browser of new code. The browser can apply the changes without a restart.
npm start
script from ecstatic to Webpack’s development server.http://jwilde.me/mozilla/2015/07/05/gossamer-two-day-three.html
|
Ted Clancy: RAII helper macro |
One of the most important idioms in C++ is “Resource Acquisition Is Initialization” (RAII), where the constructor of a class acquires a resource (like locking a mutex, or opening a file) and the corresponding destructor releases the resource.
Such classes are almost always used as local variables. The lifetime of the variable lasts from its point of declaration to the end of its innermost containing block.
A classic example is something like:
extern int n; extern Mutex m; void f() { Lock l(&m); // This is an RAII class. n++; }
The problem is, code written with these classes can easily be misunderstood.
1) Sometimes the variable is used solely for the side-effects of its constructor and destructor. To a naive coder, this can look like an unused variable, and they might be tempted to remove it.
2) In order to control where the object is destroyed, the coder sometimes needs to add another pair of braces (curly brackets) to create a new block scope. Something like:
void f() { [...] { Lock l(&m); n++; } [...] }
The problem is, it’s not always obvious why that extra block scope is there. (For trivial code, like the above, it’s obvious. But in real code, ‘l’ might not be the only variable defined in the block.) To a naive coder, it might even look like an unnecessary scope, and they might be tempted to remove it.
The usual solutions to this situation are: (a) Write a comment, or (b) trust people to understand what you meant. Those are both bad options.
That’s why I’m fond of the following MACRO.
#define with(decl) \ for (bool __f = true; __f; ) \ for (decl; __f; __f = false)
This allows you to write:
void f() { [...] with (Lock l(&m)) { n++; } [...] }
This creates a clear association between the RAII object and the statements which depend on its existence. The code is less likely to be misunderstood.
I like to call this a with
-statement (analogous to an if
-statement). Any kind of variable declaration can go in the head of the with
-statement (as long as it can appear in the head of a for
-statement). The body of the with
-statement executes once. The variable declared in the head of the statement is destroyed after the body executes.
Your code editor might even highlight ‘with
‘ as a keyword, since it’s a keyword in Javascript (where it has a different — and deprecated — purpose).
I didn’t invent this kind of MACRO. (I think I first read about something similar in a Dr Dobb’s article.) I just find it really useful, and I hope you do too.
https://tedclancy.wordpress.com/2015/07/04/raii-helper-macro/
|
Ted Clancy: ICANN, wtf? |
|
Mozilla Reps Community: Rep of the month – May 2015 |
Please join us in congratulating Mahmood Qudah of Jordan for being selected as Mozilla Rep of the Month for May 2015.
Mahmood is not just an active member in the Jordan local community but also very active in the bigger Mozilla Arabic community. He is doing lectures at universities in Jordan (many FSA events too), participating in the Marketing team for the Arabic community, he is helping in fixing RTL (right-to-left) issues in Firefox OS. In addition, he did few lectures teaching students how to start localizing Firefox OS.
Every month he is having one or two events, either organizing them or being part of them. We’re happy to see that he’s blasting both communities with new ideas every day.
Congratulations, Mahmood! Keep on rocking.
Don’t forget to congratulate him on Discourse!
https://blog.mozilla.org/mozillareps/2015/07/03/rep-of-the-month-may-2015/
|
Carsten Book: 7 Years at Mozilla! |
Hi,
since last month i’m now 7 years at Mozilla as full-time employee \o/
Of course I’m longer around because i started as Community Member in QA years before. And its a long way from my first steps at QA to my current role as Code Sheriff @ Mozilla.
I never actively planned to join the Mozilla Community it just happened I worked back in 2001 at a German Email Provider as 2nd Level Support Engineer and as part of my Job (and also to Support Customers) we used different Email Programm’s to find out how to set-up the Programm and so.
Some Friends already involved into OpenSource (some linux fans) pointed me to this Mozilla Programm (at that time M1 or so) and i liked the Idea with this “Nightly”. Having everyday a brand new Program was something really cool and so started my way into the Community without even knowing that i’m now Part of the Community.
So over the years with Mozilla i finally filed my first bug and and was scared like hell (all this new fields in a non-native language) and not really knowing what i signed up when i clicked up this “submit” button in bugzillla (was not even sure if i’m NOW supposed to fix the bug
And now i file dozens of Bugs every day while on Sheriffduty or doing other tasks
I learned a lot of stuff over the last years and still love being part of Mozilla and its the best place to work for me! So on to the next years at Mozilla!
– Tomcat
https://blog.mozilla.org/tomcat/2015/07/03/7-years-at-mozilla/
|
Carsten Book: a day in sheriffing |
Hi,
since i talked with a lot of people about Sheriffing and what we do here is what a typical day for me look:
We care about the Code Trees like Test Failures etc
I usually start the day with checkin the trees we are responsible for for test failures using treeherder. This gives me first a overview of the current status and as well make sure that everything is ok for the Asian and European Community which is online at that time.
This Tasks is ongoing till the end of my duty shift. From time to time this means we have to do backouts for code/test regressions.
Beside this i do stuff like checkin-neededs, uplifts etc and other tasks and of course always availble for questions etc on irc
Also i was thinking about some parts of my day-to-day experience:
Backouts and Tree Closures:
While backouts of code for test failures/bustages etc is one important task of sheriffs (and the managing of tree closures related to this), its always a mixed feeling to backout work from someone (and no one wants to cause a bustage) but its important to ensure quality of our products.
Try Server!!!
Tree Closures due to backouts can have the side effect that others are blocked with checkins. So if in doubt if your patch compile or could cause test regressions, please consider a try run, this helps at lot to keep tree closures for code issues at a minimum.
And last but not least Sheriffing is a Community Task! So if you want to be part of the Sheriff Team as Community Sheriff please sent me a mail at tomcat at mozilla dot com
Thanks!
– Tomcat
https://blog.mozilla.org/tomcat/2015/07/03/a-day-in-sheriffing/
|
About:Community: MDN at Whistler |
The MDN community was well-represented at the Mozilla “Coincidental Work Week” in Whistler, British Columbia, during the last week in June. All of the content staff, a couple of the development staff, and quite a few volunteers were there. Meetings were met, code was hacked, docs were sprinted, and fun was funned.
Photo by Julien Sphinx / CC-BY-NC
One of the big motivations for the “Coincidental Work Week” is the opportunity for cross-pollination among teams, so that teams can have a high-bandwidth conversations about their work with others. MDN touches many other functional groups within Mozilla, so we had a great many of these conversations. Some MDN staff were also part of “durable” (i.e., cross-functional) teams within the Engagement department, meeting with product teams about their marketing needs. Among others, MDN folks met with:
The MDN community members at Whistler spent some time as a group reflecting on the first half of the year, and planning and prioritizing for the second half of the year. Sub-groups met to discuss specific projects, such as the compatibility data service, or HTML API docs.
Lest the “Work Week” be all meetings, we also scheduled time for heads-down productivity. MDN was part of a web development Hack Day on Wednesday, and we held doc sprints for most of the day on Thursday and Friday. These events resulted in some tangible outputs, as well as some learning that will likely pay off in the future.
Of course, the highlight of any Mozilla event is the chance to eat, drink, and socialize with other Mozillians. Planned dinners and parties, extracurricular excursions, and spontaneous celebrations rounded out the week. Many in the MDN group stayed at a hotel that happened to be a 20-minute walk from most of the other venues, so those of us with fitness trackers blew out our step-count goals all week. A few high points:
http://blog.mozilla.org/community/2015/07/03/mdn-at-whistler/
|
Will Kahn-Greene: Input: Thank You project Phase 1: Part 1 |
When users click on "Submit feedback..." in Firefox, they end up on our Input site where they can let us know whether they're happy or sad about Firefox and why. This data gets collected and we analyze it in aggregate looking for trends and correlations between sentiment and subject matter, releases, events, etc. It's one of the many ways that users directly affect the development of Firefox.
One of the things that's always bugged me about this process is that some number of users are leaving feedback about issues they have with Firefox that aren't problems with the product, but rather something else or are known issues with the product that have workarounds. It bugs me because users go out of their way to leave us this kind of feedback and then they get a Thank You page that isn't remotely helpful for them.
I've been thinking about this problem since the beginning of 2014, but hadn't had a chance to really get into it until the end of 2014 when I wrote up a project plan and some bugs.
In the first quarter of 2015, Adam worked on this project with me as part of the Outreachy program. I took the work that he did and finished it up in the second quarter of 2015.
The code has been out there for a little under a month now and early analysis suggests SUCCESS!
This blog post is a write-up for the Thank You project phase 1. It's long because I wanted to go through the entire project beginning to end as a case study.
Read more… (17 mins to read)
http://bluesock.org/~willkg/blog/mozilla/input_thankyou_phase1.html
|
Mozilla Open Policy & Advocacy Blog: Decisive moment for net neutrality in Europe |
After years of negotiations, the E.U. Telecom Single Market Regulation (which includes proposed net neutrality rules) is nearing completion. If passed, the Regulation will be binding on all E.U. member states. The policymakers – the three European governmental bodies: the Parliament, the Commission, and the Council – are at a crossroads: implement real net neutrality into law, or permit net discrimination and in doing so threaten innovation and competition. We urge European policymakers to stand strong, adopt clear rules to protect the open Internet, and set an example for the world.
At Mozilla, we’ve taken a strong stance for real net neutrality, because it is central to our mission and to the openness of the Internet. Just as we have supported action in the United States and in India, we support the adoption of net neutrality rules in Europe. Net neutrality fundamentally protects competition and innovation, to the benefit of both European Internet users and businesses. We want an Internet where everyone can create, participate, and innovate online, all of which is at risk if discriminatory practices are condoned by law or through regulatory indifference.
The final text of European legislation is still being written, and the details are still gaining shape. We have called for strong, enforceable rules against blocking, discrimination, and fast lanes are critical to protecting the openness of the Internet. To accomplish this, the European Parliament needs to hold firm to its five votes in the last five years for real net neutrality. Members of the European Parliament must resist internal and external pressures to build in loopholes that would threaten those rules.
Two issues stand out as particularly important in this final round of negotiations: specialized services and zero-rating. On the former, specialized services – or “services other than Internet access services” – represent a complex and unresolved set of market practices, including very few current ones and many speculative future possibilities. While there is certainly potential for real value in these services, absent any safeguards, such services risk undermining the open Internet. It’s important to maintain a baseline of robust access, and prevent relegating the open Internet to a second tier of quality.
Second, earlier statements from the E.U. included language that appeared to endorse zero-rating business practices. Our view is that zero-rating as currently implemented in the market is not the right path forward for the open Internet. However, we do not believe it is necessary to address this issue in the context of the Telecom Single Market Regulation. As such, we’re glad to see such language removed from more recent drafts and we encourage European policymakers to leave it out of the final text.
The final text that emerges from the European process will set a standard not only for Europe but for the rest of the world. It’s critical for European policymakers to stand with the Internet and get it right.
Chris Riley, Head of Public Policy
Jochai Ben-Avie, Internet Policy Manager
https://blog.mozilla.org/netpolicy/2015/07/02/decisive-moment-for-net-neutrality-in-europe/
|
The Mozilla Blog: New Sharing Features in Firefox |
Whichever social network you choose, it’s undeniable that being social is a key part of why you enjoy the Web. Firefox is built to put you in control, including making it easier to share anything you like on the Web’s most popular social networks. Today, we’re announcing that Firefox Share has been integrated into Firefox Hello. We introduced Firefox Share to offer a simple way of sharing Web content across popular services such as Facebook, Twitter, Tumblr, LinkedIn and Google+ and other social and email services (full list here) to help you share anything on the Web with any or all of your friends.
Firefox Hello, which we’ve been developing in beta with our partner, Telefonica, is the only in-browser video chat tool that doesn’t require an account or extra software downloads. We recently added screen sharing to Firefox Hello to make it easier to share anything you’re looking at in your video call. Now you can also invite friends to a Firefox Hello video call by sharing a link via the social network or email account of your choice, all without leaving your browser tab. That includes a newly added Yahoo Mail integration in Firefox Share that lets Yahoo Mail users share Hello conversation links or other Web content directly from Firefox Share.
For more information:
Release Notes for Firefox for Windows, Mac, Linux
Release Notes for Android
Download Firefox
https://blog.mozilla.org/blog/2015/07/02/new-sharing-features-in-firefox/
|
Air Mozilla: German speaking community bi-weekly meeting |
https://wiki.mozilla.org/De/Meetings
https://air.mozilla.org/german-speaking-community-bi-weekly-meeting-3/
|
Mozilla Addons Blog: T-Shirt Form Data Exposure |
On Monday, June 15, 2015 Mozilla announced on the Add-ons blog a free special edition t-shirt for eligible AMO developers. Eligible developers were requested to sign up via Google Form and asked to input their full name, full address, telephone number and T-shirt size.
This document was mistakenly configured to allow potential public access for less than 24 hours, exposing the response data for 70 developers. As soon as the incident was discovered, we immediately changed the permission level to private access. Other than the developer who discovered and reported this incident, we are not aware of anyone without authorization accessing the spreadsheet.
We have notified the affected individuals. We regret any inconvenience or concern this incident may have caused our AMO developer community.
https://blog.mozilla.org/addons/2015/07/02/t-shirt-form-data-exposure/
|
Air Mozilla: Web QA Weekly Meeting |
This is our weekly gathering of Mozilla'a Web QA team filled with discussion on our current and future projects, ideas, demos, and fun facts.
|
Roberto A. Vitillo: Telemetry metrics roll-ups |
Our Telemetry aggregation system has been serving us well for quite some time. As Telemetry evolved though, maintaining the codebase and adding new features such as keyed histograms has proven to be challenging. With the introduction of unified FHR/Telemetry, we decided to rewrite the aggregation pipeline with an updated set of requirements in mind.
Metrics
A ping is the data payload that clients submit to our server. The payload contains, among other things, over thousand metrics of the following types:
Distributions are implemented with histograms that come in different shapes and sizes. For example, a keyed histogram represent a collection of labelled histograms. It’s not rare for keyed histograms to have thousands of possible labels. For instance, MISBEHAVING_ADDONS_JANK_LEVEL
, which measures the longest blocking operation performed by an add-on, has potentially a label for each extensions.
The main objective of the aggregator is to create time or build-id based aggregates by a set of dimensions:
As scalar and categorical metrics are converted to histograms during the aggregation, ultimately we display only distributions in our dashboard.
Raw Storage
We receive millions of pings each day over all our channels. A raw uncompressed ping has a size of over 100KB. Pings are sent to our edge servers and end up being stored in an immutable chunk of up to 300MB on S3, partitioned by submission date, application name, update channel, application version, and build id.
As we are currently collecting v4 submissions only on pre-release channels, we store about 700 GB per day; this considering only saved_session
pings as those are the ones being aggregated. Once we start receiving data on the release channel as well we are likely going to double that number.
As soon as an immutable chunk is stored on S3, an AWS lambda function adds a corresponding entry to a SimpleDB index. The index allows Spark jobs to query the set of available pings by different criteria without the need of performing an expensive scan over S3.
Spark Aggregator
A daily scheduled Spark job performs the aggregation, on the data received the day before, by the set of dimensions mentioned above. We are likely going to move from a batch job to a streaming one in the future to reduce the latency from the time a ping is stored on S3 to the time its data appears in the dashboard.
Two kinds of aggregates are produced by aggregator:
Aggregates by build-id computed for a given submission date have to be added to the historical ones. As long as there are submissions coming from an old build of Firefox, we will keep receiving and aggregating data for it. The aggregation of the historical aggregates with the daily computed ones (i.e. partial aggregates) happens within a PostgreSQL database.
Database
There is only one type of table within the database which is partitioned by channel, version and build-id (or submission date depending on the aggregation type).
As PostgreSQL supports natively json blobs and arrays, it came naturally to express each row just as a couple of fields, one being a json object containing a set of dimensions and the other being an array representing the histogram. Adding a new dimension in the future should be rather painless as dimensions are not represented with columns.
When a new partial aggregate is pushed to the database, PostreSQL finds the current historical entry for that combination of dimensions, if it exists, and updates the current histogram by summing to it the partially aggregated histogram. In reality a temporary table is pushed to the database that contains all partial aggregates which is then merged with the historical aggregates, but the underlying logic remains the same.
As the database is usually queried by submission date or build-id and as there are milions of partial aggregates per day deriving from the possible combinations of dimensions, the table is partitioned the way it is to allow the upsert operation to be performed as fast as possible.
API
An inverted index on the json blobs allows to efficiently retrieve, and aggregate, all histograms matching a given filtering criteria.
For example,
select aggregate_histograms(histograms) from build_id_nightly_41_20150602 where dimensions @> '{"metric": "SIMPLE_MEASURES_UPTIME", "application": "Firefox", "os": "Windows"}'::jsonb;
retrieves a list of histograms, one for each combination of dimensions matching the where clause, and adds them together producing a final histogram that represents the distribution of the uptime
measure for Firefox users on the nightly Windows build created on the 2nd of June 2015.
Aggregates are made available through a HTTP API. For example, to retrieve the aggregated histogram for the GC_MS
metric on Windows for build-ids of the 2015/06/15 and 2015/06/16:
curl -X GET "http://SERVICE/aggregates_by/build_id/channels/nightly/?version=41&dates=20150615,20150616&metric=GC_MS&os=Windows_NT"
which returns
{"buckets":[0, ..., 10000], "data":[{"date":"20150615", "count":239459, "histogram":[309, ..., 5047], "label":""}, {"date":"20150616", "count":233688, "histogram":[306, ..., 7875], "label":""}], "kind":"exponential", "description":"Time spent running JS GC (ms)"}
Dashboard
Our intern, Anthony Zhang, did a phenomenal job creating a nifty dashboard to display the aggregates. Even though it’s still under active development, it’s already functional and thanks to it we were able to spot a serious bug in the v2 aggregation pipeline.
It comes with two views, the histogram view designed for viewing distributions of measures:
and an evolution view for viewing the evolution of aggregate values for measures over time:
As we started aggregating data at the beginning of June, the evolution plot looks rightfully wacky before that date.
http://robertovitillo.com/2015/07/02/telemetry-metrics-roll-ups/
|
Byron Jones: happy bmo push day! |
the following changes have been pushed to bugzilla.mozilla.org:
discuss these changes on mozilla.tools.bmo.
https://globau.wordpress.com/2015/07/02/happy-bmo-push-day-148/
|