The blog spam on my site has gotten so bad I decided to use WordPress 1.5’s new word black list feature. It seems that 90% of the spam I get is for online casinos. These posts always contain either “texas holdem” or “poker” so I have black listed “holdem” and “poker”. This is a pretty big stick that I don’t want to use but constantly deleting spam in the moderation queue is getting quite annoying.
LQL# HTB control
Now that LQL-Sharp has been released I thought I should put together a quick little demonstration of just how cool it is.
I have created a extremely simple GUI control that can modify the rate and ceiling parameters of a HTB class. This control should really subclass Gtk.Widget but it serves its purpose as is.
using System; using Gtk; using LQL; class HTBControl { private LQL.ClassHTB klass; private LQL.Con con; private Gtk.SpinButton rateSpin; private Gtk.SpinButton ceilSpin; public HTBControl(LQL.ClassHTB klass, LQL.Con con) { this.klass = klass; this.con = con; Gtk.Window myWin = new Gtk.Window("TC GTK+"); myWin.DeleteEvent += new DeleteEventHandler(WindowDelete); Gtk.VBox vbox = new Gtk.VBox(false, 3); Gtk.HBox hbox1 = new Gtk.HBox(false, 2); hbox1.Add(new Gtk.Label("Rate (bytes/sec): ")); this.rateSpin = new Gtk.SpinButton(0, 10000000, 1); hbox1.Add(this.rateSpin); vbox.Add(hbox1); Gtk.HBox hbox2 = new Gtk.HBox(false, 2); hbox2.Add(new Gtk.Label("Ceiling (bytes/sec): ")); this.ceilSpin = new Gtk.SpinButton(0, 10000000, 1); hbox2.Add(this.ceilSpin); vbox.Add(hbox2); Gtk.Button modifyButton = new Gtk.Button("Modify"); modifyButton.Clicked += new EventHandler(Modify); vbox.Add(modifyButton); rateSpin.Value = this.klass.Rate; ceilSpin.Value = this.klass.Ceiling; myWin.Add(vbox); myWin.ShowAll(); } static void WindowDelete(object o, DeleteEventArgs args) { Gtk.Application.Quit(); args.RetVal = true; } void Modify(object o, EventArgs args) { this.klass.Rate = (uint) this.rateSpin.Value; this.klass.Ceiling = (uint) this.ceilSpin.Value; this.klass.Modify(this.con); } }
using System; using Gtk; using LQL; class MainClass { public static void Main(string[] args) { Application.Init(); LQL.Con con = new LQL.Con(); LQL.Interface nIf = con.FindInterfaceByName("eth0"); GLib.List classes = con.ListClasses(nIf); foreach (LQL.Class klass in classes) { if (klass is LQL.ClassHTB) { new HTBControl((LQL.ClassHTB) klass, con); } } Application.Run(); } }
Gay Marriage in Canada
On February 1, 2005 the Federal Government of Canada introduced legislation into the house of commons that would make gay marriage legal across the country. Courts in most provinces have already ruled that stopping gay marriages is unconstitutional so it should not be surprising that the federal government has taken this measure. Not only is it the right thing to do, any attempt to make gay marriage illegal would almost certainly be struck down by the supreme court based on the Charter of Rights and Freedoms anyway. Nothing but the lining of lawyers pockets and the wasting of tax payers money would be served by such an attempt.
None of this has stopped the usual bantering and idiotic arguments put forward by the “anti-gay marriage” people.
First of all, I think I am pretty unbiased on this issue. I’m not gay; I don’t know any gay people. No matter how this ends it will not change my day-to-day life one bit. What bothers me about this issue is the abuse of the principles involved and the complete lack of logic.
Most of the quotes below come from a CBC story called Cotler unveils ‘landmark’ same-sex law.
“If you’re going to throw open the definition of marriage so you destroy it in essence, how do you know you can ever draw the line any place? If I want two or three wives and want that considered legal marriage, who are you to tell me I can’t do that?” – Ontario MP Pat O’Brien, May 10, 2003.
This is nothing but fear mongering. Society can, and does, set limits all the time. Did lowering the drinking age from twenty-one to nineteen “throw open” the possibility of further lowering the drinking age to sixteen? Of course not.
“The Conservative party will fight to give a greater voice to Parliament. We will ensure that issues like marriage are decided by Parliament, not the courts.” – Party website.
Great plan. Lets have societies dominant elements decide for everyone else what is OK and what is not. That is a sure way to make sure everyone is treated fairly. Wake up! The Charter was created for exactly this reason. The elected representatives who, in a large part, represent the dominant groups of society cannot be trusted to enact legislation that protects minorities.
. . . no religious officials will be forced to perform marriages that are contrary to their beliefs.
– Justice Minister Irwin Cotler
Vic Toews, the Conservative party’s justice critic, disputed the Liberals‘ insistence that the law protects religious officials from having to perform gay-marriage ceremonies.
He also said there’s no protection for individual Canadians who don’t hold a church office but want the right to refuse to have anything to do with gay marriage.
. . .
Toews cited several examples of people and groups whom the bill wouldn’t protect:
- Civil marriage commissioners in Saskatchewan and Manitoba, who have been told they must perform same-sex ceremonies or lose their jobs.
- . . .
How is this any different than if a civil marriage commissioner refused to marry an inter-racial couple because of his or her beliefs? The answer? It’s not. The idea that an agent of the state should have discretionary privileges is absurd. Why even have laws if the people implementing them have the option to ignore the laws they do not agree with?
That’s why his party [Conservatives] will try to amend the bill, limiting marriage to one man and one woman while offering homosexual couples full rights under some other type of civil union.
Notice the word “full”. At least in this case they have not used the word equal. I always find people who say things like “We believe in equal rights . . . gays can have civil unions with the same privileges as marriage just not marriage proper” hilarious. You either believe in equal rights or you do not. Adding a qualification to any statement about equal rights means that you do not believe in equal rights, period.
“What we are seeing is a consistent pattern,” he said. “Whenever equality rights and religious rights collide, equality rights trump.” — Vic Toews
Again, I am dumbfounded by this person. Of course equality rights trump religion. Think about how absurd it would be if it were the other way around. Which religions views would would society take as ‘right’? What about religions whose views directly contradict each other?
The people fighting against gay marriage need to seriously think through their views. They should think about how the world remembers the active and vocal racists of not so long ago. For this is exactly how the world will remember the anti-gay marriage people in twenty years.
LQL 0.8.0 and LQL# 0.8.0 released
That’s right. You can now use LQL from C# or any other language supported by Mono.
The Mono bindings haven’t had quite as much testing as they need. Ahh well.
Release early, release often.
LQL#
Work has begun on the long promised Mono (C#) bindings for LQL. This little C# program will display traffic statistics for all of the queueing disciplines that are supported by the C LQL library.
using System; using LQL; class MainClass { public static void Main(string[] args) { Gtk.Application.Init(); LQL.Con con = new LQL.Con(); GLib.List ifList = con.ListInterfaces(); foreach (LQL.Interface netInf in ifList) { GLib.List qdiscList = con.ListQdiscs(netInf); foreach (LQL.QDisc qdisc in qdiscList) { qdisc.UpdateStats(con); qdisc.PrintStats(); } } } }
Very exciting stuff!
LQL# is not nearly polished enough for a public release yet but I am quite happy with how the work is progressing.
A common archive format for web forums and email lists?
Here’s a little wish list idea for someone with more time than I to work on.
Since the idea came from the use of Usenet it is probably best to start with a short description of what exactly Usenet is. Usenet is a method for large groups of people to communicate about particular subjects. These discussion groups are divided into hierarchies, similar to how domains are divided. For example, the comp hierarchy contains comp.os.linux.advocracy, comp.os.solaris etc. Whatis.com has a definition of Usenet that may be useful. Anything you can possibly imagine, and more, is discussed on Usenet. In the earlier days of the Internet Usenet was the primary place for technical discussions. Unfortunately, this has changed as more and more people use email lists and web forums.
Google maintains a huge archive of Usenet posts going back many years. They claim to have over 1 billion messages in their archive. Using groups.google.com you can search this archive. Anytime I have a technical question, particularly for programming and networking problems, I always start by searching Usenet. The main reason for this is the fact that all discussions are archived in such a way that you can always see the entire thread and easily move between messages. This is particularly useful when searching for a question. Finding a post that asks the same question is useless if the associated replies that may contain a solution cannot be found. Try a search for “aes vs twofish” at groups.google.com. Clicking on any one of the results will allow you to view the entire discussion thread.
Fast forward to 2005. As the technical abilities of the average Internet user has dropped discussions have moved from Usenet to mailing lists and web forums. This change is happening because users already understand their email client and web browser and have little desire to find a Usenet client or discover the Usenet features of their email client. The problem with this trend is that finding information is now much harder. Try the “aes vs twofish” search with the Google web search. The first result I get is a message called “AES256 vs Twofish performance (Was: twofish keysize)”. This is a email that was sent to the GnuPG users mailing list. Once you follow the link Google can no longer help you. You are limited to whatever features the mailing list archive offers. Some mailing list software provides decent search features but most do not. Web based forums are usually even more difficult to use. Many are ugly, slow and certainly do not present a consistent interface across archives that would make finding information easier.
In order to bring these discussions back into a form where search engines can do what they do best we need a mailing list and web forum archive format. Search engines could pull the archives for each list or forum and present a consistent interface like groups.google.com does.
So that is the task I set out. Define a discussion archive standard and convince all web based forums and email list software providers to support it. The search engines will follow soon after.
LQL 0.7.0 released
Another new version of LQL is available.
0.7.0 changes:
- Add some new test programs to the tests directory.
- Fixed a bunch of small bugs that were found with the new test programs.
- Change the return type of a few _new() functions from GObject to the proper object type.
- Update docs to match new API.
- Add some background comments to the documentation.
- Add support for the DSMark QDisc and corresponding documentation.
- Add –with-kernel-source=PATH option to configure so alternate kernel include directories can be specified.
- Add support for the Netem QDisc (everything but distribution tables). This means you now need the headers from a kernel with Netem support in order to compile LQL.
- Add support for the TCIndex classifier.
- Put some more time into the classifiers. Still not complete.
New Years
For New Years this year we when to Piccadilly Circus in Toronto.
The rest of the pictures are available here.
DRM
Here is an interesting argument against DRM that is worth reading.
LQL 0.6.0 released
I just finished a new release of LQL. This release contains the statistics support I have been working on. The basic statistics are available for each queueing discipline and class but I have not added the extended statistics that are specific to each qdisc/class type yet. Adding support for these statistics will just require modifying a single function in each type. I’m not sure when I will get this done as I don’t need this feature at the moment.
Changes:
- Add statistics support to all qdiscs and classes. See the get_stats.c example.
- Add print() method to LQLQDisc and LQLClass so that it’s easy to see their settings.
- Add printStats() method to LQLQDisc and LQLClass to output all statistics information.
- Lots of small bug fixes.
- Clean up and add new documentation.