Search Results: "ana"

12 June 2007

Bastian Venthur: 1 Kilobyte = 1000 24 bytes

Could you exactly say how big your hard disk has to be at least when the vendor claims it’s 500 Gigabytes big? Do you know how many bytes a file has when the filemanager says 2 Megabytes? Do you know what your DSL-provider actually means with 2 Megabit per second? Experienced users surely can since they know the meaning of “Kilobyte” depends on the context. Sometimes it’s 1000 bytes, sometimes it’s 1024. Non technical users will tend to assume that a 1 Kilobyte is 1000 bytes (which is correct, since k is the SI prefix for kilo) while users with technical background will tend to assume (depending on the context of course) it’s 1024. There is a solution for this ambiguity, but unfortunately it doesn’t come for free: First, it sounds really stupid (kibi-what?) and second it will add an extra character (kB -> kiB) and we all know how stuffed our 80 column terminals already are nowadays. If you have better arguments against the binary prefix notation please, join the discussion. Personally I’d find it very cool if we could use SI prefixes where we mean n * 10^3 and binary prefixes where we mean n * 2^10 in Debian consistently.

Antti-Juhani Kaijanaho: Benja on denotational semantics

My friend Benja Fallenstein got carried away in the comment section of my latest post on recursion and wrote a tutorial on how it all relates to denotational semantics. It’s a shame it is buried somewhere in the comments, so I am reposting the comment here with Benja’s permission. The tagline is, Denotational semantics tutorials. It s the new monad tutorials!
Benja Fallenstein writes: Having read and understood [the] entire post, I can now summarize Antti-Juhani s complaint in a way that programmers with no theoretical background will understand: The definition is an infinite recursion. Sure, it s self-referential, but since it recurses forever, it doesn t actually define what recursion is! :-) That said, I find it kind of a pity to introduce all this theory without talking about why it nicely models the real world. Antti-Juhani argues that this pretty much the definition of popularized science, but I have to admit that, as definitions go, I like recursion: see recursion better. :) So let me have a quick go. [UPDATE: Didn t turn out to be quick at all. This is, in fact, as long as Antti-Juhani s original post. Proceed at your own peril.] All of this comes from denotational semantics, which is concerned with what expressions in a programming language mean and which ones mean the same thing. For example, 7 denotes the number seven, 7+2 denotes the number nine, and 5+4 also denotes the number nine. Now, here s the knotty problem. If we have f(x) = if x = 0 then 1 else x*f(x-1) then f(4) denotes the number twenty-four, but what does f(-2) denote? So, denotational semantics introduces a new, special value, recurses forever. An expression of type integer either denotes an integer, or, like f(-2), it denotes recurses forever. Now, about these partial orders. (Reminder: A partial order says, for every pair (x,y) of elements of a certain set, that x is smaller than y, equal to y, larger than y, or incomparable to y.) Here is Benja s guide to what the partial orders of denotational semantics mean: Let s say that you write a program where, in one place, you can plug in either x or y. If you can write such a program that prints foo when you plug in x and prints bar when plug in y, then x and y are incomparable. If you can t do that, but you can write a program that prints foo when you plug in y, and recurses forever when you plug in x, then x is smaller than y. If every program you can write will do the same thing whether you plug in x or y, then x and y are equal. (We ignore details like out-of-memory errors and *how long* a program takes to do something.) Examples: - 5 and 7 are incomparable. Proof: if ___ == 5 then print foo else print bar . - f(-2) f(2). Proof: if ___ == 2 then print foo else print foo if you plug in f(-2), this will loop forever, if you plug in f(2), it ll print foo . - (5+2) = 7. Whatever program I write, it will do the same thing, no matter which of these expressions I plug in. Now, with expressions of type integer, the resulting partial order is: Recurses forever is smaller than everything else. All other values are incomparable. Recall from Antti-Juhani s post that the bottom element ( ) is defined to be the smallest element of a mathematical universe (if such a beast exists). Since recurses forever is smaller than everything else, it s the bottom element of this universe. That s what denotational semantics calls it. (Haskell, too.) Of course, this partial order is kind of boring (the technical term is flat ). It gets more interesting when we consider functions. In general, we can talk about functions from values of type S to values of type T, where we already know the partial orders of S and T. In particular, we can talk about functions from integers to integers. Now, if you can find an x and a program that prints foo when you plug in f(x) and bar if you plug in g(x), then you can write a program that prints foo when you plug in f, and bar when you plug in g. (Exercise! ;-) ) Further, denotational semantics wants applying a function to a parameter and then doing something with the result to be the *only* way you can get information about a function. No f.get_function_name, please. (If your programming language has that, you can t map the functions of your programming language 1:1 to the functions of denotational semantics.) By my rule above, this implies that f = g if and only if f(x) = g(x) for all x. Since formal theories can t have fuzzy stuff like my rule, denotational semantics takes this as the *definition* of the partial order on functions. The bottom element of this mathematical universe, then, is the function that always returns bottom, no matter what it is given or in other words, a function that recurses forever, no matter what parameter you pass to it. (Side note. Denotational semantics allows only monotone functions that is, if x = y, then f(x) = f(y) for all f, x, and y. That s an example of how all these definitions allow us to make formal statements about the real world. In the real world, if you can find a function f and a program that prints foo when given f(x) and bar when given f(y), then you have a program that prints foo when given x and bar when given y so if f(x) and f(y) are incomparable, then x and y must be incomparable, and the other way around, if x and y are comparable, then f(x) and f(y) must be comparable, too. (This reasoning doesn t exclude the case that x = y and f(x) >= f(y). If you really care, prove it yourself. :) ) This ends the side note.) Recall, now, Antti-Juhani s definition of recursion: An equation of the form x = some expression (which may contain x), interpreted as a recursive definition, defines x to be the smallest value satisfying this equation. The models constructed in denotational semantics have the property that for any equation of this form, the set of values satisfying it does have a smallest element, so x is well-defined no matter what the equation is. It s important to note that this does not mean that x has to be bottom, because there are equations to which bottom is not a solution. Let s look at a slightly simpler example than the one Antti-Juhani gave. f(x) = if x = 0 then 0 else f(x-1) We have f(0) = 1, but bottom(0) = bottom, so f can t be bottom. The equation has more than one solution, though. It is satisfied by a function that returns 0 for x >= 0 and returns bottom (recurses forever) for x 0; but it is also satisfied by a function that returns 0 for every input. And by an infinite number of functions that return 0 for some negative inputs and bottom for others. We want the first of these solutions, of course, because that s what we get if we interpret the equation as a computer program, and computer programs are what we re trying to model. But we re in luck: The first solution is smaller than all the other ones, because for all inputs, they either return the same value, or the solution we want returns bottom and the solution we don t want returns 0 (and bottom 0). The point of it all is, of course, that when we interpret an equation as a computer program, we always get the least value satisfying the equation (if we use a partial order that follows my rule, above). And that, my friend, is denotational semantics.

Enrico Zini: callgrind

Callgrind Not many people who work in C and C++ seem to know this:
apt-get install kcachegrind valgrind
valgrind --tool=callgrind programname
kcachegrind callgrind.out.nnnnn
You can see in what functions the program spent its time, for every function in the program how much time it spent in every of the called functions and all other sort of cool analysis. And it's graphical, interactive, useful, cool. It helps to compile without libtool (otherwise you're valgrinding a shellscript unless you do something like valgrind --tool=callgrind .libs/lt-programname. It also helps to compile with debugging symbols.

Evan Prodromou: 23 Prairial CCXV

I'm listening to The Current on CBC and they're interviewing the product manager for Google Maps about the Street View feature. The question: "Couldn't this technology be used by terrorists?" Let's go ahead and answer this oft-repeated question once and for all: of course it could. Practically any technology or information source that's useful to the general public would be useful to terrorists. Terrorists benefit every day from self-service gas stations, sliced bread, walk/don't walk signs, and pocket dictionaries. All these advances, and many more, have helped terrorists in their daily lives and in their evil plans. They also help the rest of us. There are very few technologies or infrastructure improvements that are useful to Good People that aren't also useful to Bad People. It would probably hamper the work of terrorists if we tore up the public roads, forbade the sale and transport of household cooking oil, and mandated inconsistent and illegible spelling in all print publications. It would also cause the rest of us a lot of inconvenience and harm. Of course, the converse is not true: there are plenty of technologies that are only useful for doing very bad things. The question we should ask with any technology is, "Does it have enough general-purpose usefulness to offset possible misuses?" Rigging every railroad bridge in North America with dynamite and a convenient nearby plunger is an initiative that has very little utility for anyone with good intentions. Enhanced mapping tools? Probably not in the same class. We live in a world where evil folks use the tools of everyday living to take civilian lives. If we turn our technological society back to the Neolithic, it's not going to change that -- it's just going to take longer for people riding donkeys to come brain us with stone axes. I don't think it's worth it. tags:

Antti-Juhani Kaijanaho: On recursion

Note: This entry has been edited a couple of times (and might be edited in the future) to remove errors. Thanks to Benja Fallenstein for critique. My previous post about recursion drew some comments. This is a topic that frequently confuses me, and there is a lot of confusion (some of it mine) in the blog post and its comments. On reflection, it seems prudent to examine what recursion really is. Consider the following recursive definition: 0 is an expression; if T is an expression, then sT is an expression; nothing is an expression that doesn’t have one of these two forms. Now, it is clear that 0 is an expression. It is equally clear that sssssK is not an expression. In some applications, it makes sense to consider infinite expressions like “…ssssss0“; that is, an infinite number of ss before the final 0, and in others it doesn’t. Is that infinite utterance and expression? It does have one of the forms given in the definitions, so it is not forbidden from being an expression, but neither is there anything in the definition requiring that it is. It is helpful to do this a bit more formally. Let us translate the self-referential definition into a set equation: The set of expressions is the set E that satisfies the equation

E = 0 ∪ se e ∈ E

But this definition is bogus! There are more than one set E that satisfies the equation, as remarked above, and thus there is no “the set E”! We need to fix the definition in a way that makes the set E unique. The key question is, do we want to regard the infinite utterance discussed above as an expression. It is simplest to just say “the set of expressions is the smallest set E that …” if we want it to not be an expression, and if we want it to be an expression we should say “the set of expressions is the largest set E that …” Let us make the following definitions:
Consider the set equation S = … S …, in which the set S is alone on the left-hand side and occurs at least once on the right-hand side. This equation is a recursive definition of the smallest set S satisfying this equation, and a corecursive definition of the largest set S satisfying this equation.
Thus, a definition like

E = 0 ∪ se e ∈ E

is not recursive because of its form; it is self-referential. By itself, it is an ambiguous and thus bogus definition. We use the words “recursive” and “corecursive” to indicate the intended method of disambiguation. A rather nice example of this can be seen in the treatment of algebraic data types in strict (ML-style) and nonstrict (Haskell-style) functional programming languages. Consider the declaration (using Haskell syntax)
data IntList = Nil   Cons Int IntList
This can be read as a set equation as follows:

IntList = Nil ∪ Cons n x n ∈ Int ∧ x ∈ IntList

Now, as a recursive definition, it is restricted to finite lists as found in ML, but as a corecursive definition, it also allows infinite lists as found in Haskell. (It unfortunately fails to address the question of bottom-terminated lists, which also can be found in Haskell.) As it happens, the technique is not limited to set definitions; but to generalise it, we need to discuss a bit what we mean by the terms “smallest” and “largest”. In a set context, a set is smaller than another set if it is the other’s subset. Notice how this makes the ordering partial, that is, there are sets that are not comparable (for example 1 and 2 ; neither is smaller than the other, but neither are they equal). A collection of sets does not necessarily have a “smallest” set (that is, one of the sets that is a subset of all the others). However, we can always find the lowest upper bound (”lub” or “join”) of a collection of sets as the union of the sets, and the greatest lower bound (”glb” or “meet”) as the intersection of the sets, and if the lub or glb is itself a member of the collection, it is the smallest or largest set of the collection. Haskellists will find things instantly familiar when I say that the smallest element of a mathematical universe (if it exists) is called bottom and is denoted by ⊥; somewhat less familiar will be that the greatest element (if it exists) is called top and is denoted by ⊤. A partial function is any function that needs not be defined everywhere. For example, f(x) = 1/x is a partial function on the reals (it is not defined for x = 0). We can form a partial ordering of (partial) functions having the same domain and codomain by specifying that f is smaller than g if f(x) = g(x) for all such x that f(x) is defined. Sometimes it will make sense to specify that f is smaller than g if f(x) is smaller than g(x) for all such x that f(x) is defined. Now, it happens that all collections of functions have a lub; and in particular, the partial function that is defined nowhere is the smallest function (the bottom function). Now, with this definition of “ordering” of functions we can apply the definitions of recursion and corecursion to functions. For example, consider f(x) = f(x) + 1. The bottom function (defined nowhere) qualifies, since undefined + 1 is undefined; thus it is the smallest solution to the equation and thus this equation is a recursive definition of bottom. However, consider f(x) = if x = 0 then 1 else x*f(x-1): any solution to this equation must have f(0) = 1 and thus the bottom function is disqualified. In fact, the smallest solution is the factorial function, and thus the equation is a recursive definition of factorial. In the comments to my previous entry, I was asked whether the Haskell definition “ones = 1 : ones” is recursive. Of course, the question in itself is nonsensical; whether it is a recursive definition or something else (such as corecursive) depends on what the programmer intends. I will interpret this question as whether the equation is a recursive definition of the intended result, the infinite list of all ones. First, observe that we can order Haskell lists (including the special “undefined” list) partially as follows: l1 is smaller than l2 if l1 is undefined, if they both are empty lists or if a) the first element of l1 is smaller than the first element of l2 and b) the tail (the list with the first element removed) of l1 is smaller than the tail of l2. The undefined list does not qualify as a solution for “ones = 1 : ones”. No finite list qualifies either. The infinite list of all ones does qualify, and it is the only solution; hence, the equation is a recursive definition of the infinite list of all ones; it is also a corecursive definition of the same list. Finally, let us consider the question that started it all: what should we make of the definition “recursion: see recursion”. First, note that a equation x = x admits all elements of the universe as a solution; hence, the proper reading of “recursion: see recursion” as a definition is that it is ambiguous and hence bad. It is a recursive definition of the bottom element of the universe (whatever that might be for a dictionary), and a corecursive definition of the top element of the universe (whatever that might be). In any case, it does not define recursion (unless of course, the concept of recursion is the smallest or the largest concept in the universe of concepts).

Clint Adams: Universal healthwhat

Biella, you ingrate, just be thankful you don't live in one of those commie countries with socialized medicine. Those people have to wait in line for 3 months before they can get triaged at the ER, and then receive second-class organs while the corrupt party leaders buy up the delicious prime organs on the black market. Surely we wouldn't want to give up our current system when it works so much better than that.

11 June 2007

Joey Hess: unicode eye chart

E
￿ ڿ
ᛯ ℇ ✈
ㄝ ಅ ΐ ʐ 𝍇
Щ অ ℻ ⌬ ⌨ ⌣
₰ ⠝ ‱ ‽ ח ֆ ∜ ⨀ IJ
Ⴊ ⇠ ਐ ῼ இ ╁ ଠ ୭ ⅙ ㈣
⧒ ₔ ⅷ ﭗ ゛ 〃 ・ ↂ ﻩ ✞ ℼ ⌧



Reference key for the Optometrist:

LATIN CAPITAL LETTER E

THAT DAMN UNICODE BOX WITH F'S IN, ARABIC LETTER TCHEH WITH DOT ABOVE

RUNIC TVIMADUR SYMBOL, EULER CONSTANT, AIRPLANE

BOPOMOFO LETTER EH, KANNADA LETTER A, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, LATIN SMALL LETTER Z WITH RETROFLEX HOOK, TETRAGRAM FOR DEPARTURE

CYRILLIC CAPITAL LETTER SHCHA, BENGALI LETTER A, FACSIMILE SIGN, BENZENE RING, KEYBOARD, SMILE

GERMAN PENNY SYMBOL, BRAILLE PATTERN DOTS-1345 (or GLIDER), PER TEN THOUSAND SIGN, INTERROBANG, HEBREW LETTER HET, ARMENIAN SMALL LETTER FEH, FOURTH ROOT, N-ARY CIRCLED DOT OPERATOR, LATIN CAPITAL LIGATURE IJ

GEORGIAN CAPITAL LETTER LAS, LEFTWARDS DASHED ARROW, GURMUKHI LETTER AI, GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI, TAMIL LETTER I, BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT, ORIYA LETTER TTHA, ORIYA DIGIT SEVEN (or INVERTED DEBIAN LOGO), VULGAR FRACTION ONE SIXTH, PARENTHESIZED IDEOGRAPH FOUR

BOWTIE WITH RIGHT HALF BLACK, LATIN SUBSCRIPT SMALL LETTER SCHWA, SMALL ROMAN NUMERAL EIGHT, ARABIC LETTER PEH FINAL FORM, KATAKANA-HIRAGANA VOICED SOUND MARK, DITTO MARK, KATAKANA MIDDLE DOT, ROMAN NUMERAL TEN THOUSAND, ARABIC LETTER HEH ISOLATED FORM, SHADOWED WHITE LATIN CROSS, DOUBLE-STRUCK SMALL PI, X IN A RECTANGLE BOX

Enrico Zini: libept

libept 0.5.3 hit unstable I prepared a new toy to play with at Debconf and uploaded it to unstable:
Package: libept-dev
Description: High-level library for managing Debian package information
 The library defines a very minimal framework in which many sources of data
 about Debian packages can be implemented and queried together.
 .
 The library includes four data sources:
 .
  * APT: access the APT database
  * Debtags: access the Debtags tag information
  * Popcon: access Popcon package scores
  * TextSearch: fast Xapian-based full text search on package description
 .
 This is the development library.
Package: ept-cache
Description: Commandline tool to search the package archive
 ept-cache is a simple commandline interface to the functions of libept.
 .
 It can currently search and display data from four sources:
 .
  * The APT database
  * The Debtags tag information
  * Popcon package scores
  * A fast Xapian-based full text index on package descriptions
Yes, this finally brings lots of very cool data sources about packages together. Try this one:
# Check if all data providers are active and give instructions on how
# to activate those that aren't
ept-cache info
# Follow the instructions to activate everything
# Show all GUI image editors, sorted by popularity, in reverse order
ept-cache search image editor -t gui -s p-
If you have the Xapian data provider enabled, the results of a search are given in relevance order, the most relevant first. And also, searches are done with proper stemming, so if you look for image editor it will also find image editing, although it would score image editor higher. It's also quite lovely to work with it in C++. I'll improvise here a few examples: Print name and short description of every package
#include <ept/apt/apt.h>
#include <ept/apt/packagerecord.h>
using namsepace std;
using namespace ept::apt;
void playWithApt()
 
    // Apt data source
    Apt apt;
    // Parser of package records
    PackageRecord rec;
    // Iterate all package records
    for (Apt::record_iterator i = apt.recordBegin();
        i != apt.recordEnd(); ++i) 
     
        rec.scan(*i);
        cout << rec.pakcage() << " - " << rec.shortDescription() << endl;
     
 
Show all image editors
#include <ept/debtags/debtags.h>
#include <set>
using namespace ept::debtags;
void playWithDebtags()
 
    // Apt data source
    Apt apt;
    // Parser of package records
    PackageRecord rec;
    // Debtags data source
    Debtags debtags;
    if (!debtags.hasData())
        return;
    set<Tag> tags;
    tags.insert(debtags.vocabulary().tagByName("works-with::image:raster"));
    tags.insert(debtags.vocabulary().tagByName("use::editing"));
    tags.insert(debtags.vocabulary().tagByName("role::program"));
    set<string> results = debtags.getItemsHavingTags(tags);
    for (set<string>::const_iterator i = results.begin();
        i != results.end(); ++i)
     
        rec.scan(apt.rawRecord(*i));
        cout << rec.pakcage() << " - " << rec.shortDescription() << endl;
     
 
Print all package names, sorted by popularity
#include <ept/popcon/popcon.h>
#include <algorithm>
using namespace ept::popcon;
// STL comparator
struct PopconCompare
 
    Popcon& popcon;
    bool operator<(const std::string& pkg1, const std::string& pkg2) const
     
        return popcon[pkg1] < popocon[pkg2];
     
 ;
void playWithPopcon()
 
    // Apt data source
    Apt apt;
    // Popcon data source
    Popcon popcon;
    vector<string> sorted;
    if (!popcon.hasData())
        return;
    // Get all package names in the vector
    copy(apt.begin(), apt.end(), back_inserter(sorted));
    // Sort it by popularity
    sort(sorted.begin(), sorted.end(), PopconCompare(popcon));
    // Print it out
    for (vector<string>::const_iterator i = sorted.begin();
        i != sorted.end(); ++i)
        cout << *i << endl;
 
Search for image viewer, but we don't want to view kernel images
#include <xapian.h>
using namespace ept::textsearch;
void playWithXapian()
 
    TextSearch textsearch;
    vector<string> wanted;
    vector<string> notwanted;
    Xapian::Enquire enq(textsearch.db());
    // This will tokenise the search query into terms, stem them
    // and OR them together in a query.  Xapian will score higher
    // those results in which more ORed terms match, which is what
    // we want.
    Xapian::Query want = textSearch.makeOrQuery("image viewer");
    Xapian::Query dontWant = textSearch.makeOrQuery("linux kernel");
    enq.set_query(Xapian::Query(Xapian::Query::OP_AND_NOT, want, dontWant));
    // Print the top 20 results, with their relevance percentage
    Xapian::MSet matches = enq.get_mset(0, 20);
    for (Xapian::MSetIterator i = matches.begin(); i != matches.end(); ++i)
     
        // The get_data() of a document is the package name
        cout << i.get_document().get_data() << " ("
             << i.get_percent() << "%)" << endl;
     
 

Biella Coleman: Blue Cross Blue Shield Chronicles: Blue Distinction, Not

A few weeks ago, I posted an account of my trials and tribulations with Blue Cross Blue Shield Horizon of New Jersey. Well now it is high time for an update, an update I think readers of this blog will be interested in because it tells a fascinating story about the Internet, blogging, and perhaps new uses of Google Alerts. My goal in writing the post was to inform readers of their options when faced with problems caused by their health insurance company. Well, I had no idea a response would arrive from Blue Cross Blue Shield, and so quickly. For within 2 hours of posting my blog entry, the Public Relations Director of Blue Cross Blue Shield of NJ wrote me an email, which basically said that he came across my blog posting and was offering his assistance. Needles to say, I was shocked. After months of getting some of the worst customer service I have ever received (when on the phone with Blue Cross, I always felt like I was talking to smarmy collection agency reps), I get an email from upper-level management, offering his assistance. At first, I thought some of my geek readers were playing a practical joke on me. While it seemed plausible that Blue Cross monitors links to their site, and probably do so with Google Alerts, I had a harder time believing that the Director of Public Relations would fire off an email to me, directly. Naturally, following the arrival of his message in my inbox, a small glimmer of hope flickered, especially after he had someone from the Appeals Department contact me. And this small intervention had a large noticeable effect: decent and transparent customer service became a reality, for the very first time. Instead of interactions that were opaque and frustrating, I finally had ones that were crystal clear and intelligible. According to the main Blue Cross Blue Shield Web Site, they pride themselves on Blue Distinction:
Blue DistinctionSM is the Blue Cross and Blue Shield companies’ nationwide program that will create an unprecedented level of transparency with two goals: engaging consumers to enable more informed healthcare decisions and collaborating with providers to improve quality outcomes and affordability.
The contrast of my service before and after having the Public Relations director contact me speaks volumes to the actual nature of Blue Distinction as it pertains to BCBS of NJ. For most of my interactions with Blue Cross Blue Shield, I encountered an unprecedented level of opaqueness and frustration until there was intervention from high-above. I actually appreciated the service I received and saw it as a laudable move. Unfortunately, the outcome has been far from my liking. I recently got word they are not paying up for any of the dermatological services. So perhaps the fact that a PR person contacted me was significant because in the end, it has panned out as a typical PR move: all gloss and lacking substance. What now? I am moving to an internal BCBS appeal process and if that does not work, I will move on to small claims court in NYC and perhaps a more organized web campaign. In the mean time I have basically have decided to blog about the process so look out for future updates!

David Welton: Pluto Meeting

The Pluto Meeting in Padova was fun to speak at. It was good to see people I haven't had a chance to see in a while, and I was very impressed that the organizers managed to put the whole thing together in under a month. That's no mean feat! I gave a talk on economics and free software, a subject that I find fascinating. I went there expecting to get a few more questions or people pushing back against what I had to say, given that a lot of the people present were "of the FSF persuasion" in terms of their beliefs, but for some reason that didn't really materialize. Too bad, because it could have been interesting. In any case, we had a great time back in Padova for a few days!

MJ Ray: Stopping the Nixforce.com Sploggers

I asked: Should we try to stop them, or just post that "Nixforce look like an unscrupulous load of swines trying to trade on Debian Developer names without permission" all over their site? Paul wrote:
"They are violating Google's Adsense policies by inviting people to click on their ads on their front page ("If you dont want to enter, at least go to one of our Advertisers below"). You could, at the very least, have this line of their income terminated by reporting them here "
Works for me. It said they'll respond within 24 hours. Brandon Holtsclaw suggested:
"Or set something to look for the referer pulling the feed and redirect just that nixforce domain to a 404 or some nasty pr0n feed :) just a thought."
I would, but I think most things will fail to pull if I send a 40x and I can't think how to do a redirect or proxy neatly without messing with RewriteRule or similar - nixforce aren't worth messing with RewriteRules. I also suspect they're pulling from Planet Debian, rather than my web host, so if I made a mistake, I'd be very unpopular. Also: Russell Coker and Antti-Juhani Kaijanaho

Joachim Breitner: Visualizer for Anagrams

For my uncles wedding my brothers and I did a show where we took his name and use its letters to create a bunch of new words that are part of a speech about him. This was visualized on a projector by a program by me that let s the letter swirl around, forming each built word, as well as some special effects (such as rotating one letter around to show another).The program is written in Haskell, using gtk2hs and Cairo. You can find the sources in my darcs repository (Browse via DarcsWeb). To build it on a debian machine, this should work:
apt-get install darcs gtk2hs libghc6-cairo-dev libghc6-gtk-dev libghc6-mtl-dev happy
darcs get http://darcs.nomeata.de/anapres
make
./anapres examples/RolandHochzeit.anapres
I can also provide pre-compiled binaries, if you want.There is a very simple text file format that describes the sequence of words and special effects, but so far it is only tested with the one example file (the one from the wedding).If you want to try this and have any kind of trouble, do not hesitate to contact me. I m also interested in bug reports and patches, of course.

Russell Coker: Nixforce unauthorised use

Just over two days ago I sent a DMCA take-down request to nixforce.com for copying my content in violation of the non-commercial license that I offer, I have not had a response from them and they have kept mirroring my site. I have just sent a DMCA take-down to tierzero.net which appears to be their ISP. The email address listed in the whois record for that ISP bounces as does the postmaster address. It seems that I’m not the only person with this problem, Antti-Juhani Kaijanaho is also having problems with them. Any suggestions on how to deal with them would be appreciated. One possibility that I will eventually persue is to file a DMCA request with Google, this can result in their Google Adwords account being terminated.

Antti-Juhani Kaijanaho: Nixforce, cease and desist

Update Amazingly, they seem to have complied with this notice by taking down my content :) Nixforce, you are republishing (parts of) my blog without permission, and without indicating that you are republishing stuff written elsewhere. You are required to do all of the following, or cease and desist from republishing my content: If you do both, you have my permission to continue republishing my content. Additionally, you should verify that you have the legal right to republish content by the other authors. (This has been mailed to their contact email address.)

Antti-Juhani Kaijanaho: Recursion that isn t

Joey’s recent post reminded me of the old joke about an entry in a dictionary:
recursion see recursion
Non-geeks can stop reading here: if you didn’t understand the joke, you won’t understand what’s coming next either. I mean, sure it’s a funny joke, but it doesn’t quite work. Technically, it’s not even an example of recursion, as the base case is missing. Perhaps it’s co-recursion? — but it isn’t, as it’s not progressing. Why can’t we say instead,
recursion if you do not understand it, see recursion
It would still be funny, and it might actually work.

Joey Hess: unpacking boxes

A few people have asked what I meant in my "boxes" comic. Other just look at me strangely. Some hackers have enjoyed the comic, so I thought I'd try to unpack the meaning of it a bit for the layperson. Of course this will spoil the joke, but what the hey. A hacker who looks at the comic probably thinks about things like recursion, fractals, unicode, fonts, and bugs. fonts A font is how the computer knows how to draw the letters on its screen. Before computers, a font was a bunch of metal bits that could be arranged and fed into a printing press. As with most things involving drawing on a screen, font technology is much more complicated these days than you'd ever imagine. Fonts and the programs that draw them (font engines) are something of a mystery even to most hackers. unicode Unicode is an absurdly complicated version of the alphabet. Or rather, of every alphabet and similar thing used by anyone on earth or in Star Trek. It's not a font, it's a way for the computer to store text internally, by basically assigning a unique number to each letter. Since most hackers grew up in a world without unicode, and suffered through the (still continuing) transition to it, they're familiar with lots of quirks and weird and broken behaviors you get from it. One of these quicks is what to do when the computer wants to display a particular letter from unicode, but that letter is not available in the font. Since unicode contains effectively an infinite number of symbols, and each symbol in a font is carefully crafted by hand, this occurs pretty often. Handling of this situation varies, but often the computer will just display a little empty square box for the letter that it doesn't know how to draw. Some font engines go a step further and write the number of the unicode character in little tiny numbers inside the box. Presumably so that a hacker can look at it and tell what character is missing. The numbers are typically written one in each corner of the box, and you'd have to squint to see them. fractals A fractal is a special kind of picture, where parts of the picture repeat over and over at different scales. You've probably seen pictures of the most famous fractal, the Maldebrot set. That one is generated by a kind of formula, but there are much simpler ones, like the Koch snowflake. Hackers love fractals, because they're pretty, and complex, while based on very simple math. recursion "Recursion: See recursion." Ha! That's the best hacker joke ever, a true classic. Recursion is when the computer sees an instruction like that and mindlessly repeats it over and over. This actually turns out to be useful, and hackers see a kind of beauty in it. bugs Bugs are what happens when a computer program, which is supposed to be internally clear and simple, and have well-defined behavior, instead turns out to exhibit unintentional complexity. Kinda like a fractal. This begs the question of whether hackers like bugs, or not. Most of them spend most of their time creating more, so you be the judge. The bug I'm alluding to in the comic is this: What if the computer, when drawing some word, stumbled over a unicode character that was not in the font. And then say it went to draw the little box instead, and fill in the numbers to indicate what character it was. Except it turned out that its font didn't tell it how to draw the numbers either. And thanks to a really unlikely bug, it then proceeded to recurse, drawing smaller and smaller boxes for these characters that it didn't know how to draw. Until it drew a fractal instead. See: It's just hilarous once I've explained it. (And that explanation of the word "cat", by the way, is why I don't try to write most of the technical posts in my blog in a form that a layman could understand.)

10 June 2007

Adam Rosi-Kessel: Hospital Thoughts

Hospital CEO Paul Levy is seeking responses to some remarkably frank comments on competition in the hospital industry:
…Please remember that health care is not like other industries, in which companies are rewarded in the marketplace for being the high-quality, low-cost provider. That situation does not yet exist in the health care system. So, am I better off being a industry leader with regard to that approach, or am I better off biding my time and continuing to follow the traditional path until there is a real sign of change in the marketplace?
As I’ve written before, this kind of openness is refreshing and potentially a brilliant business strategy. (It may continue to be so even once every one is doing it.) Paul’s comments and receptivity to feedback remind me of my numerous concerns about Children’s Hospital Boston, which, as far as I know, has no analogous public forum. I’ve sent in comment cards, but they may just drop into a black hole. Two principal complaints about Children’s Hospital: television and food. There are TVs everywhere, including in the waiting rooms. They are always on, even if no one is watching them. On one occasion, we were the only ones in the waiting room. When we attempted to turn the TV off, the staff told us we couldn’t. When we went in examination rooms and our daughter was unhappy, the first response by the medical staff was often to turn on a TV. Our daughter (just over two years old) has never watched TV, and doesn’t find it comforting. Research indicates that TV is not good for young kids, and especially not infants:
Babies are glued to television sets these days, with 40 percent of 3-month- olds and 90 percent of 2-year-olds regularly watching TV, according to a University of Washington study released Monday. …”While appropriate television viewing at the right age can be helpful for both children and parents, excessive viewing before age 3 has been shown to be associated with problems of attention control, aggressive behavior and poor cognitive development,” Frederick Zimmerman, the UW study’s lead author, said in a news release…. The American Academy of Pediatrics recommends no television for children younger than 2, and only one to two hours a day of quality programming for older children.
Recently, we had to stay over in the hospital for a night. There were no private rooms available, so we requested at least not to be stuck in a room where the TV would always be on. They looked at us like we were from Mars. (In the end, our roommate’s TV was always on. The three month old patient didn’t care, but his private nurse wanted to watch TV.) Why is a pediatric healthcare facility encouraging TV for infants? The food complaint is similar: so much of the hospital food provided for children is high in fat, refined sugar, white flour, and artificial ingredients. I was looking for a fruit-juice popsicle for our daughter (what she eats at home), and the only options the hospital could offer had high glucose corn syrup as the first ingredient after water. Again, this is not rocket science — these are not appropriate foods for one- and two-year old children. I realize in both cases (TV and food), the hospital is just mirroring popular culture in an attempt to provide familiarity for most kids, but I wish they would at least provide an option for those families whose kids don’t watch TV and eat a high-sugar diet.

Steve Kemp: You and I in a little toyshop

Surprisingly many local people seem to be catching icky-illnesses of death recently. Both Megan and myself are under the weather recently. I managed to infect her with a nasty cough and cold on Wednesday and the pair of us have been mostly shivering indoors since then. Today is the closing day of The Leith Festival (Leith being a district of Edinburgh. Where we live.) So we made it outside and consumed beer and pies for a while. Now we're back and I'm wishing I'd not left the house. Still it could have been worse I could have been in the sun in a blurry suit and without any books! (Books visible and recognizable include the complete works of Terry Pratchett, minus two, the complete works of Steven Brust (Maybe Vlad will give me the edge in the assassins game!))
Steve in Leith Meg likes pies
All being well we'll be more recovered in time for the Debconf7 activities, although I expect Meg to be driving around Scotland for part of the time with a friend and not completely available. (A three-day roadtrip with Emma - a local girl who is hoping that somebody at Debconf will be able to fix her Ubuntu laptop..?) Update: - Debconf7 game of Settlers of Catan..? (I have only the Zarahemla set myself, but it will suffice for four players in a pinch.)

Daniel Burrows: Closing bugs just because they're old is not cool

Two bug reports that I wrote were recently closed with the following explanation:

Last message was posted nearly three years ago. Considering abandoned and closing.


Whoops, I thought, I must have missed a request for more information. So I went to the bug page and, nope, the only message on the bug was my initial report.

Let me repeat that: the total sequence of interactions on these bugs was:


  1. I report a bug in 2004
  2. Someone closes it in 2007 because it's "too old".


Now, there are times when it's at least somewhat excusable to close old bugs without verifying that they're fixed (or even knowing that they might not be). When a package has hundreds of bug reports, closing old bugs that can't be reproduced can be a good thing: even if the reports are valid, keeping reports that can't contribute towards a fix around is arguably less useful than cleaning out the bug list so it's usable.

In my case, though, the package in question has only 20 or so bug reports, an easily managed number. Worse, both bugs I reported could be trivially reproduced. One of them was arguably not a bug, but the guy who closed my bugs did not argue that; as far as I can tell, he didn't even look at my bug report.


Notice that I haven't mentioned the maintainer of the package? That's because he didn't close the bug. In fact, the person who closed the bug is not a member of Debian, nor is he in the NM process. Evidently he's just a random user who decided that old bugs offend him, so they should be closed.

So please, everyone, exercise a modicum of common sense when it comes to closing bug reports. This will keep the BTS useful for all of us and keep blood pressures at a reasonable level. :)

Christine Spang: And Straight On Til Morning

My internal clock is finding it hard to believe that it’s light outside right now, which might have something to do with the fact that I’m sitting in Shannon, Ireland. Since I only got maybe two hours of sleep on the plane, I wonder if I’m going to crash horribly later today. I haven’t flown internationally since 2000, so I was a little paranoid about it being a horrible nightmare, but so far it hasn’t been. I haven’t managed to trip any metal detectors yet, though I did accidentally leave my laptop in my bag when I sent it through the scanner at Logan. The security people were nice enough about it, however. I’m not carrying much in terms of carry-ons, so things have been smooth. I completely forgot that “long-haul” flights serve meals. Aer Lingus has a standard meal offering consisting of “chicken” or “beef”, neither of which are very good for vegans. Apparently if you call their reservations office in advance of your flight you can order special meals, of which vegan vegetarian is an option. But I definitely don’t remember this being mentioned at all (or at least very prominently) during the booking process, so I never thought of checking. I had just written off being able to eat the airline food and brought granola bars and snacks. Apparently this was a wrong assumption. I was originally going to FlyGlobespan, but ended up changing my mind after experiencing their entirely broken website which didn’t allow me to make a booking, and waiting a week for a response to their “feedback form” and never getting any, all the while watching their fares creep up as every day passed. Luckily the flight I ended up getting wasn’t too much more expensive, and even allowed me the flexibility to fly into London and out from Glasgow, making it easier to accomplish my plans of visiting Dafydd Harries, Hanna Wallach, and Matthew Garrett in the “other” Cambridge before ending up at Debconf!

Next.

Previous.