Posts Tagged unix
Extending PostgreSQL with Python
One of the features I enjoy the most about PostgreSQL is the ability to write stored procedures in C, Perl, TCL, PgSQL, and yes… obviously also in Python. I’ve been using this feature since 7.4, so any recent version of PostgreSQL is pretty much guaranteed to support it, but you’ll need to have the pl/python procedural language contrib module installed. Once it’s installed, you can activate it for your current database using the following query:
CREATE PROCEDURAL LANGUAGE plpythonu;
Once the language bindings have been activated, you can start writing your stored procedures in python, however you should really read up on the following subjects first:
As an example, I’ve written a little SP in PL/Python to provide support for PCRE since the stock distribution of PostgreSQL only supports LIKE/SIMILAR, and POSIX Style Regular Expressions.
Let’s create our Python language binding, and create a standard text storage table:
-- Activate PL/Python CREATE PROCEDURAL LANGUAGE plpythonu; -- Create a plain text-storage table CREATE TABLE text_storage ( id serial NOT NULL, payload character varying(128), CONSTRAINT text_storage_pkey PRIMARY KEY (id) ) WITH (OIDS=FALSE); ALTER TABLE text_storage OWNER TO xavier; -- Let's throw in an index on the payload field for good measure CREATE INDEX txt_payload_idx ON text_storage USING btree (payload);
Let’s now populate our table with some junk data:
INSERT INTO text_storage (payload) VALUES ('hello, world'); INSERT INTO text_storage (payload) VALUES ('the quick brown fox, blah blah blah'); INSERT INTO text_storage (payload) VALUES ('PCREs in Postgres'); INSERT INTO text_storage (payload) VALUES ('All hail Python!'); INSERT INTO text_storage (payload) VALUES ('Hello, test data!'); INSERT INTO text_storage (payload) VALUES ('Python would like to say Hello!');
And now we can go ahead and create our Python SP itself:
CREATE OR REPLACE FUNCTION pcre(text, text) RETURNS INTEGER AS $BODY$import re regex = args[0] in_str = args[1] compiled = re.compile(regex) IF compiled.search(in_str): RETURN 1 ELSE: RETURN 0$BODY$ LANGUAGE 'plpythonu' VOLATILE COST 100;
As you can see, our PCRE matching system is extremely simple, yet pretty powerful. We import Python’s built-in re module, compile the specified regex argument, then attempt to match it against the other argument. Here’s a usage example on our test table:
SELECT id, payload FROM text_storage WHERE pcre('[H|h]ello', payload) = 1; id | payload ----+--------------------------------- 1 | hello, world 5 | Hello, test DATA! 6 | Python would LIKE TO say Hello! (3 rows)
As always, feel free to suggest any improvements.
Apache2 shortcuts
I’ve been maintaining and managing Apache servers for over 10 years now, but for some reason, I never bothered to RTFM when it came to enabling/disabling modules and site configs in apache2.. As it turns out, you don’t have to manually create symlinks from mods_available to mods_enabled and sites_available to sites_enabled, as Apache2 includes a handful of shortcut scripts to do this work for you… Doh!
To enable a module in your apache2 config, instead of doing the old
ln -sf /etc/apache2/mods_available/mod_rewrite.conf /etc/apache2/mods_enabled/mod_rewrite.conf ln -sf /etc/apache2/mods_available/mod_rewrite.load /etc/apache2/mods_enabled/mod_rewrite.load
Next time, just do:
a2enmod rewrite && /etc/init.d/apache2 restart
To disable this module, try
a2dismod rewrite && /etc/init.d/apache2 restart
Similarly, to enable a site config, try
a2ensite myVhost.com && /etc/init.d/apache2 restart
and to disable it, obviously, try
a2dissite myVhost.com && /etc/init.d/apache2 restart
Finally, if you’d like to lint through your Apache2 config files before issuing a restart which might be responsible for some downtime if it doesn’t work, try
apache2ctl configtest
Ahh those cool little CLI tools…
The list of Unix/Linux utilities available grows every day. Here’s a little list of cherry-picked utilities i’ve found myself using more and more lately…
Inotail:
Inotail uses the Linux kernel’s inotify API, which was implemented with v2.6.13 to monitor changes to files on the filesystem. This design is more efficient than our beloved tail, which relies on polling the monitored file for changes every second. Example: To monitor in real-time syslog entries, try:
inotail -f /var/log/messages
The documentation for inotail, if you need it, can be found at http://distanz.ch/inotail/
Incron:
Incron is an event-scheduler similar to cron, except that it is based on file-system events as opposed to our beloved time-based cron daemons. It is also based on the inotify subsystem, which means it is only available on Linux as far as I know. Let’s set up a quick example to demonstrate the stuff you can do with incron. We’re going to install incron, and configure it to automatically create a thumbnail of any picture dropped in a specified directory using ImageMagick’s convert utility, on a stock Ubuntu Linux system:
# Package installation aptitude install incron imagemagick # Add your user account to the list of allowed incron users (replace xavier by your account) sudo sh -c "echo xavier >> /etc/incron.allow" # Create our directory structure mkdir -p /home/xavier/images/original mkdir /home/xavier/images/thumb # Edit the actual incron file incrontab --edit
The editor will now fire up. Enter the following lines in the editor, and exit:
# Convert /home/xavier/images/original/test.png to /home/xavier/images/thumb/test.png /home/xavier/images/original/ IN_CLOSE_WRITE convert -thumbnail 320x320 $@/$# $@/../thumb/$# # When an original is deleted, automatically clean up the associated thumbnail /home/xavier/images/original/ IN_DELETE rm -rf $@/../thumb/$#
We’re all done. Any new image dropped in /home/xavier/images/original/ will automatically be converted into a thumbnail of the same name in /home/xavier/images/thumb/. There are many things you can do with incron, so i suggest you check out the following links:
- Incron Documentation: http://inotify.aiken.cz/?section=incron&page=doc&lang=en
- Incron FAQ: http://inotify.aiken.cz/?section=incron&page=faq&lang=en
- inotify.h: http://www.kernel.org/pub/linux/kernel/people/rml/inotify/headers/inotify.h
ccze
ccze is simply a logfile syntax highlighter for various file-formats commonly found on unix systems, such as syslog, apache logs, dmesg, etc… You can have it syntax-highlight a file in your terminal by using the following syntax:
ccze < /var/log/messages
Or you can pipe anything onto ccze to have it stream syntax-coloured output on your terminal. For example:
inotail -f /var/log/messages | ccze -A
Additionally, ccze can also output syntax-coloured text in HTML. For example, the following command:
dmesg | grep -i cpu | ccze -m html
Woud output the following document: ccze Output
on Delicious
on Twitter