2013-06-29
[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.
2013-06-21
[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?
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.
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.
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.)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.
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.
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 N DOMSTRING_SIZE_ERR 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. P HIERARCHY_REQUEST_ERR 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. P INDEX_SIZE_ERR 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 P INUSE_ATTRIBUTE_ERR 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? ?P INVALID_CHARACTER_ERR 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 *Document.adoptNode Document.createAttribute Document.createElement Document.createEntityReference Document.createProcessingInstruction *Document.importNode Document.renameNode Node.prefix.set Element.setAttribute DOMImplementation.createDocument DOMImplementation.createDocumentType ? 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. DOMImplementation.createDocument DOMImplementation.createDocumentType DOMImplementation.createAttributeNS DOMImplementation.createElementNS DOMImplementation.renameNode Node.prefix.set P NOT_FOUND_ERR 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. ?RP NOT_SUPPORTED_ERR 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. ? NO_DATA_ALLOWED_ERR 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. ?PR NO_MODIFICATION_ALLOWED_ERR 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 DOMConfiguration.setParameter 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. P WRONG_DOCUMENT_ERR 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!
Posted by
Richard
at
17:05
Labels: #GNOME, API, bugs, development, errors, gsoc, gxml, paint shedding
Labels: #GNOME, API, bugs, development, errors, gsoc, gxml, paint shedding
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
Proposal 1: GXmlDomNode: Rename to GXmlNode
The motivation for this is that
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.
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
- 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
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).
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);
becomes:
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
}
becomes:
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) {
}
becomes:
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
}
becomes:
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. :)
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);
becomes:
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
}
becomes:
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) {
}
becomes:
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
}
becomes:
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. :)
2013-06-20
[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.
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.
https://live.gnome.org/Vala/Manual/Classes#Types_of_class
^ 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).
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"/>
</property>
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.
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.
https://live.gnome.org/Vala/Manual/Classes#Types_of_class
^ 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"/>
</property>
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.2013-06-17
[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.
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.
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.
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!
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.
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 customisationSo, 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.
2013-06-11
2013-06-06
[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":
Here is Boy's "Little Numbers":
2013-06-05
[General] Proof of Enrolment
Posted by
Richard
at
20:37
Labels: #General, authentication, identity, internet, organisation, school, systems, technology
Labels: #General, authentication, identity, internet, organisation, school, systems, technology
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
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.
[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!
2013-06-04
[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
Subscribe to:
Posts (Atom)
Labels
#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
-
▼
2013
(218)
-
▼
June
(12)
- [Microblog] The Dark Side of Life
- [Technology] GNOME Shell, memory usage, CPU usage,...
- [Technology] DOMException, its nature and appropri...
- [GNOME] GXml's summer adventure: API bikeshedding ...
- [Microblog] Cute
- [Technology] "element annotation from state 6 is u...
- [Technology] SELinux and audit.log not updating
- [Microblog] Transient Thought
- [General] the sound of summer
- [General] Proof of Enrolment
- [General] Canadian Passports and the future
- [General] Telephony
-
▼
June
(12)