Today I finally decided to take a shot at making Gyozas, they could have looked better, but they were absolutely delicious...
7 juin 2013 23:47:13 -- tags [ food , cooking , gyoza , japanese ]
Changing topic a bit, a friend and colleague has his band releasing their album today:
The album is released under Creative Commons licence and can be downloaded and streamed directly from their website, and you can by the pressed CD from their shop
Enjoy!
EDIT: Urxvt has a bind on meta-s so I had to add to my .Xdefaults:
URxvt.searchable-scrollback: CM-s
I've using the default window change key bindings in irssi for a long time, plus some aliasse like
alias 30 /window 30
But I've had an idea recently by reading a piece of the /help bind output
/BIND ^W^C /WINDOW NEW HIDE /BIND ^W^K /WINDOW KILL But maybe you wish to give these binds to other people who want to use some other key than ^W, then it would be better done as: /BIND ^W key window /BIND window-^C /WINDOW NEW HIDE /BIND window-^K /WINDOW KILL
I thought that to reduce motion and have a somewhat more fluent feeling for changing windows I should find a set of prefix followed by a simple set of keys. I decided to use meta modifier, and to prefix the 'number' by the index keys for each level. I'm using a dvorak layout:
1 2 3 4 5 6 7 8 9 0 ' , . p y f g c r l a o e u i d h t n s ; q j k x b m w v z ^
And I used the order that I'm the most confortable with:
meta-h (0-20) meta-m (21-40) meta-g (41-60) meta-7 (61-80)
So for each of these I add a named bind just like in the help section, here is a snippet in my .irssi/config:
{ key = "meta-h"; id = "key"; data = "win0"; }, { key = "meta-m"; id = "key"; data = "win1"; }, { key = "meta-g"; id = "key"; data = "win2"; }, { key = "meta-7"; id = "key"; data = "win3"; },
I am using keys in an odd order to follow the ease of access of the keys, keeping meta pressed:
Each of the previously explained prefixes are used as multipliers for these numbers, allowing direct bind access for up to 80 windows.
For example, some examples:
/window 25 meta-m meta-d (prefix win1 -> and 5, here d) /window 40 meta-m meta-6
It takes some time to get used to it, but has a nice feeling to it once into you get you muscle memory into it. Following is the full configuration for dvorak and qwerty layout.
{ key = "meta-h"; id = "key"; data = "win0"; }, { key = "win0-meta-h"; id = "change_window"; data = "1"; }, { key = "win0-meta-t"; id = "change_window"; data = "2"; }, { key = "win0-meta-n"; id = "change_window"; data = "3"; }, { key = "win0-meta-s"; id = "change_window"; data = "4"; }, { key = "win0-meta-d"; id = "change_window"; data = "5"; }, { key = "win0-meta-m"; id = "change_window"; data = "6"; }, { key = "win0-meta-w"; id = "change_window"; data = "7"; }, { key = "win0-meta-v"; id = "change_window"; data = "8"; }, { key = "win0-meta-z"; id = "change_window"; data = "9"; }, { key = "win0-meta-b"; id = "change_window"; data = "10"; }, { key = "win0-meta-g"; id = "change_window"; data = "11"; }, { key = "win0-meta-c"; id = "change_window"; data = "12"; }, { key = "win0-meta-r"; id = "change_window"; data = "13"; }, { key = "win0-meta-l"; id = "change_window"; data = "14"; }, { key = "win0-meta-f"; id = "change_window"; data = "15"; }, { key = "win0-meta-7"; id = "change_window"; data = "16"; }, { key = "win0-meta-8"; id = "change_window"; data = "17"; }, { key = "win0-meta-9"; id = "change_window"; data = "18"; }, { key = "win0-meta-0"; id = "change_window"; data = "19"; }, { key = "win0-meta-6"; id = "change_window"; data = "20"; }, { key = "meta-m"; id = "key"; data = "win1"; }, { key = "win1-meta-h"; id = "change_window"; data = "21"; }, { key = "win1-meta-t"; id = "change_window"; data = "22"; }, { key = "win1-meta-n"; id = "change_window"; data = "23"; }, { key = "win1-meta-s"; id = "change_window"; data = "24"; }, { key = "win1-meta-d"; id = "change_window"; data = "25"; }, { key = "win1-meta-m"; id = "change_window"; data = "26"; }, { key = "win1-meta-w"; id = "change_window"; data = "27"; }, { key = "win1-meta-v"; id = "change_window"; data = "28"; }, { key = "win1-meta-z"; id = "change_window"; data = "29"; }, { key = "win1-meta-b"; id = "change_window"; data = "30"; }, { key = "win1-meta-g"; id = "change_window"; data = "31"; }, { key = "win1-meta-c"; id = "change_window"; data = "32"; }, { key = "win1-meta-r"; id = "change_window"; data = "33"; }, { key = "win1-meta-l"; id = "change_window"; data = "34"; }, { key = "win1-meta-f"; id = "change_window"; data = "35"; }, { key = "win1-meta-7"; id = "change_window"; data = "36"; }, { key = "win1-meta-8"; id = "change_window"; data = "37"; }, { key = "win1-meta-9"; id = "change_window"; data = "38"; }, { key = "win1-meta-0"; id = "change_window"; data = "39"; }, { key = "win1-meta-6"; id = "change_window"; data = "40"; }, { key = "meta-g"; id = "key"; data = "win2"; }, { key = "win2-meta-h"; id = "change_window"; data = "41"; }, { key = "win2-meta-t"; id = "change_window"; data = "42"; }, { key = "win2-meta-n"; id = "change_window"; data = "43"; }, { key = "win2-meta-s"; id = "change_window"; data = "44"; }, { key = "win2-meta-d"; id = "change_window"; data = "45"; }, { key = "win2-meta-m"; id = "change_window"; data = "46"; }, { key = "win2-meta-w"; id = "change_window"; data = "47"; }, { key = "win2-meta-v"; id = "change_window"; data = "48"; }, { key = "win2-meta-z"; id = "change_window"; data = "49"; }, { key = "win2-meta-b"; id = "change_window"; data = "50"; }, { key = "win2-meta-g"; id = "change_window"; data = "51"; }, { key = "win2-meta-c"; id = "change_window"; data = "52"; }, { key = "win2-meta-r"; id = "change_window"; data = "53"; }, { key = "win2-meta-l"; id = "change_window"; data = "54"; }, { key = "win2-meta-f"; id = "change_window"; data = "55"; }, { key = "win2-meta-7"; id = "change_window"; data = "56"; }, { key = "win2-meta-8"; id = "change_window"; data = "57"; }, { key = "win2-meta-9"; id = "change_window"; data = "58"; }, { key = "win2-meta-0"; id = "change_window"; data = "59"; }, { key = "win2-meta-6"; id = "change_window"; data = "60"; }, { key = "meta-7"; id = "key"; data = "win3"; }, { key = "win3-meta-h"; id = "change_window"; data = "61"; }, { key = "win3-meta-t"; id = "change_window"; data = "62"; }, { key = "win3-meta-n"; id = "change_window"; data = "63"; }, { key = "win3-meta-s"; id = "change_window"; data = "64"; }, { key = "win3-meta-d"; id = "change_window"; data = "65"; }, { key = "win3-meta-m"; id = "change_window"; data = "66"; }, { key = "win3-meta-w"; id = "change_window"; data = "67"; }, { key = "win3-meta-v"; id = "change_window"; data = "68"; }, { key = "win3-meta-z"; id = "change_window"; data = "69"; }, { key = "win3-meta-b"; id = "change_window"; data = "70"; }, { key = "win3-meta-g"; id = "change_window"; data = "71"; }, { key = "win3-meta-c"; id = "change_window"; data = "72"; }, { key = "win3-meta-r"; id = "change_window"; data = "73"; }, { key = "win3-meta-l"; id = "change_window"; data = "74"; }, { key = "win3-meta-f"; id = "change_window"; data = "75"; }, { key = "win3-meta-7"; id = "change_window"; data = "76"; }, { key = "win3-meta-8"; id = "change_window"; data = "77"; }, { key = "win3-meta-9"; id = "change_window"; data = "78"; }, { key = "win3-meta-0"; id = "change_window"; data = "79"; }, { key = "win3-meta-6"; id = "change_window"; data = "80"; },
Layout extract:
12345 67890 qwert yuiop asdfg hjkl; zxcvb nm,./
Configuration (untested):
{ key = "meta-j"; id = "key"; data = "win0"; }, { key = "win0-meta-j"; id = "change_window"; data = "1"; }, { key = "win0-meta-k"; id = "change_window"; data = "2"; }, { key = "win0-meta-l"; id = "change_window"; data = "3"; }, { key = "win0-meta-;"; id = "change_window"; data = "4"; }, { key = "win0-meta-h"; id = "change_window"; data = "5"; }, { key = "win0-meta-m"; id = "change_window"; data = "6"; }, { key = "win0-meta-,"; id = "change_window"; data = "7"; }, { key = "win0-meta-."; id = "change_window"; data = "8"; }, { key = "win0-meta-/"; id = "change_window"; data = "9"; }, { key = "win0-meta-n"; id = "change_window"; data = "10"; }, { key = "win0-meta-u"; id = "change_window"; data = "11"; }, { key = "win0-meta-i"; id = "change_window"; data = "12"; }, { key = "win0-meta-o"; id = "change_window"; data = "13"; }, { key = "win0-meta-p"; id = "change_window"; data = "14"; }, { key = "win0-meta-y"; id = "change_window"; data = "15"; }, { key = "win0-meta-7"; id = "change_window"; data = "16"; }, { key = "win0-meta-8"; id = "change_window"; data = "17"; }, { key = "win0-meta-9"; id = "change_window"; data = "18"; }, { key = "win0-meta-0"; id = "change_window"; data = "19"; }, { key = "win0-meta-6"; id = "change_window"; data = "20"; }, { key = "meta-m"; id = "key"; data = "win1"; }, { key = "win0-meta-j"; id = "change_window"; data = "21"; }, { key = "win0-meta-k"; id = "change_window"; data = "22"; }, { key = "win0-meta-l"; id = "change_window"; data = "23"; }, { key = "win0-meta-;"; id = "change_window"; data = "24"; }, { key = "win0-meta-h"; id = "change_window"; data = "25"; }, { key = "win0-meta-m"; id = "change_window"; data = "26"; }, { key = "win0-meta-,"; id = "change_window"; data = "27"; }, { key = "win0-meta-."; id = "change_window"; data = "28"; }, { key = "win0-meta-/"; id = "change_window"; data = "29"; }, { key = "win0-meta-n"; id = "change_window"; data = "30"; }, { key = "win0-meta-u"; id = "change_window"; data = "31"; }, { key = "win0-meta-i"; id = "change_window"; data = "32"; }, { key = "win0-meta-o"; id = "change_window"; data = "33"; }, { key = "win0-meta-p"; id = "change_window"; data = "34"; }, { key = "win0-meta-y"; id = "change_window"; data = "35"; }, { key = "win0-meta-7"; id = "change_window"; data = "36"; }, { key = "win0-meta-8"; id = "change_window"; data = "37"; }, { key = "win0-meta-9"; id = "change_window"; data = "38"; }, { key = "win0-meta-0"; id = "change_window"; data = "39"; }, { key = "win0-meta-6"; id = "change_window"; data = "40"; }, { key = "meta-u"; id = "key"; data = "win2"; }, { key = "win0-meta-j"; id = "change_window"; data = "41"; }, { key = "win0-meta-k"; id = "change_window"; data = "42"; }, { key = "win0-meta-l"; id = "change_window"; data = "43"; }, { key = "win0-meta-;"; id = "change_window"; data = "44"; }, { key = "win0-meta-h"; id = "change_window"; data = "45"; }, { key = "win0-meta-m"; id = "change_window"; data = "46"; }, { key = "win0-meta-,"; id = "change_window"; data = "47"; }, { key = "win0-meta-."; id = "change_window"; data = "48"; }, { key = "win0-meta-/"; id = "change_window"; data = "49"; }, { key = "win0-meta-n"; id = "change_window"; data = "50"; }, { key = "win0-meta-u"; id = "change_window"; data = "51"; }, { key = "win0-meta-i"; id = "change_window"; data = "52"; }, { key = "win0-meta-o"; id = "change_window"; data = "53"; }, { key = "win0-meta-p"; id = "change_window"; data = "54"; }, { key = "win0-meta-y"; id = "change_window"; data = "55"; }, { key = "win0-meta-7"; id = "change_window"; data = "56"; }, { key = "win0-meta-8"; id = "change_window"; data = "57"; }, { key = "win0-meta-9"; id = "change_window"; data = "58"; }, { key = "win0-meta-0"; id = "change_window"; data = "59"; }, { key = "win0-meta-6"; id = "change_window"; data = "60"; }, { key = "meta-7"; id = "key"; data = "win3"; }, { key = "win0-meta-j"; id = "change_window"; data = "61"; }, { key = "win0-meta-k"; id = "change_window"; data = "62"; }, { key = "win0-meta-l"; id = "change_window"; data = "63"; }, { key = "win0-meta-;"; id = "change_window"; data = "64"; }, { key = "win0-meta-h"; id = "change_window"; data = "65"; }, { key = "win0-meta-m"; id = "change_window"; data = "66"; }, { key = "win0-meta-,"; id = "change_window"; data = "67"; }, { key = "win0-meta-."; id = "change_window"; data = "68"; }, { key = "win0-meta-/"; id = "change_window"; data = "69"; }, { key = "win0-meta-n"; id = "change_window"; data = "70"; }, { key = "win0-meta-u"; id = "change_window"; data = "71"; }, { key = "win0-meta-i"; id = "change_window"; data = "72"; }, { key = "win0-meta-o"; id = "change_window"; data = "73"; }, { key = "win0-meta-p"; id = "change_window"; data = "74"; }, { key = "win0-meta-y"; id = "change_window"; data = "75"; }, { key = "win0-meta-7"; id = "change_window"; data = "76"; }, { key = "win0-meta-8"; id = "change_window"; data = "77"; }, { key = "win0-meta-9"; id = "change_window"; data = "78"; }, { key = "win0-meta-0"; id = "change_window"; data = "79"; }, { key = "win0-meta-6"; id = "change_window"; data = "80"; },
1 juin 2013 23:57:22 -- tags [ irssi , bind , touch tying ]
I was wondering what impact on performances can a jail have, so I made a VM and, installed a fresh FreeBSD 9.1, setup nginx on host, and tried various configurations for gunicorn, running a django application in and outside of jail.
For the impatient a small summary in a table. The values are in requests per second.
| - | TCP | UNIX | | ------ | --- | ---- | | Native | 769 (96.97%) | 793 (100%) | | Jail | 708 (89.28%) | 731 (92.18%) |
If you want more, keep reading, you can also reach to the end directly to my conclusions.
This benchmark has been done inside a kvm virtual machine on my main computer, all test running the same vm with the same version of kvm to be the performances were relevant to each other.
Software used in the VM:
OS
Service
Benchmark
I provided siege with an url file containing only urls served by the Django application, avoiding all static files served directly by nginx as they are not relevant to this test.
The Django web application is my girlfriend's website running locally, accessed via a localhost address, but that should be sufficient as what we want here is to compare the same test with changing parameters.
In both setup, the socket can be either TCP on UNIX and both will be tested.
+----+----------------------------+ |host| | +----+ | | | | +-----+ tcp +--------+ | | |NGINX|------------|gunicorn| | | +-----+ socket +--------+ | | | | | +-----+ | | |siege| | | +-----+ | | | +---------------------------------+
Nginx configuration for TCP:
location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 20; proxy_read_timeout 20; proxy_pass http://127.0.0.1:8000 }
Nginx configuration for UNIX:
location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 20; proxy_read_timeout 20; proxy_pass http://unix:/tmp/django.sock; }
+----+----------------------------+ |host| +----+--------+| +----+ |jail| || | +----+ || | +-----+ tcp | +--------+ || | |NGINX|---------|--|gunicorn| || | +-----+ socket| +--------+ || | | | || | +-----+ | || | |siege| | || | +-----+ | || | +-------------+| +---------------------------------+
Nginx configuration for TCP:
location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 20; proxy_read_timeout 20; proxy_pass http://jail_ip:8000 }
Nginx configuration for UNIX:
location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 20; proxy_read_timeout 20; proxy_pass http://unix:/tmp/django.sock; }
siege -b -c 10 -t30S -f urls_dj.txt > /dev/null ** SIEGE 2.70 ** Preparing 10 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 22544 hits Availability: 100.00 % Elapsed time: 29.30 secs Data transferred: 35.21 MB Response time: 0.01 secs Transaction rate: 769.50 trans/sec Throughput: 1.20 MB/sec Concurrency: 9.97 Successful transactions: 21924 Failed transactions: 0 Longest transaction: 0.05 Shortest transaction: 0.00
siege -b -c 10 -t30S -f urls_dj.txt > /dev/null _24.png"> ** SIEGE 2.70 ** Preparing 10 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 23614 hits Availability: 100.00 % Elapsed time: 29.77 secs Data transferred: 36.88 MB Response time: 0.01 secs Transaction rate: 793.33 trans/sec Throughput: 1.24 MB/sec Concurrency: 9.98 Successful transactions: 22964 Failed transactions: 0 Longest transaction: 0.06 Shortest transaction: 0.00
siege -b -c 10 -t30S -f urls_dj.txt > /dev/null [230/462] ** SIEGE 2.70 ** Preparing 10 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 21234 hits Availability: 100.00 % Elapsed time: 29.95 secs Data transferred: 33.62 MB Response time: 0.01 secs Transaction rate: 708.91 trans/sec Throughput: 1.12 MB/sec Concurrency: 9.97 Successful transactions: 20644 Failed transactions: 0 Longest transaction: 0.07 Shortest transaction: 0.00
siege -b -c 10 -t30S -f urls_dj.txt > /dev/null ** SIEGE 2.70 ** Preparing 10 concurrent users for battle. The server is now under siege... Lifting the server siege... done. Transactions: 21960 hits Availability: 100.00 % Elapsed time: 30.01 secs Data transferred: 34.78 MB Response time: 0.01 secs Transaction rate: 731.81 trans/sec Throughput: 1.16 MB/sec Concurrency: 9.97 Successful transactions: 21357 Failed transactions: 0 Longest transaction: 0.07 Shortest transaction: 0.00

1 juin 2013 15:05:37 -- tags [ nginx , gunicorn , FreeBSD , django , jail , benchmark ]
I've been using conkeror for a while now, and like in any keyboard driven browser, the hinting system is at the heart of your daily browsing.
One thing I like in conkeror's hinting system, is the ability to filter out links using part of the words making up the link, but I found it annoying to go as far as 123456789 for hinting if the filtering didn't match exactly one link, or if you didn't want to use the filters. So I decided to try out another method, using my home keys as hints, but breaking the filtering (as most keys are now used by hints). To use it simply add this to your rc, and adapt the key sequence to your layout's homerow:
hint_digits="dhutenosai";
Here you go, no more need for streching out to follow links.
1 juin 2013 11:40:33 -- tags [ conkeror , keyboard , touch typing , mouseless ]
For those of you who may have missed it, I made a brand new site for Camille, showing all of her best creations, check it out !
Et voila, l'ancien site est perdu, mais voilà une nouvelle mouture. Pour ce qui est de l'accès aux mails 2 webmail sont accessible depuis la barre en haut.
Il n'y a pas encore de galerie pour le moment, ça reviendra peut-être bientôt si j'ai le courage de m'en occuper.
Here we go, the old site is lost, but here is a new version. For mails, the 2 webmails are available in the top naviguation bar.
There is no gallery yet, it may come back soon if I have enough motivation to take care of it.
28 mai 2013 01:21:35 -- tags [ new , ratonland , info , french ]