Search Results: "will"

13 June 2007

Eddy Petrișor: Whacky ideas, my addition...

PriorityIncreaseIfBinariesFromTheSameSource:

It would be really useful if a -dev package's priority would inflate proportionally with every binary package originating from the same source as the dev package.

This way I would never see this[1]:

# LANG=C apt-get install libxmu-dev libagg-dev libgstreamer0.10-dev libgtkglext1-dev libmad0-dev libxul-dev libdirectfb-dev libkonq4-dev libcurl3-gnutls-dev libcaca-dev libboost-date-time-dev libavcodec-dev libavformat-dev libming-dev
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
kdelibs4-dev liba52-0.7.4-dev libacl1-dev libarts1-dev libartsc0-dev libasound2-dev libaspell-dev libattr1-dev
libaudio-dev libavahi-qt3-dev libcucul-dev libcupsys2-dev libdc1394-13-dev libdts-dev libfam-dev libfam0
libgl1-mesa-dev libglu1-mesa-dev libgsm1-dev libgtkglext1 libidn11-dev libjack0.100.0-dev libjasper-1.701-dev
liblcms1-dev liblua50-dev liblualib50-dev libmng-dev libmozjs-dev libmpeg3-dev libnspr4-dev libnss3-dev libogg-dev
libopenexr-dev libqt3-headers libqt3-mt-dev libraw1394-dev libsasl2-dev libslang2-dev libtheora-dev libtiff4-dev
libvorbis-dev libxslt1-dev libxt-dev mesa-common-dev qt3-dev-tools xlibmesa-gl-dev
Suggested packages:
libasound2-doc aspell-doc libqt3-i18n qt3-doc libraw1394-doc
Recommended packages:
fam gstreamer0.10-doc libqt3-compat-headers
The following packages will be REMOVED:
gamin libgamin0
The following NEW packages will be installed:
kdelibs4-dev liba52-0.7.4-dev libacl1-dev libagg-dev libarts1-dev libartsc0-dev libasound2-dev libaspell-dev
libattr1-dev libaudio-dev libavahi-qt3-dev libavcodec-dev libavformat-dev libboost-date-time-dev libcaca-dev
libcucul-dev libcupsys2-dev libcurl3-gnutls-dev libdc1394-13-dev libdirectfb-dev libdts-dev libfam-dev libfam0
libgl1-mesa-dev libglu1-mesa-dev libgsm1-dev libgstreamer0.10-dev libgtkglext1 libgtkglext1-dev libidn11-dev
libjack0.100.0-dev libjasper-1.701-dev libkonq4-dev liblcms1-dev liblua50-dev liblualib50-dev libmad0-dev libming-dev
libmng-dev libmozjs-dev libmpeg3-dev libnspr4-dev libnss3-dev libogg-dev libopenexr-dev libqt3-headers libqt3-mt-dev
libraw1394-dev libsasl2-dev libslang2-dev libtheora-dev libtiff4-dev libvorbis-dev libxmu-dev libxslt1-dev libxt-dev
libxul-dev mesa-common-dev qt3-dev-tools xlibmesa-gl-dev
0 upgraded, 60 newly installed, 2 to remove and 0 not upgraded.
Need to get 21.6MB/22.2MB of archives.
After unpacking 108MB of additional disk space will be used.
Do you want to continue [Y/n]?



[1] these are gnash's build deps, in case you're wondering

Eddy Petrișor: NaughtySVN

After the feedback related to my latest post about NaughtySVN I thought it would be nice to commit my pending changes about update, although they are not enough to make a functional update feature.

I also thought is time to clarify a few things about the project:
[1] see the comment starting from "A word of caution" in this message from Alexander Thomas

Gustavo Franco: debcamp updates - round II

Miriam Ruiz: Gnash 0.8.0 is released

The third alpha release of Gnash has been released, with the version number of 0.8.0. As the package is now waiting in the NEW queue, I’ve made some packages available for those who want to test them. They’ve been compiled with Debian SID, not with Lenny or Etch. You might notice that the version in NEW is 0.8.0~cvs20070611.1016-1 instead of just 0.8.0. The tarball for the packages in NEW has been obtained from the 0.8.0 branch of the Gnash CVS, while the ones in the directory I mentioned have been created a bit later from the official 0.8.0 tarball release. They should almost be the same in any case. We have packaged Gnash with the OpenGL backend this time, to be able to support Konqueror’s plugin. If you want to be able to watch YouTube or Lulu TV videos, don’t forget to add the recommended packages: gstreamer0.10-plugins-base, gstreamer0.10-alsa, gstreamer0.10-fluendo-mp3, gstreamer0.10-ffmpeg. If you’re not using ALSA, you might need to replace gstreamer0.10-alsa by the corresponding package providind gstreamer0.10-audiosink that suits your system. Without this packages, you will be able to reproduce Gnash films, but not to see video streams. There seems to be some kind of JavaScript-related problem with Konqueror anyway when visiting YouTube. The videos don’t seem to play from the page, even though they do if you use the .swf URL directly. Feedback is welcome :)

Eddy Petrișor: Your next Gnome subversion client...

... is NaughtySVN.

I have joined this project which was started by Alexander Thomas a few weeks ago and I have convinced him that is better to have a release sooner rather than later. The project is still in its early alpha stage[*] but I thought is better to have a rather minimalist and functional client first.
So, I talked to Alexander and we came up with a roadmap; for the 0.0.1 release I am working on the update feature which is about 40% done[1][2] (update dialog screenshot).

Of course, after the release I will probably make a debian package, too, unless someone else beats me to it :-) .

So, the future is bright.


Update: as a response to a comment, NaughtySVN is designed to be not only a Subversion client, but also a framework for other VCS-es and other clients. It just happens that we are working on the Subversion backend and client at the moment.

P.S.: as curiosity of mine, I have written in python a small nautilus plugin that does the svn update (is a svn frontend) and I must say I really miss the development speed of python when writing in C (or maybe I am out of practice).

[*] only a few features are implemented and can't be used yet as a SVN client without being forced to use another client.
[1] according to my estimations
[2] update related code is not committed yet

MJ Ray: the Connection, paperless billing and post offices

Just got my copy of the Connection for June in the email today. Highlights: expansion of paperless billing and putting savings into a new sustainability fund that will be used to "green" the co-op further; profiles of Emerge, Cycle Training UK, Low Carbon Lifestyle, and Resurgence Magazine; not following BT's introductions of charges for 1571 ( 1/month), non-DD payment and late payment (up to 7.50/bill); free line transfers until end of August; new mobile phone services; previously-posted ADSL charging plan changes. (Note: I'm a member of this consumer co-op and my main company is Phone Co-op agent 471 if you'd like to join through us.) An interesting question is how that new sustainability fund will be allocated. I can't see an answer in this newsletter, but I've signed up for the extra paperless services anyway. I have mixed feelings about that: it may be helping save trees and fuel, but is it also further harming my rural post service by reducing the amount of post sent to me? Then again, it looks like the government has caused most harm to rural post offices by moving social service payments to banks and slowly reducing the number of services at rural sub-offices, while the Post Office themselves are doing "ludicrous" things like moving main post offices out of historic buildings and into the backs of newsagent chains. I care more about the offices than the delivery service and they don't seem very connected here.

Eddy Petrișor: first moto lesson

Monday morning I went to the first lesson of motorcycle driving. The instructor gave me a little 125cc motorcycle, as he does at the first lessons. At first I felt weird with the protection gear on me[1], but I got used to it in about 5 minutes.

Next lesson is Thursday morning, then Friday. After returning from DebConf7 I will continue the lessons.

[1] not that the lessons are risky, but the gear is mandatory and is good practice to learn to always wear it

Mario Iseli: Organize stuff and prepare for Debconf

Hello World :) Debconf (16.6.2007) is getting closer, in 77 hours I will take the train to the airport in Geneva and then fly to Edinburgh. I didn’t really organize anything yet so it becomes stressful.
* Today I organized a kilt from a friend, looks quite funny, I will wear it on Saturday.
* Wednesday I want to prepare my private notebook and maybe even my IBM x60s from the office.
* Wednesday I want to prepare my digital camera and clean the memory stick.
* Wednesday I’ll organize 95 for the LPI exams.
* Wednesday evening I’ll go out with some friends to have party (several of my friends go to the Greenfield festival Thursday evening and I go to Debconf, time to celebrate)
* Thursday evening I will leave work early and go to Biel to buy some clothes for me, cheese for madduck and the othere Cheese’n'Wine participiants, chocolate for ana, cookies for Joerg. (If you also want something from .ch, please ping me on IRC)
* Thursday after shopping I need to go to a business dinner in a Mongolian BBQ restaurant.
* Friday I need to organize some W-Lan cards for the airport in Geneva in a Swisscom-Shop.
* Friday I would like to bring a friend a birthday gift.
* Friday I would like to go to have a drink with my ex-girlfriend.
* Friday night I need to prepare my baggage including all technical stuff. So you see, several tasks I have to do (this weren’t all of them) and I hope to be able to do all of that ;) See you in Teviot, Saturday afternoon!

12 June 2007

Matt Brown: Back on the Intarnets

Now that we’ve settled into our new apartment in Dublin, the ADSL has been connected and I’m back on the net! Obviously I’ve had Internet access at work during this time, but there has been so much new information to take in that I haven’t really had time to do any Debian or WLUG work. I’m still waiting for the shipping company to deliver my computers, so it will be another week or two before I have a development environment that can build and test package. Once that’s setup again I have updates queued for the following: Unfortunately I’m not going to make it to Debconf this year, despite being the closest geographically that I’ve ever been. :(

Biella Coleman: Housebreaking Your Health Insurance

Are you having trouble with your health insurance? Are they stalling on paying a bill? Denying a claim? Not telling you what the heck is going on?? Well you can and should take action to eliminate some of the mystery and move forward, and possibly win fight against the health insurance company. Thanks to my unpleasant ordeals with BCBS of NJ, I have compiled some handy resources and tips to get you started. Good luck and I welcome any other tips that you think should be here. Please email them to me at biella(at)gmail(dot)com Can’t get a straight answer when dealing with health insurance representatives on the phone? Are different representatives providing different and contradictory information? Does talking to the representatives leave you with a pounding headache? Then the following may be helpful: 1. Ideally you should tape record all conversations. If this is not possible, get the name or employee number of the person you are talking to and write down what they told you along with the time and date. If they have agreed to something, make sure they send it to you in writing. This sort of documentation may come in handy later when you are trying to contest or prove something. Is your insurance company flip flopping on a claim? For example telling you that the claim is still being “reviewed” but sending you statements that indicate it has not been paid and never will be? What action can you take to inch things forward? The following may help: 1. Most states have a Department of Banking and Insurance and they are there to help you. Many (perhaps all) provide a service for filing a complaint against your health insurance company and other insurance and banking companies too. When I used the service in NJ , I got assigned an investigator and their service was prompt and helpful. It was my experience that even though they were not able to resolve my issue, the insurance company started to make firm decision on many claims and this alone has been helpful. Before this, it was impossible to get a clear answer from them as to the state of all sorts of claims. They said “NO,” & you think they should say “YES, YES, YES, YES!!!!” In other words, appealing a denial: 1. This site has some great information on how to avoid a denial and what you can do to fight one. 2. Included on their site is the Health Insurance Laws and Benefits Tool which will provide specific information about your rights in different states. For example, you will want to know if there is an external or independent grievance system to appeal your plan’s decisions. In the case of NJ, which is the state I am fighting, the tool provided the following helpful information:
Does New Jersey require an external or independent grievance system to appeal your health plan’s unfavorable decisions? Yes, for all health plans.

On what grounds can you file your external grievance?
Investigational treatment appeal, medical necessity. What is the status of the external grievance panel’s decision?
Binding. External grievance systems allow you to take a dispute with your health plan to a doctor or review board unaffiliated with your health plan. Thus, both you and your health plan receive an impartial ruling on its decision to deny coverage of services or treatment. Additionally, you can file a complaint against your health insurer with your state’s department of insurance.
Additional Helpful Information and Resources 1. The message boards on lawyers.com are a great place to hit for information. I have found folks there helpful.
2. You many want to blog about your experience as you may get an unexpected response directly from your insurance company. I think there are pro’s and cons to blogging about your experience but it does provide a public face to your ordeal and allows you to chronicle exactly what has transpired.
3. If your cases is particularly shocking, do not hesitate to hit the local media.
4. If your claim has been denied by an external review panel, you may not have much luck suing but if there is no external review panel, you can and should also try Small Claims Court or other legal action. Further, even if your claim was denied by an external review board, you may have other options for suing, for example, due to their bad faith handling of a claim. And on that note, here is a great legal resource covering the topic.

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.

MJ Ray: When did foo(l) join the debian project?

In response to John Goerzen's question, I'd try the following steps: Check keyring.debian.org/changelog - this will give a near-definitive answer for all DDs joining since 19 Jan 1998. If that fails, check the web archive copies of the 1997 debian people page to find out when they first appear and which packages to check. Check as many package changelogs as possible on the package tracking system and the rest on the debian archive to find the earliest entries. (Update: for completeness, check the signature on the matching dsc and its key creation date.) Then look in their $HOME on master for the earliest timestamp. And finally, search list archives and the web for any welcome message (rare), the first use of their @debian.org address, or a signature where they claim to be a debian developer. Any other ways to guess the date?

Michal Čihař: Troubles on being popular

phpMyAdmin is quite popular tool and it attracts people who want to earn money on it. For long time Navicat company used phpMyAdmin name to propagate their completely different product, but this seems to be gone now (probably with help from Google, but I haven't receive reply from them, but short after my complain, all their ads abusing phpMyAdmin were gone). Today Marc spotted that somebody just stole our website added Google shopping cart and started to sell phpMyAdmin: Main stolen page screenshot Buy page screenshot Lets see how long will it take to get them down. PS: There is intentionally no link in this post, you can see URL on screenshot, if you really want. Update: It looks like hosting is very responsible on such problems, they just disabled this domain:
Hello, Thank-you for your e-mail enquiry. Please be advised that we have disabled site php-my-admin.awardspace.com. AWARDSPACE.COM provides legitimate web hosting services and has a ZERO tolerance policy towards these violations. We apologize for the inconvenience this has caused you. If you still have any concerns in regards this matter feel free to contact us. Best Regards, Harry AWARDSPACE Dedicated Support Team support@awardspace.com /"Your winning web hosting provider"/ http://www.awardspace.com

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).

11 June 2007

Ingo Juergensmann: proftpd and SQL uid

Hmmm, maybe I'm missing a point, dear lazyweb, but it seems as if proftpd in Etch is somewhat broken.
Ok, I have a setup with proftpd, SQL backend (psql) and quota. First the SQL backend:


Table "public.users"
Column Type Modifiers
---------+------------------------+-----------
userid character varying(30) not null
passwd character varying(80) not null
uid integer
gid integer
homedir character varying(255)
shell character varying(255)
clear character varying(80)
Indexes:
"userid_pkey" PRIMARY KEY, btree (userid)
"users_uid_key" UNIQUE, btree (uid)
"users_userid_key" UNIQUE, btree (userid)


Proftpd.conf:

[...]
RequireValidShell off
DefaultRoot /home/%u
AuthOrder mod_sql.c
#PostgresInfo localhost dbadmin dcf1330 vftp
SQLAuthTypes Plaintext
SQLAuthenticate users* userset
SQLConnectInfo vftp dbadmin dcf1330
SQLDefaultGID 65534
SQLDefaultUID 65534
SQLMinUserGID 2100000
SQLMinUserUID 400000000
#SQLUserInfo users userid clear "uid" "gid" homedir shell
SQLNamedQuery userinfo FREEFORM "SELECT userid, clear, uid, gid, homedir, shell
SQLUserInfo custom:/userinfo


The problem is now, that those files that are uploaded by ftp get owned by uid 65533 instead of the uid defined in the SQL table, whereas the gid is being set correctly. Example:


-rw-r--r-- 1 65533 2101 14838 2007-06-11 15:34 front.jpg


Both, uid and gid, have the same value within the database (exampel is "2101" here), but only gid will be used correctly by proftpd when uploading files. I would prefer to use usrquota instead of grpquota, though.
I'm appreciating tips to solve this problem or to confirm that this is a proftpd bug! :-)

Joey Hess: re: debootstrap

Steve wrote about reconciling debootstrap changes between Debian and Ubuntu, noted that there's a general problem that Sarge's debootstrap cannot install Etch, etc, and pondered splitting the package and uploading the Ubuntu version to Debian. Actually, if you look at the etch, lenny, and sid scripts, you'll find that they're all the same (symlinked). Barring something unexpected, I don't expect this will change, since debbootstrap now needs to encode little distro-specific info in the Debian scripts. So it should be possible to ship a debootstrap in lenny that will install lenny+1 (and lenny+2 if we have the name decided). Or perhaps even generalise it so that debootstrap can be asked "please try to install the Debian codename called "foo" even if you don't have explicit support for it". This is not true of Ubuntu because they have not switched to a priority-based package selection like Debian has. Debootstrap has to be manually changed to change the lists of packages to install for each new version of Ubuntu. This is a great example of the kind of change that I keep ranting about where pulling patches back and forth just isn't good enough. Though running in the opposite direction from the usual for me. They have all our debootstrap patches, and that wasn't good enough; someone needs to tell them about the benefits of priority-based package selection. If you look in /usr/lib/debootstrap/scripts/, you'll also see that debootstrap already includes scripts for old versions of Ubuntu. Adding additional scripts is trivial (although you should take care not to bloat the udeb with them). Uploading Ubuntu's package to Debian after the minimal review Steve suggested gives me the shivers (especially after reading the diff), but then I'm one of the lucky ones who gets to deal with the fallout very time debootstrap breaks.

Steve Kemp: You have to go on living

Debconf7 TODO: These are my personal goals for the debcamp week: The second item is the one that I'm most interersted in right now, but I'll leave it a day to see if there is any useful feedback or massive objections right now. The debootstrap problem Right now there are two versions of debootstrap - the "Debian one" and the "Ubuntu one". The Ubuntu debootstrap package has support for installing additional suites; dapper, feisty, etc.. (My current understanding is that the Ubuntu debootstrap can still install Etch, Sarge, etc.) Right now if you want to bootstrap an Ubuntu system on a Debian host you're out of luck unless you install the Ubuntu debootstrap package. There is no real reason why this should be the case. Either distribution should be able to install the other. Why I care I wrote/maintain xen-tools. This package allows you to create Xen guests of different distributions. Most of the time the tool will install a distribution by invoking "debootstrap ...". It would be nice if this could work upon a plain Debian system such that installing Dapper, Fiesty, etc, was supported. What We Can't Solve There are problems with debootstrap which I'm not going to attempt to solve. The most obvious one is that Sarge's debootstrap cannot install Etch. There are a few open bugs in the Debian BTS which I will triage though, since some of them are safe to close. The Approach There are three approaches for this: <dl>
The hack
Download the source to Ubuntu's package. Test it can install Sarge, Etch & Lenny. Then upload to Debian.
What I'll do
I'll do three things:
  • Triage open bugs on debootstrap.
  • I'll compare the two scripts + manpages, to see if they've diverged.
  • I'll move the Ubuntu scripts into the Debian package.
The neat way forward
Split debootstrap into :
  • debootstrap
    • Compatability package, to pull in the next three:
  • debootstrap-common
    • The tool.
  • debootstrap-debian
    • Contains the scripts/support for installing Sarge, Etch & Lenny.
  • debootstrap-ubuntu
    • Contains the scripts/support for installing Dapper, Feisty, etc.
</dl> This second approach should be straightforward. The first thing to do is to test that actual debootstrap script differ little between the two distributions. That should be simple enough. The next thing is to create the additional packages. Acceptance? For this work to be useful it needs support from the maintainers of the Debian & Ubuntu packages. (I guess mostly the Debian maintainers actually.) Progress The good news is that between the version of debootstrap in Ubuntu right now, debootstrap-0.3.3.3ubuntu4, and that in Debian sid, debootstrap-0.3.3.3, the code has only one minor change. There is only a minor typo-fix in the manpage too. So I can move the scripts into the package trivially...

David Moreno Garza: Injured

I’m injured. Yesterday, Raquel and me were fooling around and playing, so in the middle of the play, I knelt down, grabbed her legs and put her lap on my left shoulder in order to lift her. So I did. After carrying her and she screaming “put me down!”, I tried to avoid her from hitting some thing on the ceiling, so I bent to one side wildly, with her still on my shoulder and back and then I felt an awful jab and pain on my back and the whole thorax started to hurt. So, I asked Raquel, who was already safe on ground, to press my thorax in a way to stop pain. It didn’t work out. As we were on our way to the supermarket, driving was painful, even lifting my arms, heavy breathing, etc. When we came back home, I laid in bed for resting and TV watching, but most of my moves were still painful: around 3 hours after the first pain. I could barely sleep, I couldn’t stay on the same position for a while, but had to change to some other, and it was still painful. At around 3 am, I could sleep a bit better. When I woke up at 7, the pain was still there, but it wasn’t that hard; she woke up and went to the gym. So, I’m resting in bed with a back pain, on a Monday morning. Raquel went to the office after she came back and I feel like an old grandpa. I will only go see the doctor if the pain is not handleable by tomorrow morning, otherwise I will only spend money that we don’t currently have on drugs and on the doctor’s invoice, and I don’t want to; as stupid as this may seem, I don’t trust doctors. I hope I will be OK by tomorrow and ready to leave to DebConf on Saturday morning.

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;
     
 

Next.

Previous.