Monday, 19 November 2007
Config files in RPM files
all about when files are stored with extension .rpmnew or .rpmsave, and when the current file is actually replaced with the new file
Saturday, 17 November 2007
Kolab Groupware Calendaring
See my kolab groupware calendaring pages
I wrote this documentation while trying to setup a working groupware calendaring solution. It is basically a log of this process, including the problems that I came across, and how I solved it, often with help from helpful people from the associated projects. I hope this text can help other people who will have the same problems. Some portions of this text are tailored for the server environment (SLS) of OM, the organisation that I work for.
Free Visual C++ Toolkit
copy nmake.exe from .net SDK into bin directory
use the shortcut to start a cmd box with the environment variables set
Blog about it
http://blogs.msdn.com/brianjo/archive/2004/04/17/115335.aspx
Manual from Microsoft about nmake.exe
review from a linux point of view:
llg.cubic.org
If you have a Visual C++ 6 IDE, just copy over the bin, lib, and include directory, and compiling works. Debugging does not.
Some CSV functions for VBA
Function getCountCSV(ByVal list As String) As String
Dim number As Integer
number = 0
While Len(list) <> 0
Call getNextCSV(list)
number = number + 1
Wend
getCountCSV = number
End Function
Function getNextCSV(list As String) As String
Dim commaPosition As Integer
commaPosition = InStr(list, ",")
If (commaPosition = 0) Then commaPosition = InStr(list, ";")
If (commaPosition <> 0) Then
getNextCSV = Trim$(Mid$(list, 1, commaPosition - 1))
list = Trim$(Mid$(list, commaPosition + 1, Len(list) - commaPosition))
Else
getNextCSV = Trim$(list)
list = vbNullString
End If
End Function
Function getCSVValue(list As String, index As Integer) As String
' list is the text with comma separated values
' index is starting from 0
' returns the value at the given position in the list
Dim counter As Integer
Dim element As String
Dim listcsv As String
counter = 0
listcsv = list
element = getNextCSV(listcsv)
While (counter <> 0)
element = getNextCSV(listcsv)
counter = counter + 1
Wend
getCSVValue = element
End Function
BsDiff for Windows and .net
I made some adjustments, so that it would compile in C++ mode in Dev-C++ IDE (mingw compiler), using the libbzip2 package.
This version is based on bsdiff 4.1. The difference between 4.1 and 4.2 is only in the patch program, instead of using lseek and read he now uses pread, which I find this text about it:
source
Another thing to take note of is that Linux 2.2 introduces the pread() and pwrite() system calls. These allow a process to read and write from a specified position in a file. This is similar, but not identical, to using the lseek() system call followed by an ordinary read() or write() system call. In particular, concurrent access to a file (required for asynchronous I/O (AIO) support) requires the pread() and pwrite() system calls.
In the windows version, I had to adjust the code anyway, because I am not using pipes, but keep the file open for reading. I guess the bug of the official bsdiff had to do with the concurrent access of the several forks of the program to the file. That does not happen in the windows version at all, the file is opened only once.
For questions, write to Timotheus Pokorra.
Here are the sources (including the .dev files for Dev-C++): bsdiff_win_src.zip
Here are the 2 executables: bsdiff_win_exe.zip
The code is licensed under the BSD Protection License (see the original LICENSE file in bsdiff-4.1.tar.gz).
See also Andreas John's bsdiff for Visual C++.
May 2007: I have ported the program to Delphi.net, and with small modifications (make it a proper dll) you can use it even with C# programs. If anyone is interested in the code, I will be happy to share it. Drop me an email...
June 2007: Ok, someone has dropped me an email, and here is the delphi.net version, with all required dlls. also read the readme.txt included in the archive, and the documentation in bsdiff.pas. If you have questions, ask!
bsdiff.net.zip
SQL2Diagram
It basically parses the SQL Create Table statements and generates both HTML documentation and diagrams in XML format that can be displayed with the program Dia.
Installing Java Stored Procedures on PostgreSQL 8.0 (Win)
look at the page PL Java Website.
change the file C:\Program Files\PostgreSQL\8.0\data\postgresql.conf:
dynamic_library_path = '$libdir;C:/Program Files/PostgreSQL/8.0/pljava'
custom_variable_classes = 'pljava'
pljava.classpath = 'C:/Program Files/PostgreSQL/8.0/pljava/pljava.jar'
set CLASSPATH=%CLASSPATH%;deploy.jar;..\jdbc\postgresql-8.0.309.jdbc2.jar;pljava.jar
java org.postgresql.pljava.deploy.Deployer -install -database mydatabase -user somesuperuser -password mypasswd
java.sql.SQLException: ERROR: could not load library "C:/Programme/PostgreSQL/8.0/lib/libpljava.dll": dynamic load error
runas /user:postgres cmd.exeI started postmaster in one command line box, and then psql in another DOS box. That told me that jvm.dll could not be found. Finally I realised, that the path needs to be set before the postmaster is started.
postmaster -d 5 -D ../data/
Use patched files in RPMs
diff -uNr the_package/the_file \
the_package/the_file.new > the_file.patch
copy the patch file to /usr/src/redhat/SOURCES
The spec file has those lines:
After Sources:
Patch0: the_file.patch
After %setup, before %build
%patch -p1
To get your new version from the original file:patch slapd.conf.template \
../../slapd.conf.template.patch \
-o slapd.conf.template.new
Package a Perl module
You need to install perl-Archive-Tar-1.08-2.noarch.rpm and perl-RPM-Specfile-1.17-1.noarch.rpm.
A description of the module perl-RPM-Specfile can be found on cpan.
Download this perl script, called cpan-to-rpm.pl. It is described as followed: "Grab a module from CPAN and sock it into an RPM using cpanflute2"
Call it this way:
perl cpan-to-rpm.pl \
authors/id/M/MU/MUIR/modules/Net-Netmask-1.9011.tar.gz
perl cpan-to-rpm.pl \
authors/id/D/DJ/DJKERNEN/Mail-IMAPClient-2.2.9.tar.gz
That will create
/usr/src/redhat/SRPMS/perl-Net-Netmask-1.9011-1.src.rpm
If you install it withrpm -i /usr/src/redhat/SRPMS/perl-Net-Netmask-1.9011-1.src.rpm
you can build the rpm from it withrpmbuild -ba /usr/src/redhat/SPECS/perl-Net-Netmask.spec
to see what an rpm provides:
rpm -qlp --provides perl-LDAP-0.31-4.noarch.rpm
The file list conversion from OpenPKG
One idea could be, to download the file from the OpenPKG CVS and save it to /usr/bin/rpmtool; you need to change the first line of that file to #!/bin/bash
Also add at the top of the spec file:
%define l_rpmtool /usr/bin/rpmtoolThe other idea is, to install the OpenPKG source rpm of the package concerned:
/kolab/bin/openpkg rpm -i kolab-webadmin-0.4.0-20050318.src.rpmIn the /kolab/RPM/SRC/kolab-webadmin/kolab-webadmin.spec
insert after the l_rpmtool line:
cp files /usr/src/redhat/SOURCES/kolab-webadmin.files
Rebuild the package, which will create the kolab-webadmin.files:
/kolab/libexec/openpkg/rpmbuild -ba /kolab/RPM/SRC/kolab-webadmin/kolab-webadmin.spec
Perhaps need to change the paths, e.g. for perl:
in vi:
:%s/\/kolab\/lib\/perl\/vendor_perl\/5.8.5/\/usr\/lib\/perl5\/vendor_perl\/5.8.3/g
You need to put it into an archive:
cd /usr/src/redhat/SOURCES/
tar cvf kolab-webadmin.files.tar kolab-webadmin.files
In the fedora spec file,
/usr/src/redhat/SPECS/kolab-webadmin.spec
, you would add in the sources:Source1: kolab-webadmin.files.tar
In the %prep section, insert:
%setup1 -D -T -b 1 -n kolab-webadmin-%{version}
As the parameter for -n, give the name of a directory that is created for the main tar file anyway.
In the %install section, remove the rpmtool lines; instead, you change the %files line:
%files -f ../kolab-webadmin.files
Converting OpenPKG spec file to Fedora
See /usr/local/kolabopenpkg/etc/openpkg/rpmmacros to know what the macros (e.g. %l_musr) mean.
To get the spec file, install the OpenPKG source package:
/kolab/bin/openpkg rpm -i kolab-webadmin-0.4.0-20050318.src.rpmCopy the
/kolab/RPM/SRC/kolab-webadmin/kolab-webadmin.spec
to /usr/src/redhat/SPECS
;Copy the other files (e.g. .tar.gz archives) to
/usr/src/redhat/SOURCES
One special thing is that the required packages in OpenPKG don't only include the package name and required version number, but often also options that were included when configuring and building the package.
For example, cyrus-sasl::with_ldap would require that the cyrus-sasl::with_ldap is advertised in the Provides: tag in the spec file.
A common approach is not to advertise all compiling options, but to know the packages and test them thoroughly.
Remove the line:
Class: JUNK
To understand some of the macros, in the form %{something}, have a look at /usr/lib/rpm/macros and /usr/local/kolab/etc/openpkg/rpmmacros.
Insert these lines near the top:
%define l_prefix /kolabReplace all occurances of "apache" with "httpd" in your spec file.
%define l_make %{__make}
%define l_mflags -m
# m actually is ignored, compatibility
It seems, the spaces before the %setup -q are not correct. Remove them!
Lines like
%{l_shtool} install
: just remove all the %{l_shtool}; install should work fine;remove also the
%{l_value -s -a}
(though I am not sure what those characters stand for)
Quick RPM lookaround
That is how I learnt about RPM packaging of software for Fedora Linux.
My goal was to create Fedora packages for Kolab, which is packaged with OpenPKG.
Links to RPM introductions
- The Basics of Developing With RPM
- Maximum RPM Manual (with example, the %setup and %patch macros)
- Building Packages with OpenPKG
- Packaging software with RPM (explains beside other things how to use patches)
Basic Idea of SRPMS
rpm -i some-package-0.0.1.src.rpmwill put some tar file(s) and patches in /usr/src/redhat/SOURCES; and will put the some-package.spec file in /usr/src/redhat/SPECS
to build the src.rpm and the rpm, run
rpmbuild -ba /usr/src/redhat/SPECS/some-package.spec
That will create the files /usr/src/redhat/SRPMS/some-package.src.rpm and /usr/src/redhat/RPMS/i386/some-package.rpm.
Find IP address of a Pocket Print Server (e.g. DP-301P+)
i=1; \That should give a list of all computers on that subnet 192.168.1.0. The MAC address should tell you the IP address of the print server.
while [ $i != 254 ]; do \
ping -c 1 192.168.1.$i; \
i=`expr $i + 1`; \
done
arp -a
VPN between 2 networks with same IP address scheme (Windows)
route add 192.168.1.84 MASK 255.255.255.255 192.168.1.160...1.84 is the number of the computer you want to contact in the other network, ...1.160 is the client IP address of the VPN network connection.
To prevent your traffic into the Internet to go through the VPN, use:
route change 0.0.0.0 mask 0.0.0.0 192.168.1.250 metric 20(.250 is the local network gateway into the internet)
If it gives the error: "The route addition failed: The parameter is incorrect." or "Hinzufügen der Route fehlgeschlagen: Falscher Parameter.", try using another local IP address. I found, the local IP address should not be too distant from the VPN client IP address.
Another annoying error I had, was that after some time of a working connection, I could not reconnect the VPN:
Error 619 came up, german: "Fehler 619 Ein unbekannter Fehler ist aufgetreten" nach "Benutzername und Passwort werden verifiziert".
My solution was, to set my LAN connection on a new IP address. Other people solved it by reinstalling their NIC card.
GIMP, Gaim, GTK
according to the gimpwin-users list, do this:
Install Gaim's GTK+- 2.2.4, then Gaim, then uninstall Gaim's GTK+-, and install GTK+- 2.4.1 and Gimp. Gaim should still work with GTK+- 2.4.1.
You also need to copy the file Program Files\Common Files\GTK\2.0\bin\zlib1.dll to zlib-1.dll.
Download websites with dynamically generated content (question mark in URL)
wget http://www.somewebpage.org --recursive \
--level=5 --relative --tries=1 --convert-links
Using WinMerge to compare CVS branches
For the revision tag, the regular expression filter in WinMerge works fine: WinMerge, Tools, Filters, LineFilters: $Revision\: .*$
For the CVS commit history log, I have implemented a prediffer Plugin similar to Plugins\src_VCPP\IgnoreCommentsC from the source code of WinMerge.
The source code for the prediffer plugin is here:
This is specifically designed for Delphi code. It should be easy to adapt to different languages.
Backup/Restore a harddisk image onto a samba network drive
Use SystemRescueCd:
for resizing partitions, creating/deleting partitions:
run_qtparted
mount -t smbfs \
-o username=myusername,password=mypassword \
//<ip-address of linux server>/homes \
/mnt/temp1
for storing/restoring of images of partitions:
partimage
Reports with Symfony
I looked into PM Report 4.1 by Zeke Walker, but did not think it would be what I needed.
So this is what I did:
edit the Peer class of your table, and add a function that will return the data that you will need in the report:
lib/model/MyTablePeer.php
static function getAllRowsWithBlabla()
{
$con = Propel::getConnection(self::DATABASE_NAME);
$sql = 'SELECT * FROM '.self::TABLE_NAME.' WHERE a=1 ORDER BY nachname, vorname';
$stmt = $con->prepareStatement($sql);
$rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
return BasePatePeer::populateObjects($rs);
}
Then in apps/myapp/modules/mytable/actions/actions.class.php add an action for the report:
public function executeReportVereinsmitglieder()
{
$this->items = MyTablePeer::getAllRowsWithBlabla();
}
Finally, create a success page:
apps/myapp/modules/mytable/templates/reportBlablaSuccess.php
<?php use_helper('Text', 'Date') ?>
<div id="datecreated">Date created:
<?php echo format_date(time(), 'd', 'de');?></div>
<div id="doprint"><a href="javascript:window.print()">
Print this report</a></div>
<h2>My blabla report</h2>
<?php $first = true; ?>
<?php foreach($items as $item): ?>
<?php
if ($item->getSomeCondition())
{
if ($first)
{
$first = false;
}
else
{
echo ', ';
}
echo $item->getMyValue();
}
?>
<?php endforeach ?>
To disable some items for printing, I changed the css styles
in file apps/myapp/templates/layout.php:
<style type="text/css">
@media print {
/* ... format definitions for printing ... */
#navigation { display:none; }
#title { display:none }
#doprint { display:none }
}
</style>
Symfony I18N
I have changed the
default_culture
in myapp/config/i18n.yml
Based on this blog entry with german translations I have created my own version:
save it as apps/mybackend/messages.de.xml
Symfony Project
To make it run on a Debian Virtual Private Server:
add to file /etc/apt/sources.list this line:
deb http://www.symfony-project.com/get debian/Then install the required packages:
apt-get install php-pear php5-symfony php5-mysql php5-xslSee the "My First Project"-Tutorial for initialising your project.
HTML2Wiki, Wiki2HTML
- wiki2html.sh: This is a linux shell script, using sed, to convert a single page from a wiki into a static html file. see file for more comments.
- See html2wiki for an online version of the Perl module HTML::WikiConverter::MediaWiki.
Integration of phpNuke and MediaWiki (Authentication)
The goal is, that users are only registered on phpNuke, and can use the same username on MediaWiki, without logging in twice.
Readme.txt, Download, Auth_phpnuke.php, authphpnuke.php, modules/MediaWiki/index.php.