[Microblog] The Dark Side of Life

So, maps.google.com goes really slowly when I have dual monitors, but maps.bing.com has detailed satellite of my hometown (and Google does not).  Dun dun dun.


[Technology] GNOME Shell, memory usage, CPU usage, and graphics

I have a "Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller" according to lspci.  It's in an HP Compaq tc4400.  It's nice.  However, it doesn't like GNOME Shell when it comes to multiple monitors.

The reason is bug 699705: "Intel Gen 3 Rendering Limits are Pitiful".  A solution might be coming under the name "per-crtc pixmaps" in a future edition of the XRANDR protocol, requiring support in GNOME Shell as well.  Basically, the way memory is allocated right now, a screen that spans multiple monitors becomes too big, and GNOME Shell can't handle it.  It used to crash; now it just takes 100% CPU to draw VERY SLOWLY.

I own a nice second monitor, and I've suffered under using GNOME Shell on just one screen for too long.  Consequently, I'm now back to just using gnome-panel and metacity, and I've noticed something weird.

When I'm using just a single monitor, using GNOME Shell, if any application (with a window, at least), uses up to 50% of available RAM (e.g. Firefox, Chromium), my system slows to crawl and starts swapping like crazy.  In theory, there's still a lot of memory available, though. 

When I use metacity + gnome-panel, whether I'm using one monitor or two, I have Firefox up to 64% of available memory (nauseating) and there's no swapping yet!

Does using GNOME Shell somehow double memory usage, double what's reported under top?

[Technology] DOMException, its nature and appropriateness for GError reporting

I've had to recently study the nature of the various DOMExceptions specified by the DOM Level 3 Core spec, to better understand whether we want to use the GError reporting system of GLib in GXml, or whether we want to use something else.  I defaulted to using GError, because the spec presents them as exceptions to be raised, and because I was used to handling libgdata errors (which are legitimately run-time errors) with GError.

The GLib Error Reporting documentation is pretty clear about when it's appropriate to use GError: basically, only when it's a run-time issue that a programmer can't reasonably anticipate.
First and foremost: GError should only be used to report recoverable runtime errors, never to report programming errors. If the programmer has screwed up, then you should use g_warning(), g_return_if_fail(), g_assert(), g_error(), or some similar facility. (Incidentally, remember that the g_error() function should only be used for programming errors, it should not be used to print any error reportable via GError.)

Examples of recoverable runtime errors are "file not found" or "failed to parse input." Examples of programming errors are "NULL passed to strcmp()" or "attempted to free the same pointer twice." These two kinds of errors are fundamentally different: runtime errors should be handled or reported to the user, programming errors should be eliminated by fixing the bug in the program. This is why most functions in GLib and GTK+ do not use the GError facility.
Below are my feelings on which DOMExceptions constitute programming errors (and shouldn't use GError) or run-time errors (and should). I look at run-time errors as consequences of the environment in which GXml is used (e.g. is it the fault of a document we're reading in, the content of which we have little control), and programming errors the direct result of a programmed call that's supplying bad data or misusing the document.

I find most of the DOMExceptions to be programming errors.  If you believe that something is more properly a run-time error and deserves GError reporting, please comment and explain why!  I am not an expert.  Like, for invalid characters, GXml might be used by a GUI where a user is entering data, and enters characters that aren't supported.  I think input checking like that should be handled in the application instead of in the GXml library, though; it shouldn't get as far as trying to actually set an attribute with bad data.  Perhaps we could provide convenience validation methods to GXml, though.  Thoughts welcome.

R: Runtime, GError
P: Programming
N: N/A

Defined Constants

        If the specified range of text does not fit into a DOMString.
  we don't have our own DOMString type, we just use gchar* arrays, which don't really have 
  a fixed limit, just as much as you can alloc in a single go.

        If any Node is inserted somewhere it doesn't belong.
  this would be a programmer error, like trying to append a node to be a child of itself.

        If index or size is negative, or greater than the allowed value.
  programmer error, they should check size before accessing non-existent members of lists

        If an attempt is made to add an attribute that is already in use elsewhere.
  programmer error

?    INVALID_ACCESS_ERR, introduced in DOM Level 2.
        If a parameter or an operation is not supported by the underlying object.
  nclear as to when this might happen; property of a document or implementation or the DOM?

        If an invalid or illegal character is specified, such as in an XML name.
  I'd almost think it's a run-time error, because it probably reflects an issue with the 
  document we're working on.  Invalid characters are related to the XML version of a document,
  and which features our implementation supports.  Right now, we basically don't deal with 
  this (!).  libxml2 has version information, of course, but I'm not sure how it handles 
  invalid characters yet.  TODO: figure this out.  
  However, I think of it more as programmer error, because almost all the methods its 
  associated with are where the programmer provides a string that might contain it, rather 
  than just accessing a string already in the Document.  The other ones involve bringing
  foreign nodes into documents, and the programmer has the option of checking version 
  information and characters beforehand to ensure compatibility

?    INVALID_MODIFICATION_ERR, introduced in DOM Level 2.
        If an attempt is made to modify the type of the underlying object.
  Not really specified for any methods

?    INVALID_STATE_ERR, introduced in DOM Level 2.
        If an attempt is made to use an object that is not, or is no longer, usable.
  Not really specified for any methods

P    NAMESPACE_ERR, introduced in DOM Level 2.
        If an attempt is made to create or change an object in a way which is incorrect 
        with regard to namespaces.
  The result of bad input from a programmer, for qualified names.

        If an attempt is made to reference a Node in a context where it does not exist.
  Programmer error, they're specifying the node in reference, so like with insertBefore, 
  removeChild, etc.

        If the implementation does not support the requested type of object or operation.
  We couldn't don't deal with the features of our implementation or XML versions (that's bad, 
  but oh well); not exactly sure where this would fall.  Sometimes it seems like it would be 
  a programming error (trying to adopt a Document node into another Document with adoptNode) 
  but other times, like when creating a document, I could see that being a runtime error.

        If data is specified for a Node which does not support data.
  Currently nothing raised it according to the spec, and there aren't any obvious cases 
  where I want to.  
        If an attempt is made to modify an object where modifications are not allowed.
  We currently don't have a concept of a read only node, and thus no way to check. I'm not
  sure if libxml2 has a concept of readability either.  Its common for most nodes to want to 
  raise this, so perhaps it's a real use case we should support, but even then, it feels like
  something that isn't variable at run time, and that a programmer might be able to reasonably 
  anticipate and check for.  

P    SYNTAX_ERR, introduced in DOM Level 2.
        If an invalid or illegal string is specified.
  Probably a programmer error, if they're the ones specifying strings.

P    TYPE_MISMATCH_ERR, introduced in DOM Level 3.
        If the type of an object is incompatible with the expected type of the parameter 
        associated to the object. 
  Only used by DOMConfiguration.setParameter, which we don't support.  This seems like a 
  programmer thing, anyway

P    VALIDATION_ERR, introduced in DOM Level 3.
        If a call to a method such as insertBefore or removeChild would make the Node invalid 
        with respect to "partial validity", this exception would be raised and the operation 
        would not be done. This code is used in [DOM Level 3 Validation]. Refer to this 
        specification for further information.

        If a Node is used in a different document than the one that created it (that doesn't 
        support it).
  Definitely a programmer error.

[GNOME] GXml's summer adventure: API bikeshedding to start!

If you are a developer interested in using GXml or interested in XML in GNOME, I'd appreciate your feedback on two proposed API changes contained below. :)
So GXml is back in the Google Summer of Code under the mentorship of Owen Taylor, and it's my pleasure to be able to focus time on it again, before I finally graduate.  Over the next week, I'm going to write 6 articles about the key focuses for this summer
  • Developer support: API changes
  • Developer support: migration guide, examples, patches
  • Developer support: library documentation, usage examples, online and devhelp
  • Measurements: Memory
  • Measurements: CPU, scalability
  • Measurements: developer impact
Just so you know, work done so far includes
  • cleaning up the GXml Bugzilla by closing resolved bugs and responding to others.
  • plugged the most severe memory leaks, which is its own post, which will document how I did it! 
  • test ports of dconf and glade (still testing)

Developer support

Improving developer support is the main focus for this GSoC, and it includes these tasks:
  • clean up and break API (GError & GXmlDomNode: today's topic)
  • improve examples of usage
  • improve documentation for usage
  • make sure documentation is available online and in devhelp
  • push to get external patches accepted (e.g. libxml2's vapi changes)
  • more test ports, get patches accepted :D
Today I'm just going to talk about the first task.

Proposed API changes

With the idea of making development and code readability as frictionless as possible, there are two largely cosmetic but API-breaking changes I'm considering now, before 1.0. 
Proposal 1: GXmlDomNode: Rename to GXmlNode

The motivation for this is that
  • GXmlNode will result in less typing and make it easier to read
  • GXmlDomNode is inconsistent with other names, because it's the only one that specifies its part of the DOM (we don't do GXmlDomDocument) besides DomError (which mirrors DomException in the DOM Core spec).
It's named GXmlDomNode because, with namespaced languages, GXml.Node would conflict with GLib.Node (GNode), and at the time I didn't want to write GXml.Node all the time.  However, GXml.Node isn't much worse than writing DomNode in a namespaced language, and GXmlNode is much nicer than GXmlDomNode in C.  Especially when you start working on its methods, like gxml_dom_node_append_child ();

Thoughts?  Please provide feedback as a comment below or e-mail me directly!

Proposal 2: GError: remove parametre, use global-ish variable?

Some people previously complained about our explicit handling of errors through a GError parametre as cumbersome and inefficient.  Also, the way GXml has started using GError may be excessive and not how GError was intended to be used. 

[UPDATE: GError's documentation specifically rejects using GError for programming errors, since it's intended only for run-time errors.  I've written a post analysing DOMExceptions, and whether they qualify as run-time errors or programming errors.  Comments welcome, there, too.  I basically conclude that most of the DOMExceptions are programming errors and don't qualify for GError reporting.]

The DOM Core spec specifies many possible DOMExceptions to be raised.   Currently, the methods that are expected to raise an exception are declared to throw a GXml.DOMError, but in reality, many of those do not throw anything.  (I filed bug 702832 on vala requesting warnings for functions that declare errors that are never thrown.)  I haven't implemented error handling in most of the situations because they often seem truly exceptional, and are cases that the programmer should be able to anticipate and deal with in advance  [UPDATE: and thus, I feel, programming errors, and not appropriate for GError].  (I will pragmatically support DOMExceptions as needed in the future; file a bug if you want one supported!)

Consequently, I am considering breaking API and to cease throwing errors, instead switching to either setting a thread-specific global error variable, or a document-level error variable.  I'd document whether a method might set an error, so someone can check.   This is similar to what libxml2 already does, with its xmlGetLastError.  The document's return value would also provide some indication that something went wrong (e.g. NULL).

[UPDATE: additionally, we can allow verbose error reporting, so if a programming error is encountered, we'll use g_warning () or g_error () to log it with where it happened, and where in the document.]

Right now, the functions that do throw GErrors are mostly GXmlDocument constructors, GXmlDocument factory methods (it constructs any other GXml node type), and GXmlDomNode children management (insert, replace, etc), which are all very common.  In theory, if we're going to raise an exception for everything as requested by the DOM Core spec, though, there'd be many more, and we'd have to break API anyway to support it all.

The result of removing most GError reporting should be in general usage, code should be a little smaller and easier to read, with less unnecessary text, while cases where errors are anticipated can still be caught and checked.  [UPDATE: also, we'll comply with the intent of GError]

Please provide feedback as a comment below or e-mail me directly!  Also feel free to debate the nature of DOMExceptions.

Example of changes: C
For those who don't need errors:

GXmlDomNode *vader = gxml_document_create_element (doc, "DarthVader", NULL);
GXmlDomNode *luke = gxml_document_create_element (doc, "LukeSkywalker", NULL);
gxml_dom_node_append_child (vader, luke, NULL)

GXmlNode *vader = gxml_document_create_element (doc, "DarthVader");
GXmlNode *luke = gxml_document_create_element (doc, "LukeSkywalker");
gxml_node_append_child (vader, luke);

For those who do need the errors:

GError *error = NULL;

GXmlDomNode *vader = gxml_document_create_element (doc, "DarthVader", &error);
if (error != NULL) {
  // handle error

GXmlDomNode *luke = gxml_document_create_element (doc, "LukeSkywalker", &error);
if (error != NULL) {
  // handle error

gxml_dom_node_append_child (vader, luke, &error)
if (error != NULL) {
  // handle error


GError *error = NULL;

GXmlNode *vader = gxml_document_create_element (doc, "DarthVader");
if ((error = gxml_last_error ()) != NULL) {
  // handle error

GXmlNode *luke = gxml_document_create_element (doc, "LukeSkywalker");
if ((error = gxml_last_error ()) != NULL) {
  // handle error

gxml_node_append_child (vader, luke)
if ((error = gxml_last_error ()) != NULL) {
  // handle error

Example of changes: Vala
For those who don't need errors:

try {
  DomNode darth = doc.create_element ("DarthVader");
  DomNode luke = doc.create_element ("LukeSkywalker");
  darth.append_child (luke);
} catch (DomError e) {


GXml.Node darth = doc.create_element ("DarthVader");GXml.Node luke = doc.create_element ("LukeSkywalker");
darth.append_child (luke);

For those who do need errors:

try {
  DomNode darth = doc.create_element ("DarthVader");
  DomNode luke = doc.create_element ("LukeSkywalker");
  darth.append_child (luke);
} catch (DomError e) {
  // handle error


GXml.Node darth = doc.create_element ("DarthVader");
if (GXml.last_error != null) {
  // handle error

GXml.Node luke = doc.create_element ("LukeSkywalker");
if (GXml.last_error != null) {
  // handle error

darth.append_child (luke);
if (GXml.last_error != null) {
  // handle error

I will appreciate any feedback. :)

[Microblog] Cute

This little bell guy is Google's new alert icon for G+.  He's so adorable O_O


[Technology] "element annotation from state 6 is unknown"

When compiling, I dislike seeing lots of warnings when my code compiles.

While building GXml, I encounter this for most files:

  GICOMP GXml-0.3.gir 
/usr/share/gir-1.0/Gee-0.8.gir:8:51: warning: element annotation from state 6 is unknown, ignoring 
/usr/share/gir-1.0/Gee-0.8.gir:3383:50: warning: element annotation from state 15 is unknown, ignoring 
/usr/share/gir-1.0/Gee-0.8.gir:3992:1: warning: element property from state 23 is unknown, ignoring 
GXml-0.3.gir:10:51: warning: element annotation from state 6 is unknown, ignoring 
GXml-0.3.gir:28:1: warning: element errordomain from state 6 is unknown, ignoring
The GObject Introspection compiler apparently has an issue with some elements in .gir files.  Looking at /usr/share/gir-1.0/Gee-0.8.gir, it's in XML.  Then I looked in gobject-introspection, and at it's girparser.c file, where the warning is printed.

The property element

There I found a large conditional branching block of code, start_element_handler (), that tried to identify elements by their name and their state.  If an element starts with 'p', it checks which p-elements it could be, and one such check calls start_property (), which checks if the element name is "property" and its context's state (is it either STATE_CLASS or STATE_INTERFACE?).  The element "property" is part of the third warning above.

A quick grep of Gee-0.8.gir (grep -P "(^\t<|<property)" /usr/share/gir-1.0/Gee-0.8.gir | grep -B 1 "<property" | grep -P -v "<property") shows that the parent of every property element is a class or interface, except for one, which is a <record>, and corresponds to the line number for the warning.

Indeed, some more grepping (grep -P "(^\t<|<property)" /usr/share/gir-1.0/Gee-0.8.gir | grep -B 1 "<property" | grep -P -v "<property" | sed -r -e 's,.* name="([^"]*)".*,\1,g' | grep -v "\-\-" | while read line; do grep " $line.*{$" /usr/share/vala/vapi/gee-0.8.vapi ; done) reveals that every other structure with a property extends from GLib.Object, whereas Lazy does not.  So, while Vala allows this property on this record, the girparser doesn't expect it there.

^ this explains the difference a little, with GObject-derived classes supporting managed properties, and Fundamental GType classes (which I think <record> corresponds to) supporting unmanaged ones.

I probably need to file a bug. :)  Solutions will be extending what the girparser expects, reducing what valac allows, or just simply avoiding using certain features (if I really want to ignore the warning badly enough).

The annotation element

Looking at girparser.c, there's no handling for "annotation" at all that I can find.

Inside the Gee-0.8.gir file, some problematic annotations are these:
<namespace name="Gee" version="0.8" c:prefix="Gee">
        <annotation key="ccode.gir-version" value="0.8"/>
        <annotation key="ccode.gir-namespace" value="Gee"/>

                <property name="equal-func" writable="1">
                        <annotation key="ccode.notify" value="false"/>
                        <type name="Gee.EqualDataFunc" c:type="GeeEqualDataFunc"/>

I wonder how prevalent such annotations are, and what provokes them.  I'm trying to create a test case right now, so I can file a bug.

So, for my GXml warnings, the annotations are in my Attr.vala file, with this line above the namespace start:
[CCode (gir_namespace = "GXml", gir_version = "0.3")]

I'm not sure that I actually want to avoid that.

Bug filed

For now, I've file a bug, 702824.  I'm not sure what the most desirable outcome is, but perhaps annotation and properties in records could be acknowledged and not warned about.


[Technology] SELinux and audit.log not updating

Disclaimer: I am neither a FUSE nor an SELinux expert 
So, I have a FUSE filesystem for the home directory of one of the users on my computer, and launching chromium-browser and some other programs who had data directories in the FUSE filesystem failed to launch.

Learning about SELinux

It appears that generally only the mounting user can see the mounted filesystem, so I wondered whether that was part of the problem, but testing chromium-browser on a test /tmp/ directory with permissions 700 still worked.  I then tried the regular thing, and checked if it was SELinux.  It's always SELinux.  Indeed, briefly setting setenforce 0 allowed chromium-browser to launch.  Obviously that's not a real solution; it's like taking the battery out of a beeping smoke alarm.

Recently on Google+ I perused a thread on SELinux linked to stopdisablingselinux.com, which leads to a 52 minute RedHat video on how to properly use it.  While I feel that 52 minutes is a bit long to convince the average user, I'd like to better understand SELinux, so I watched it. 

I recommend watching it if you're curious about how to work with SELinux because it was pretty clear and crisp.  Types, labels, policies and useful commands.

auditd, audit.log not updating?

Now, I'll confess that I've known there's been something amiss with my configuration, in that, for a while (since upgrading to Fedora 16!), I have not seen any sealerts.  I've confirmed that SELinux was operating and haven't had the time to diagnose the problem further.  At first I thought that sealerts were no longer being displayed by intent, but then a Fedora 18 Live USB key started displaying some.   With my new knowledge, I solved two problems in one day.

To find out what was going on with fuse and chromium-browser, I manually checked /var/log/audit/audit.log to discover that it had not been updated since November 2011!   I checked to see whether auditd was running using systemctl and ps, and it was not.  It probably hasn't started since that upgrade.  Probably systemd-migration related.  Referring to the Fedora 18 security manual, the solution to this was simple, /sbin/chkconfig --levels 2345 auditd on, so it will usually start, and systemctl start auditd.service, so it would start right now. 

Using FUSE file systems as home directories

Then, I tested chromium-browser again, sometimes starting with its user-data-dir in the FUSE filesystem, other times in /tmp/, and the problem I was encountering was this:
type=ANOM_ABEND msg=audit(1371441397.452:21): auid=504 uid=504 gid=504 ses=2 subj=unconfined_u:unconfined_r:chrome_sandbox_t:s0-s0:c0.c1044 pid=21858 comm="chromium-browse" reason="memory violation" sig=11

Sadly, setroubleshootd couldn't offer any solutions to this, so I googled ANOM_ABEND and "memory violation" and fuse, and discovered the boolean use_fusefs_home_dirs.  There weren't many search results, but this was enough.  Using setsebool use_fusefs_home_dirs 1 allowed chromium-browser and others to run normally.  Hooray!

Concluding Thoughts

Upgrading and migrating settings and customisation
So, two thoughts: Fedora and Linux distributions in general often have problems when upgrading.  Fedora used to (still does?) advise that you install through Anaconda, and I think I was supposed to install a clean system.  I don't think that's very user friendly, having to burn ISOs, and feel like it should happen in place managed by software (not during a user session, of course).  Eventually preupgrade came along, and eventually it become acceptable.  Still, though, upgrades often end up with subtly broken configuration.  gnome-documents was supposed to be notable in one upgrade, but I had to manually install it, because the upgrade didn't add it as a new package for the new release.  Worse than system configuration breaking (like auditd's autostarting at boot) might be user configuration for apps changing and rarely is any migration offered.  I have config files that are many years old that are no longer used and just sit there, or contain now invalid configuration.   There are stale gconf keys.  One solution is to start fresh and copy over data, but then it's a pain re-onfiguring all my favourite apps, and I might not know what customisations I've lost.  One solution is to reduce the amount of customisation that is allowed, so you don't have to support complex migrations later, and I feel like that's the current trend.  I think I'd like a standardised settings and migration standard.  I suppose GSettings and dconf helps deal with a class of settings within GNOME applications, but of course many tools are not GNOME, and even many GNOME applications store data in ~/.config/.  Ah well.  At least awareness and familiarity with my system (a luxury) helps me avoid anything catastrophic, though not so much, as I haven't had time to fix my SELinux logging for over a year.

User feedback from security applications

SELinux is getting better, with sealert and setroubleshoot, but it and the firewall have some issues in offering feedback to users.  Even with auditd and the other tools, SELinux wasn't able to indicate to me that use_fusefs_home_dirs set to 0 was preventing my browser from running.  It's the type of feedback that would be nice to save me an hour of my day.  I've seen many neat features appear in applications, using mDNS networking and Avahi, that "mysteriously" don't work, and in reality it's because the firewall silently blocks it.  Promoting features in applications that can't work out-of-the-box and where the user can't readily know why it isn't working is sad.   Perhaps developers are afraid of the syndrome where you present security information to a user and then they blindly click "allow" to everything, no matter how dangerous or malicious.  Is that better or worse than googling and reading in a dozen forums the solution of "disable the firewall" or "disable SELinux" for people who can't be bothered (time is precious) to understand and crisply fix their problem.


[Microblog] Transient Thought

If I had a pet cat, I would name my cat 'My Cat'


[General] the sound of summer

Since discovering the duo Boy and their album Mutual Friends, I just looked up when my favourite artists and bands were going to be in the area, and just discovered that Rae Spoon is coming to Toronto and Owen Sound this month, the latter of which is the large town closest to my home village. 

Here is Boy's "Little Numbers":


[General] Proof of Enrolment

I have often had need to prove my enrolment at my university.  Typically, this involves submitting a request at Student Client Services desk and then coming back later to get a sealed envelope that I then mail to people.

Really, for authentication, this is ridiculous.  I should be able to log into my university account (we use WebAdvisor) and click "Provide Confirmation of Enrolment" and get a secret URL to provide to the interested party, so they can visit it and see proof.

Something like
  • visit webadvisor.uoguelph.ca, log in, and click "Provide Confirmation of Enrolment"
  • This gives me a unique, random URL to http://enrolled.uoguelph.ca/1bc5ff9f7dfa1e6d
  • I give this to the interested party, and when they visit this page, it shows my name, photograph, university e-mail address, department, program, and enrolment status.   Or maybe not even all of that, just what they need.
The reason why I say random and unique is because if we had a directory where you simply queried the person, it could be abused by the very few stalkers people need to be concerned of, so they can't simply look to see if I'm somewhere.  (That said, Guelph already has a public directory for names and e-mails, which is often handy, especially when you locate someone's lost student card.)

[General] Canadian Passports and the future

I'm applying for a passport renewal.  Mine expired in April, and I hope to go to the Czech Republic for GUADEC in August.

Filling out the renewal form asks me tough questions like how much I weight (I don't own a scale), how tall I am (I don't have a long enough tape measure) and what colour are my eyes (they're, uh, mottled?).  I'm not sure what I put down on the last one (a lot of things have changed since then), so I made due.  Shining a really bright light into your eye in front of a mirror really helps reveal how beautiful the iris is and leaves a white streak in your line of sight for many minutes afterwards. 

One of the neat things that I've had to decide was whether I wanted to renew it now, two months before travel, or wait until the start of July for the new 10 year ePassport.  Not having to renew it again for another decade almost sounds like fun.  However, along with the new passports comes increases in passport fees, which I'm not interested in paying right now.  Also, it would leave a small window of just one month to have my new passport delivered, which would make me nervous.

Besides, I've already missed out on one impromptu trip across the border this year, I don't want to miss out on another because of a passport!


[General] Telephony

Hooray!  The CRTC has a new wireless code to simplify phone plans for consumers
  • contracts effectively no more than two years
    • effectively, because they can be longer, but cannot charge cancellation penalties after 2nd year
    • cancellation fees within contract can only amount to the remaining cost of the phone, and nothing extra; each month of a contract must deduct an equal amount from the cost.
  • overage caps, unless the customer agrees to pay more in advance
    • maximum $50 overage charges for data
    • maximum $100 for roaming charges
  • unlockable after 90 days or when fully paid, whichever first
  • 15 day free trials
  • "clearer" contract language
In other news, Telus isn't allowed to buy Mobilicity.  So, Mobilicity may go bankrupt, and so may Public Mobile, and even WIND Mobile.  I sometimes think that might be a better alternative.


#General #Microblog friends #Technology life gnome music google iaido guelph fedora vegan bugs food school #GNOME linux technology #School jodo blogger gxml #Budo #Photos work web nature happy vala firefox android art Flesherton anime internet travel home open source stress kendo kosmokaryote writing animals birthday dad science security canada computers environment future cookies development german language photos programming reading sick sleep snow video winter GUADEC cell phones css fun learning love me movies people phone picasaweb ta time christmas evolution vancouver vegetarianism #Vegan Toronto ai git gsoc identity new zealand society speech vlogbrothers adventure birds communication dreams facebook google+ gseta happiness libgdata netflix night responsibility skedge stars tea tv video games wind mobile Nintendo baking cake consumerism design fedora 17 javascript memories nlp organisation photography quote tablet uoguelph Josh Ritter animalia blogging books bug encryption family humanity magic meaning memory money pidgin rain recipes speechdispatcher sushi weather #Reading Spain TAing The Frames cat chocolate cold cycling death emusic film flight genderguesser gitorious halloween health knowledge languages liv mail new years nightmares politics productivity psychology software swords the legend of zelda ubuntu web development xml xorg youtube Thanksgiving acer bc busy change conversation cooking duolingo emacs fedora 18 galaxy nexus gay rights gmail japan libxml2 martial arts materialism mozilla nerdfighteria nostalgia privacy rhythmbox sound space university upgrade valentines wahoo walking water web design Con-G Europe John Green Scott Pilgrim age animal welfare apple autumn bash blog brain brave breath of fire II calm camera canada day clothing comments confidence conservation creativity culture dance dataloss djaqua duplicity e-mail emotion english errors feminism gdom germany goals google reader gtk humour intelligence japanese laundry law light math morning moving ottawa peterborough pets philosophy pie quality research sei do kai shopping spring style summer value village vday vonage website x11 #Life New York alone anime north anxiety argument backup budo buffy business cats computer science concert copyright data loss diy eating economy education energy exercise failure fedora 19 feelings file systems flowers freedom french friend games gdata greyhound growth habits heat history house html ice cream im information java joy koryu laptop living lost microsoft mood moon muffins mystery news nz pain photo php physics pirates pizza play poverty preupgrade progress purple python rae spoon reality reflection religion rss self serialisation sharing skating social sun synergy tachi uchi testing themes thesis thinking thought thoughts transit turtles veggie challenge velociraptors violin weekend weird yum zellers API Air Canada Empathy Grimes Hank Green Hugo Jane Austen Lord of the Rings Nexus One OCUS Sudbury Trick or Eat arboretum audible autonomous automobiles beauty bike blogs browsers camping cancer canoeing celebration charity chrome cleaning colour community content corporations crafts decay decor depression depth disaster drawing epic equality experience faery fest farmer's market fedora 12 fedora 16 fedora 20 fedora 22 fedup fireworks gender ghetto ghosts glib gnome blog gnome shell google talk green hair hobocore hungry icarus instant messaging interest introspection jobs last exile luks macbook mail-notification mario meat in vitro mind mom moon festival motivation mtp ninjas oh the humanity pagans pants papers past performance perl phones picnics pitivi plastic pride pumpkin pumpkin pie quiet thrill receipts rogers rpm seminar sewing simple simplicity sleep deprivation smells soy milk speech dispatcher sports stories story telling strange streamlines swimming telephone temperature texting thrift stores time management time travel tragedy truth understanding united states urban ecosystems usability usb veganism voice volunteering webschwerver wild wireless working world yojimbo zoology Avatar: The Last Airbender Blassreiter CIS*2750 CIS*6890 Czech Republic Diablo Dresden Codak Dunedin Dutch Blitz Electric Networked Vehicle Elliott Brood Ender's Game France Fringe GNOME 3 HTC Hayao Miyazaki Mario Kart Montréal Network Manager Newfoundland Nintendo Switch Ontario Ouran Host Club Richard SVC Samsung Samurai Champloo Santa Claus Studio Ghibli TCAF US academics adb advertising aeroport algonquin amusing animal agriculture apartment ask automation awkward bad movies banana bats battery beard belladonna beta bicycle book branding breakfast brno bus buses buy nothing day cabin calgary candy cards cars catastrophe celebrate celtic chat cheap cheese childhood china chinese calendar cities clarity clean clock comics compassion compiler computer conspiracy theorists consumption context convention cookie cool cornerstone cosplay cottage country court creation cthulhu cupcakes curiosity cute dancing dark themes dbus definition deja-dup democracy despair detachment dinosaurs discomfort dns dodgeball dragon dress dust dystopia earth earth day efficiency eggs elections email enhanced history ethics evil exhausted expectations exploring ext3 ext4 fail fair trade fall fashion favourite feedly ferry focus fonts formal free friendship fruit fudge full moon furniture gaelic game boards garden gardening gee generosity genetics gimp gir gobject good google hangouts google wave government grading gratitude green roofs groups gsec guerilla gardening haircut hakama help homosexuality honesty howl hp human rights humanitarianism humility hypocrisy ice images imaqua instagram integration intellectual property internet explorer jabber jazz jelly bean jokes kernel keyboard knife labs last exile: fam the silver wing laurena lazy letters library libxml livejournal lizzie bennet loneliness loss lovely lyrics maps maturity meditation melancholy metadata microbes microfinancing microwaves moon cake morality mother music concert muso jikiden eishin ryu myth namespaces nasa nautilus nerdfighter neural networks nintendo 3ds normal normality notes obsolescence oceans open open souce open standards panasonic paper parties patches peanut butter perception personal perspectives philanthropy plants pleasant poem politeness potluck preparation problems ptp pulseaudio quidditch racism recreate redundancy relationships relax repairs resizing richard's room roomba roses rsync running sad sadness salsa samurai sanity scary schwarting seasons self-esteem self-navigating car selinux semiformal senility sensitivity sentimental sheep ships silicon motion sleeping in sms social justice software engineering solitude solutions songs soup speed spelling ssh star wars strangers stupid success sunset surreality survival skills suspense sustainability sweet sympathy symphony tardigrades tasks teaching technical communication and research methods test tests thrift tim tams time and space tired tools tracker tradition tranquillity transience trees trust tumblr twitter update user experience utopia via vihart vlog waffles warmth waste waterloo wave web comic webfonts webkit wii wiki winter is coming wizard wonder woods words xmpp yoga youth zoo #Gaming #Wishlist #anime #general 1. is anyone reading this? 1602 1984 2. you win a prize! 2008 2014 24fps 3. gimme a call to collect 404 A Short Hike All My Children Andy Griffith Argentina Armstrong House Avatar: The Legend of Korra BarTab Beach House Boston Boston Summit British Columbia Businesses C CIS*6050 Cambridge Christopher Plummer Claymore Creatures Darker than Black David Attenborough Dear Wendy Docking Station Dollhouse Earthbound England Excalibur FOMO February Fergus Final Fantasy IX Fire Emblem GError GNOME Files GSA Go Google Play Music Hunger Games I am not okay with this I believe in a thing called love I'm a wizard IRC Ikea Ireland JRR Tolkien King Arthur Lost Lagoon MIT Mac OS X Madrid March Massachusetts Matlock McGuinty Melodies of Life Merlin Michael Cera Mother Mother Mr. Tumnus Narnia Neil Gaiman New York Philharmonic Nick and Norah's Infinite Playlist Nintendorks Norns North Korea NotesFromNewYork Olympic OpenShot Orphen Orson Scott Card Oscars PEAP Pauline Johnson Pete Peterson Planet Fedora Porco Rosso Questionable Content R ROM Rent S SIM Wireless Sauble Beach Sega Sega Genesis Selenium Shakespeare She-Ra Snakes and Lattes Splatoon Star Trek Steve Grand Stranger Things ThanksLiving The Darkness The Devil is a Part-Timer The Fifth Estate The Guild The Hobbit The Stand Tianjin Tim Hortons Tolkien UI UK UX VPN Will Grayson Will Grayson Wolves in the Wall WordPerfect Xiki [General] abrt absolutism abuse academia accessibility active activism activity addiction adreama adrift adulthood advertisement air airport express airship ajax al gore alarm clock albums aldiko alice in wonderland alien alistair summerlee amateur amazon ambience ambition amy winfrey anaconda and imperfection angle angry birds anhosting animal cognition animation anon anonymity ant apache apology appearances appreciation aqualab arcade architecture arduino arrogance assassins assignments association analysis astrid asus eee top asynchronous ati attachment attitude attribution audio aural abuse authentication authenticity automake automarker avatars awesome b43 backpain backtrack3 backyard bounty bad bagel bandwidth banjo banks barbarians barefoot baseball bathroom beaches beautiful bed bees beetles being belief bellaqua benedict cumberbatch berlin bertrand russell bill gates biofabrication biology biometrics bit rot bitcoin black and white blame blockbuster bloomberg blue board games bohemian bold bon thé place bonds border boredom botany boxing day boy brain scoop brickworks broadcom broccoli browsing bubbles bubbly buildings bunnies burn bus stops butterflies buttons c# c++ cafe calendaring calligraphy camel camera obscura cameras canadian english canopy capitalism captivity careless caring cast causality cbc cedar row cello censorship certainty cgi chalk challenger changing locks chaos theory charm cherry blossoms chickadee chickens chivalry choir chopsticks chores christchurch christianity chudan church cijf cinnamon classes clif clorox clorox green works cloud cloud atlas clubs cname coca cola codeine codeviz cognition coincidence coins color comfort commons communism competence competition competitive coughing complaints completeness compliments conference configuration conflicted confusion consciousness consent conservatives conservativism console construction constructive criticism contagion contest contributing convenience corpses cough suppressants coughing coupons courageous crashes crates crayons crazy creative commons criminals crisps criticism crosscanada crowd crtc cry crying cryptic cryptozoology csh cuddles cult currency current tv curse customer service customisation cuttlefish cvs daily grind data data mining databases dating david bowie dconf debate debug symbols debugging delicious design patterns desktop desktop summit destiny dftba diet difficult digimon digital receipts disabilities disappointment discordianism discourse discoverability dispute dissection kit distraction diyode dnf doctor who doctors documentation dokuwiki doubt doughnut dpkg drab drano drano prevention dream dreaming drinking drm drowning dryers drying dtwydt ducks dvds dying dynamic typing ease easter easy ebony jewelwing ebooks ecards economics editors eeetop el paso elder neglect electronic receipts elements elitism ellen page embarrassment emily graslie emptiness empty enchant end of enterprising environmental science symposium eog epiphany eplugin equipment essentialism ether euphoria evoaqua experiment experimenting expertise extensions extortion facades faith falafel familiarity fan fancy fantasy fascism faun favicon fears fedora 11 feed me feedback festival fibonacci fiction fiddler crab field guide field identification figment figures of speech file formats finances fire fish fitness fixing flac flash light flesherton fling flexibility flour flow flying footprints forceps forgottotagit fork fortunate fortune found fragaria frameworks fraud fred penner free time freezing french fries fresh friday friend's wedding frog fspot funding funerals funny fury fuse gargoyles gdb geek geeks gf3 gi gifts gio gitlab gjs glass globalnewtgames glory gloves glue gluten gm gmo gnome keyring gnome software gnome-control-center go ninja go go transit goat gods goodbye goodfella's google assistant google books google calendar google chrome google wallet gp2x gqe grad graffiti grammar graphing graphviz grass green beaver grey county groceries growing up gtest gtg guts gvfs gvfs metadata gypsies habit hal halls hard hard drive hard drives hardship hardware harry potter hdtv heart heart break heaven 17 hemlock grove hewlett packard hijinx hiking hoaxes hobbies holidays homelessness homework honey badgers honour horatio hornblower horror hostels hosting hot house of cards hp lovecraft hugs humblebundle humbleness hunting hyperlinking hyrule i am a carpet ibm thinkpad x41 icalendar ice cream sandwich ice rain icthyology ignorant ill image image editing imagination impermanence inadequacy inaturalist inconvenience independence india individuals industry infinity ingrid michaelson inhumanity injuries ink innovation insects installation intel interactivity interlocutor internet tv invertabrates io irish irony isolation it it is indigo james bond java 13 jedi jikiden joke journalism journey judgement julian assange julie thiel justice kata kayak keys ki-ai killme kim taylor kinder kindness kirby kitchen kitzl kiva knights knots kodak koodo kung fu labels landau sacamoto late laundromat led legend lending lenovo lessons letsencrypt letstrace letter writing liberalism liberals libnotify libreoffice librpm lifehacker lilo limericks limits linksys liquid lists live wallpapers livecd liveusb loans local local food local install login london losher lots of hugs mac mini machine learning machine vision madness mae magic school bus magical maintainership majesty malaria malls mantis shrimp marine life marketing marking massages matrices maturation may seminar meat media medicine mel's diner memory leaks mental health meow mercy messaging metacity metaphor methodology mezzo forte micropayments mild mild weather military milk mindhacks minimalism misanthropy miscellany misery misfortune missed the boat missing mlp modelling moisture mold molly parker monitors monologue more cats mosquitoes moss mother's day mounting mouse moxies muffin muffinfilms mundane murder museum mushishi mushroom soup mushrooms musicals mutual funds my slumbering heart mysql nameservers nanowrimo national treasure natural language processing naturalism nausicaa navigating necessity neighbours nervous netgear network new new users newspaper hat next year ninja turtles nodelist nointernet noise noisy nominate non-root norse noses not really dying notebooks notification-daemon novels november fair nuclear war numbers numix obama obligation obliviousness obscure ocz ogg oggenc olap olive omote open formats open music openness openoffice optimisation optimism orcas orchestra oreo oreos org-mode origami oscar otr overheat owen sound package management packagekit packing paint shedding pan pancakes panda parallelism paranoia passport patents patience pattern recognition pdo peace peaceful pen pence pender penguins penmanship perfection pet rocks physical piano pickman's model picnik pidgin plugins pikmin pintsize pipelight pirate festival pizza hut plagiarism planning plans playground playlists plumbing plushies podcast poetry points pokemon polls pomplamoose positions posse post posters postmodernism potatoes potlucks power ppc practise prejudice premier pressure pretty pride and prejudice priorities private processes professionalism progressive web apps projects promise protest proud purchases pwa qt quarantine rad radeon railroad randall munroe raop rats reagan recursion recycling redhat reductionism refactoring refrigerators regret relativism release renew renfrew repetition report resolutions resolve resumes reuse reuters reviews revolution rhino rhps ricola risk road trips roar robots rockwood rot rover rtm ruby day ryu safety sanctuary sand satisfaction savages scary movies scheduling schneier scholarships scooters scp screenshots script seals search secret world of arrietty secrets seitei self-interest self-respect self-sufficiency self-worth semesters senescence sessions setbuilder settlers of catan sftp shame sheepo pistachio sheila patek shell shells sherlock holmes shipping shogun shotwell shoulder bag sigh signal sim city simafort simpsons sincerity singing sjr skill skunks sky slackware slashdot sliver small smartphones smiling snails sneezing snowboarding soccer social dance social media socis soft solemn someonesmotherwantstoadoptme song sony sophistication sorbet sorrow sparklers speed river spell spellchecking spies spilt milk splendid splendor splinter spoilers sponges sql squaresville sr ssd sshd stanley park starry night starving steampunk storage strawberries strength structured information struggle stuff stylus suburi sucks sugar super mario super mario land 3d superiority superstition surprise surprises surreal sushi surrender swings systemd systems tabs tachi uchi no kurai tail coats tameshigiri tarot taxes tears technocracy teddy bears tedtalk term termcap terror the duke the fault in our stars the hulk the human league the irregular at magic high school the onion theatre theory thingsidon'twanttodo tim berners-lee tim mcgraw timber timbre timeliness tin tin toaster todo toilets tolerance tonight toomuch touch screen touchpack tour tourniquet towels toys trac trailer translation travel buddy treestyle view trex triumf triumph trivia trouble tweak twist tx2500 tx2617 typing ugly logos umbrellas un dinaru underwold unemployment universe unlimited blade works updates upgrades uploading urban agriculture urban ecology urchins vagrancy vagrant vague but exciting valadoc validation values vampires vanilla ice variety vegetables velvet burger verb version control vi vinegar violence voip vpnc vulnerable waf wandering wanting war warm wayland weapons web hosting webcomic webcomics werewolves whales what a wonderful town whatsbetter whic are also lazer powered white spot wifi wii u wikisource will williams wings wisdom wishes wizardry wolf wonderland wordplay world cup world water day writing voice xenophobia xephyr xinput xkcd xpath yahoo yay yyz z-index

Blog Archive