software
New version of chess PGN to TeX to PDF converter
1OK, I’m shameful. After fighting with Scid’s exporter, and then correcting bugs in pgn2ltx’s source, I finally decided to take a look at that PGN file format. And guess what? It’s already composed of FEN notation. And guess what? that super-über cool new skaknew module for LaTeX gets its input as FEN!!
Updated mate-in-one document, now includes chess coordinates
0
After a request to have coordinates on the board, to be able to write answers (a really nice idea, especially that Ido begins writing), I noticed I couldn’t do it so easily, because the LaTeX module (chess12) didn’t support that. What a disappointment!
And the only way I had for converting from PGN to TeX was through Scid (still cool, still being developed), but supporting only exports to TeX with chess12 module. Fortunately, Dirk Baechle wrote a tool to convert directly from PGN format to TeX, using his tool pgn2ltx. That tool, written in C++ hasn’t been updated since 2003, so after a small patch to the source, it worked!
And the best part, is that it generates TeX files for the skak module, the best alternative to the old, dead chess12 module.
Auto-provisioning with Asterisk and ST2030 Technicolor/Thomson phones
0An introduction to the ST2030
The ST2030 is one of the few SIP phones distributed by Thomson (now changed name to Technicolor). In fact there are only 2 models: the ST2020, and the ST2030, and also a new one, the TB30, which is the successor to the ST2030. The ST2030 is supposed to have an End-of-Life set to the end of this year (2010), but I read that its EOL has been extended to the end of 2012.
In my personal experience, I think the ST2030 has the best price/functionalities/quality ratio. It has features like:
- PoE (Power over Ethernet).
- Headphone plug with a button on the phone to pickup with the headphone (or if you have a compatible headphone, pickup directly with a button on the headphone).
- XML based Directory support, that you can interface with a remote HTTP server.
- 4 differents lines/profiles (but not at the same time).
- BLF (Busy Lamp Fields) to monitor other’s phone status (if they are using their phone, and even possibility to intercept a call).
- Full compatibilty with Asterisk (tested on Asterisk 1.6+ and 1.8+).
- Auto-provisioning with support for TFTP but also for HTTP/HTTPS, which simplifies quite a lot the provisioning configuration.
In this document, we’ll see the auto-provisioning process through DHCP+HTTP.
Puppet: Files found in modules without specifying ‘modules’ in file path will be deprecated in the next major release
0DEPRECATION NOTICE: Files found in modules without specifying ‘modules’ in file path will be deprecated in the next major release.
If you get this warning in your puppet logs, you should take action (only if you don’t have any Puppet agent with a version <= 0.24) and modify all you references to file resources.
For example, if you have a module named 'ssh', normally, up to puppet 0.25 you would reference a file to it as:
source => ["puppet:///ssh/authorized_keys",]
But now, you need to insert a ‘module’ identifier in between like this:
source => ["puppet:///modules/ssh/authorized_keys",]
Just a small note: It seems that the templates do not need any modification.
Where do I find pngout for Linux?
0I just found a nice comparison chart of different compression programs for PNG images (optimizations). It seems that PNGout is the best of the best :-) On the author’s website, there’s only a windows version. The link to the Linux version gets redirected to a gtagaming website?!
After asking the great oracle Google where I could find a version for Linux, he replied to me I could find it on JonoF’s website.
Asterisk: DADHI module not working when using Xen
5If you want to use any Asterisk module that needs a timer, like MeetMe, you have to use a module named dahdi (previously named zaptel). DAHDI has one module for each Digium supported card (B410P), and a dummy module (named dahdi_dummy) if you don’t have a hardware card, like me.
The problem appears when you have your Asterisk in a Xen environment. Xen does not allow the use of the RTC, so when using Dahdi/meetme, you get the following in you logs:
res_timing_dahdi.c: Asterisk has detected a problem with your DAHDI configuration and will shutdown for your protection.
So get the sources, and let’s patch it!
svn co http://svn.digium.com/svn/dahdi/linux-complete/trunk DAHDI
In dahdi_dummy.c, you’ll have to comment the two defines USE_RTC, as in a Xen, you can’t use it:
# diff -u dahdi_dummy.c.ori dahdi_dummy.c --- dahdi_dummy.c.ori 2009-03-23 09:50:36.000000000 +0000 +++ dahdi_dummy.c 2009-03-23 08:55:38.000000000 +0000 @@ -59,11 +59,11 @@ #if defined(CONFIG_HIGH_RES_TIMERS) && LINUX_VERSION_CODE >= VERSION_CODE(2,6,22) #define USE_HIGHRESTIMER #else -#define USE_RTC +//#define USE_RTC #endif #else #if 0 -#define USE_RTC +//#define USE_RTC #endif #endif #endif
Then compile the module, as usual, with :
/etc/init.d/dahdi stop make all make install make config
Verify that your module has been correctly installed:
ls -al ./2.6.24-19-xen/dahdi/dahdi_dummy.ko
Comment out all the defined modules in the /etc/dahdi/modules file.
/etc/init.d/dahdi start # dmesg 1007539.576458] dahdi: Telephony Interface Registered on major 196 [1007539.576468] dahdi: Version: SVN-trunk-r6201M [1007540.642839] dahdi: Registered tone zone 2 (France)
Django: How to find the url/path you’re into, in a template loaded by a generic view
0In a Django project, I have a template that is used by two urls, which is quite common (generic views, using ‘create_object’ and ‘update_object’). The problem is that I had to add a supplementary menu just when the template is loaded from the ‘update’ generic view, and not from the ‘create’ generic view.
Making the difference between the two urls calls at the template level is a problem because it’s managed by generic views, so the same template is used.
Anyways, there are several possibilities:
In urls.py, use the ‘template_name’ variable, where you can speficy a specific template for this url(). That is instead of using the default <model>_form.html.
What I don’t like in this situation, is that I will have two nearly similar templates, just for an added menu. Not cool. Another problem is that I use a loop to create all my urls. So if I add a special template, I’ll add it to ALL my models :-(.
Another solution, is to find a way to use a variable in the template that would be different wether the template has been loaded by update_object or create_object.
In our urlpatterns in urls.py, we can use the ‘extra_context‘ variable (takes a dictionnary as parameter). It is correctly managed, even when using generic views. So, you’ll have :
url(r'foo/ajouter/$', 'django.views.generic.create_update.create_object', dict(form_class=modelForm, extra_context={'usage':'create'}, name='foo_create',)) url(r'foo/%s/(?P<object_id>\d+)/modifier/$', 'django.views.generic.create_update.update_object', dict(form_class=modelForm, extra_context={'usage':'modify'}, name='foo_update'))
We can also use, in urls.py, the ‘context_processors’ variable. For more information about the context processors, have a look at this tutorial. The goal is to add ‘django.core.context_processors.request’, like this:
from django.core.context_processors import request
and in the url(), add context_processors:
url(r'foo/ajouter/$', 'django.views.generic.create_update.create_object', dict(form_class=modelForm, context_processors=[request,]), name='foo_create',))
The last possiblity is a more global solution. It’s like the context_processors usage above, but added into every templates automatically.
To do this, you’ll have to edit the list of Template Processors in your settings.py file. That list is run each time a template is loaded, and allows one to add any variable to the template automatically. By default (on Django 1.0.x) this list is commented out, so it has by default the list:
("django.core.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media")
You’ll have to uncomment it, and add ‘django.core.context_processors.request’. By doing this, you get the variable ‘request.path’ available in your template.
Finally, you’ll be able to test your variable with {% ifequal %} and display your conditional elements.
Asterisk cirpack problem with Free and freephonie.net
0If you configured your Asterisk/FreeSWITCH server to talk to your freephonie.net (french Free ISP provider), you’ll see in the logs the following warning message:
[Feb 12 09:29:06] WARNING[9228]: chan_sip.c:6624 determine_firstline_parts: Bad request protocol Packet
This is not really a problem, but an annoyance, as it fills up your logs. This is a known problem for more than years, but has never been corrected (neither by Asterisk nor by Cirpack devs). The usual correction was to add the following line to your startup scripts (/etc/rc.local on Debian for example):
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "Cirpack KeepAlive Packet" -j DROP
But the syntax has changed in iptables, and you’ll get the error:
iptables v1.3.6: STRING match: You must specify `--algo'
so, just add one of the 2 available algorithms (bm and kmp):
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "Cirpack KeepAlive Packet" --algo bm -j DROP
Python snippet to get Mediawiki/Wikipedia Recent Changes externally
0Mediawiki allows one to send Recent Changes (RC) to a UDP port.
The ip address is defined by the variable wgRC2UDPAddress, and the port by the variable wgRC2UDPPort. It’s a really good idea that it’s a UDP transfer, since there is no need for any ACK, so Mediawiki doesn’t block if there is nothing listening on that port.
These parameters must be set in the LocalSettings.php file, like this, for example.
$wgRC2UDPAddress = '127.0.0.1';
$wgRC2UDPPort = 9390;
I wrote a really simple python program (more a proof of concept) that receives the data, cleans it, and then prints it to stdout :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# vim:syntax=python:sw=4:ts=4:expandtab
import SocketServer
import re
HOST,PORT = '', 9390
class MyUDPHandler(SocketServer.BaseRequestHandler):
def handle(self):
print re.sub(r'\x03\d{0,2}', '', self.request[0])
if __name__ == '__main__':
server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
server.serve_forever()
I plan to make it into a complete project that will send the data/notifications using Jabber(XMPP).









Recent Comments