
"What do you think is the most important single-sentence of advice that you can offer to someone who wants to contribute to the free software community?"He who does wins, so don't let the bastards grind you down.
"If you had the opportunity to say one sentence to someone who knows about computers and free software (EG they have used both Linux and Windows and done a small amount of programming) to convince them that they should join the free software team, what would it be?"Imagine every bug you found could be fixed by you if you want, or a friend, or an enemy, or someone you hire, or the original developer, or whoever and that it's your choice who you ask to do it, with no veto from the copyright holder: that's free software. The second sentence is a bit long, but I found it hard to encapsulate the power of that freedom in one. I use the bug example rather than costs or anything, because I think that's what will be most attractive to someone who has done a bit of programming: the right answer to "why can't I fix this trivial bug?"
deb http://debian.camrdale.org/ unstable main contrib non-free
Once installed, it will start running automatically, and will
restart on bootup, so all that is needed is to modify your
sources.list files to point them at DebTorrent by prepending
localhost:9988 to the mirror name. For example, the entry above for
my personal repository would become:
deb http://localhost:9988/debian.camrdale.org/ unstable main contrib non-free
Here's the changelog:
Far too many times! I believe Windows isn’t stable enough for Digital Signage.
Enter the Webcfullscreen mode option:
Ok, this photo slideshow example is done with Adobe Flash, however I think Flash is a suitable option and it can perhaps behave better if the connection goes down temporarily (the offline problem). Could try complex betaware like Google gears...
Or customers might want a proxy feature (squid), which can be customised, so that if the Internet drops, the Digital sign could still work.
Another avenue is to host user’s Web pages on a local Web server. I am not keen on this as local data would be against Webc’s design.
If any of you have your own Digital Signage ‘solutions’ you would like to share, please do. Webconverger is a Free software project based on Debian.
In other news Webconverger has an entry over at distrowatch. Excellent news and thanks for all your support.
Open64 is an open source, state-of-art, optimizing compiler for the Intel IA-64 (Itanium), AMD Opteron and Intel IA-32e architecture. It derives from the SGI compilers for the MIPS R10000 processor. It was released under the GPL in 2000, and now mostly serves as a research platform for compiler and computer architecture research groups. Open64 is licensed under the GPL. Open64 supports Fortran 77/95 and C/C++, as well as the shared memory programming model OpenMP. It can conduct high-quality interprocedural analysis, data flow analysis, data dependence analysis and array region analysis.Open64 installation The installation is pretty easy fortunately:
$ wget http://ovh.dl.sourceforge.net/sourceforge/open64/open64-4.0-src.tar.bz2 $ tar xfvj open64-4.0-src.tar.bz2 $ cd open64-4.0 $ export TOOLROOT=/opt/open64 $ make $ make install (as root)I think you need gcc-3.4 (gcc 4.x is not yet supported), and for some odd reason you also need csh as one of the install scripts seems to use it. It would be nice if someone could package Open64 for Debian, I definately don't have the time to maintain such a huge package (a whole maintainer team would probably be good here). Rebuilding the Debian archive There are several possible ways (and tools) to rebuild the Debian archive; I've used pbuilder/cowbuilder with the rebuild scripts from Bastian Venthur, which are now included in pbuilder. First we need to install the required packages, setup a cowbuilder base chroot, and get the list of packages:
$ apt-get install cowdancer grep-dctrl wget devscripts sudo $ cowbuilder --create --distribution lenny --basepath /var/cache/pbuilder/testing-base.cow $ cp -r /usr/share/doc/pbuilder/examples/rebuild . $ cd rebuild $ ./getlist lennyNow we add Open64 into the cowbuilder chroot and fix up the chroot by pointing the gcc/g++ symlinks to Open64:
$ cp -a /opt/open64 /var/cache/pbuilder/testing-base.cow/opt $ chroot /var/cache/pbuilder/testing-base.cow $ cd /usr/bin $ mv gcc gcc.orig $ ln -s /opt/open64/bin/opencc gcc $ mv g++ g++.orig $ ln -s /opt/open64/bin/openCC g++ $ exitIn addition, we set the
CC and CXX environment variables to Open64, which will make 90% of all (autoconf-using) packages automatically use Open64. We need a small script for that:
$ cat c.cfg: export CC="/opt/open64/bin/opencc -m32" export CXX="/opt/open64/bin/openCC -m32"Now edit the
buildall script. Change the Debian mirror used there (optional) and make it use our c.cfg script by adding the --configfile /path/to/rebuild/c.cfg option in the "pdebuild" line.
We can now finally start building the archive:
./buildall list.lenny.i386 lennyYou can also run multiple
buildall instances at once to speed up the archive rebuild on SMP/multicore machines, and you can even abort the command and simply restart it later. The script will continue where it left off.
Results
The whole rebuild (with 2 instances of buildall running at the same time) took ca. 9 days on an AMD64 Athlon64 X2 (dual core, 1.8 GHz each) machine with 1 GB of RAM.
I really should have used something like apt-proxy to speed up the rebuild and save some bandwidth, but I read about apt-proxy too late...
All log files from my rebuild are available for detailed analysis if anybody is interested (you can browse the logfiles online or download all of them as tarball). I didn't perform any detailed analysis, just some rough numbers here:
const char *lines[] = "Line 1n", "Line 2n", NULL ;In this case we have a problem, because if we just replace the strings by _(”string”), it won’t directly work. Remember that _ is a macro for the function gettext. In C, it just won’t let us call it from the constructor, because the string should have to be assigned statically. In C++ it will let us, but the resulting program will happen to call gettext() on them before our initialization in main(), and thus it will simply not work. I’ve made available an example on how those situations could be handled both in C and C++.
#ifdef USE_GETTEXT #include "libintl.h" #include "locale.h" #define _(String) gettext (String) #else #define _(String) String #endifAnd add this at the beginning of your main() function:
#ifdef USE_GETTEXT
setlocale (LC_MESSAGES, "");
setlocale (LC_CTYPE, "");
setlocale (LC_COLLATE, "");
textdomain ("my-program");
bindtextdomain ("my-program", NULL);
#endif
That’s all for the initialization of gettext, lets go now with its usage from the rest of the modules. In each of them, you’d have to add this to the headers:
#ifdef USE_GETTEXT #include "libintl.h" #define _(String) gettext (String) #else #define _(String) String #endifAfter all that stuff, you should be able to i18n for whichever texts you want, just write _(”whatever”) instead of whatever:
printf(_("whatever");
Don’t forget to compile your program with -DUSE_GETTEXT if you use the same #defines as I do, or at least to #define USE_GETTEXT somewhere. Now, lets go to the second part, generating the .pot templates, and installing the .mo translation modules in your system:
xgettext -k_ -o my-program.pot *.c *.h --from-code=iso-8859-1If you prefer, you can create different .pot files for the different parts of your programs instead a really big one to help translators, and then joining all the .po files inside a single one before converting it to .mo with msgcat:
msgcat -o my-program.es.po my-program.part1.es.po my-program.part2.po my-program.part3.es.poTo compile the .po files into .mo, just do:
msgfmt my-program.es.po -o my-program.es.moThen, don’t forget to install it in the proper directory of your system:
cp my-program.es.mo /usr/share/locale/es/LC_MESSAGES/my-program.moOf course, you can tell your program to look for the .mo file in a different directory, even a relative one, instead. Just read the man pages, this is only a quick recipe on how to do it
We’ve been getting many many strange mailman-bounces. It seems that somewhere the mailman-bounces address is mis-configured. It should be [EMAIL PROTECTED], but mail seems to be sent as [EMAIL PROTECTED] (note missing “u”). That’s causing bounces to bounce all over the place...which has better not been archived at all - it doesn’t help when vital information is removed from the archived mail. Yes, this example was taken from an actual archive entry. Sheesh.
I sat next to Nat Torkington at the tutorial. He kept rubbing his temples. At one point I leaned over and said, The interesting thing about Haskell is that its functions only take one argument. He turned green.
In all seriousness, well-factored Haskell code resembles well-factored Smalltalk code: if you have functions (or methods) longer than a handful of lines, you re probably doing too much. Lower level languages such as C rarely give the opportunity for composition and abstraction that you can get out of functional languages. The presence of pure functions functions which never change global state and which return the same output for the same input is also immensely important.
It s actually the combination of the two features which give these languages such power. When Haskell forces you to mark impure functions explicitly, it gives you tools to isolate behavior which can change global state in the smallest possible scopes, and prevents you from composing impure and pure code together accidentally. When Haskell lets you compose functions into larger functions, not only does it help you write code more concisely, but it provides well-defined units of behavior which work along well-defined and isolated boundaries.
mul a b = a * bmul :: Int -> Int -> Intmul :: Int -> (Int -> Int)fifteen = mul 3 5
mulByThree = mul 3
fifteen' = mulByThree 5
fifteen'' = (mul 3) 5
Int -> Int; it's a function that we got by simply not applying "mul" to all its arguments. fifteen'' illustrates what is going on internally when you write "mul 3 5". It turns out that being able to call a function with multiple arguments is just some syntactic sugar to Haskell.filter (>= 10) [1..20]mul = (*)
# restriction class for use with polw (DEFER_ACTION)
smtpd_restriction_classes = greylist
greylist = check_policy_service inet:127.0.0.1:60000
To call postgrey for $REJECTLEVEL <= score <= $DEFER_LEVEL you need to make use of the restriction class “greylist” and let $DEFER_STRING match all defer strings, to get them all greylisted:
# echo “\$DEFER_STRING = ‘NOT’;” >> /etc/policyd-weight.conf
# echo “\$DEFER_ACTION = ‘rc:greylist’;” >> /etc/policyd-weight.conf
# /etc/init.d/postgrey restart
Also you may have a look into The DNSBL countries.nerd.dk. This might be a way to score connections comming from well known spamming countries. But keep in mind, that there may also legitim mails comming from those! ;)
planet, policyd weight, Postfix, spam
Next.