IFACE=wifi0 # setup ingress filtering /sbin/tc qdisc add dev $IFACE handle ffff: ingress # local network is unrestricted /sbin/tc filter add dev $IFACE parent ffff: protocol ip \ prio 10 u32 match ip src 192.168.2.0/24 \ police conform-exceed ok/ok flowid :1 # incoming internet traffic is limited. /sbin/tc filter add dev $IFACE parent ffff: protocol ip \ prio 50 u32 match ip src 0.0.0.0/0 police \ rate 1500kbit burst 10k drop flowid :2 # outgoing traffic /sbin/tc qdisc add dev $IFACE root handle 1: htb default 30 # local network is unrestricted /sbin/tc class add dev $IFACE parent 1: classid 1:10 htb \ rate 54mbit burst 15k /sbin/tc qdisc add dev $IFACE parent 1:10 handle 10: sfq perturb 10 /sbin/tc filter add dev $IFACE parent 1:0 protocol ip \ prio 10 u32 match ip dst 192.168.2.0/24 flowid 1:10 # internet traffic is limited. /sbin/tc class add dev $IFACE parent 1: classid 1:20 htb \ rate 160kbit ceil 196kbit burst 15k /sbin/tc qdisc add dev $IFACE parent 1:20 handle 20: sfq perturb 10 /sbin/tc filter add dev $IFACE parent 1:0 protocol ip \ prio 50 u32 match ip src 0.0.0.0/0 flowid 1:20Long example, I know. The main reason is that I'm not limiting traffic to local computers. Furthermore, I'm also limiting my incoming traffic to use up at most 1.5 mbit of the 2 mbit connection, so my housemates will be able to use the internet as well (Debian mirrors send data fast - fast enough to kick them out of any online game they might be playing...).There is one important detail hidden in there: sfq. This stands for "stochastic fair queueing". It tells the network stack to basically send "one packet for each connection in turn". This way, the small packets needed for download or interactive SSH sessions will get out quickly even when doing a larger upload.It works great for me - I'm having a good download rate, using the 160 kBit upload limit completely (I don't want to completely fill up the 192k upload link either) and I'm actually writing this blog entry remotely via SSH. The lag when writing is okay, probably around 300ms. Without shaping, this wouldn't work this well.(And no: just using 'sfq' for your outgoing traffic is not enough, since the key scheduling is happening at the weakest link. So you have to limit your traffic shaping setup to be just below the actual weakest link.)
The phrase "rebel with rather too many causes" was a phrase originally directed at protest.net -- a event calendaring system for activists that I was briefly involved in over a summer during college. I like the phrase and use it frequently but I didn't want to take credit for it. Google indicates that it originates in NTK #53 I'm not at all surprised.
My parents worked as doctors in Kenya, Papa New Guinea, and elsewhere before they had children. This probably doesn't matter to anyone else but they worked with an organization that was like MSF in that it was a humanitarian organization that sent physicians around the world but it was not actually MSF as the article states. I don't think MSF had grown beyond French doctors when my parents were practicing overseas.
When LWN pointed to the article, and in the original was well, there a focus on some comments I make about non-profit organizations. Since in a context of talk about my political work I just want to clarify my comments in a little more depth here. I think that one problem that has stemmed form Open Source's emphasis on businesses and efficiency is that free/open source software people end up making arguments in business terms: you should use application X because it is more efficient and faster. For many of the folks who have built this whole movement though, and for most in the free software camp, it's about freedom, not efficiency. By targeting businesses, we encounter a skeptical audience. More importantly though, we end up making arguments that, while true, are not the ones that motivate us. I think that low-hanging fruit for free software activists might include groups that already support free software ideas of sharing and user empowerment and that are looking for ways to use free software already. Groups we don't need to be afraid about saying "freedom" around. Not so coincidentally, these are sometimes organizations that I have a lot in common with politically. But that's far from always the case. There's a big group of philosophically aligned organizations in the NGO/non-profit community and the problems keeping them away are often technical. This is good news, of course, since solving technical problems is the free software movement's core competency. This is something I've been thinking about for a long time: Debian-NP was one project I helped start that tried to address this issue. Now, many people involved in the FSF, including myself, have political convictions that go beyond software. I do not want these convictions, and my statements about philosophically aligned organization, to be interpreted as call for a political shift in the organization in mainstream political terms. I deeply respect the way that RMS has kept his political opinions separate from the Foundation's. Biella and I have ever written about the importance of this political demarcation to free software's success. It's certainly not something I would want to change.
$ echo ref: refs/heads/newbranch > .git/HEAD $ git branch master [...] $ git commit -m 'creating newbranch' $ git branch master * newbranchThis comes in handy if you want to maintain two separate components without any common files in the same repository. I am using it currently while experimenting with a new method of storing my home directory in git, which is still far from anywhere. I shall report once I reach a point of success or failure. NP: Rush: Moving Pictures Update: Johannes Schindelin taught me how to do the same without touching files in .git/:
$ git symbolic-ref HEAD refs/heads/newbranch [...]and also addressed the issue which would have all files already committed to the "master" branch now appear in the git status output as staged. This is because the index contains the full copy of a revision of a file, as it would be if committed at any point. git status shows the differences between what has been committed, what would be committed, and what is available in the working tree. Since we pointed HEAD to nowhere ("newbranch" does not yet exist), the index and what has been committed (nothing in this case) diverge, the files are still staged, and thus are scheduled to be part of the impending commit. The way to fix this is to remove the index:
$ rm .git/indexThis may seem weird, but it works, because git recreates the index whenever you switch branches:
piper:~> git init-db Initialized empty Git repository in .git/ piper:~> echo 1 > a; git add a; git commit -m. Created initial commit e774324: . 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 a piper:~> git symbolic-ref HEAD refs/heads/newbranch piper:~> rm .git/index piper:~> git status # On branch newbranch # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a nothing added to commit but untracked files present (use "git add" to track) piper:~> echo 2 > b; git add b; git commit -m. Created initial commit 54ff342: . 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 b piper:~> git branch master * newbranch piper:~> git checkout master fatal: Untracked working tree file 'a' would be overwritten by merge. piper:~> git checkout -f master Switched to branch "master" piper:~> git status # On branch master nothing to commit (working directory clean) piper:~> ls a piper:~> git checkout newbranch Switched to branch "newbranch" piper:~> git status # On branch newbranch nothing to commit (working directory clean) piper:~> ls bAs you can see, the creation of the branch is a bit complex, but once you (forcefully) switched back to master, you can then freely switch between and commit to them.
DEBUG to a number greater than zero, you get debugging info.
Its dependencies are currently libyaml-perl (or libyaml-syck-perl for
faster operation), fuseiso9660 and an user which fuse permissions.
Of course, as I've been working in the architecture, there aren't many
tests. But you can try the powerpc business card ISO for which pancutan currently detects that it's too big for a business card cd:
$ ./pancutan /media/IOMega/mirror/isos/debian-40r0-powerpc-businesscard.iso E: image-too-big - The ISO file is too big for the target media + 73207808About the architecture. The general idea is that a directory is scanned for modules, "requires" them, and extracts metadata embedded into them (I'm still thinking that this can be separated to delay compiling of modules when they're needed, but I haven't decided it yet). From that metadata, tasks and tags (errors and warnings) definitions are loaded. Also a lot of internal sanity checking is performed. There isn't any fixed order of execution, it's constructed based on the dependencies the tasks define. And it has been thought from the start with parallelisation in mind, although that functionality hasn't been written yet (I'll do it during this week). I have written a draft spec for the plug-ins in the wiki. I have to properly document that, but you can get an idea from it. At this point, I'd like to other, more experienced people take a look at it. So feedback is very welcomed, specially from the people that will use the tool!
http://www.red-bean.com/~decklin/userscripts/unembedtube.user.js(I get a perverse sort of nostalgia out of bringing back the "puzzle piece" for links, and mocking people with it.) YouTube embeds will appear to work like any other, but the URL is changed from the Flash wrapper to the FLV file, which can be opened in MPlayer/Totem/whatever. Since we can figure out this URL, it is also, of course, possible to make such the link back into an embed usable by mplayer-mozilla or a similar plugin. Unfortunately, I don't have time to look up how to add a configuration menu, but this line of JS does have a certain charm to it:
var evil = 0; // need to make this user-settableYou know what to do. If you want true evil, there are some pointers in the comments. For YouTube videos embedded from other sites, the best I can kludge for now is link to the video's original YouTube page. If someone would like to write a routine to snarf that page with XMLHTTPRequest and yank the necessary arguments out, I would love to add it. (Insert five-page think piece here about the lost dream of MIME and the sad fact that the rise of Web 2.0 has been driven more by the fact that native installation is irreparably broken and pointless anyway on most PCs than it is by the fact that JavaScript actually works now and the implications of this for the Free Software movement especially in light of the fact that we are still human beings who occasionally do social things like sign up for Twitter even though they're running on some proprietary code base.)
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPT -t nat -A PREROUTING -p tcp --dport portA -j DNAT --to hostB:portB
$IPT -A FORWARD -i eth0 -o eth0 -d hostB -p tcp --dport portB -j ACCEPT
$IPT -A FORWARD -i eth0 -o eth0 -s hostB -p tcp --sport portB -j ACCEPT
$IPT -t nat -A POSTROUTING -p tcp -d hostB --dport portB -j SNAT --to-source hostA
Connections are masqueraded, that means that, for hostB, all connections are coming from hostA. So be careful.
Next.