Sunday, 2 March 2008

Manage webspace with Hostsharing

I am a member of Hostsharing eG, which is a German company owned by its members with the aim to take the idea of Open Source to Webhosting. You don't need to worry about backups or availability, because the webmasters do it all for you. But you still have SSH access and many other powerful tools to manage your applications that are running on the server.

Recently I had to fight off an intruder who had used a security leak in one of my php applications. He had added 700 MB somewhere, the quota command showed it, but all calls of du did not show the files. Finally I realised I have to run find / -group pac00 which shows all files that belong to my own user or my subusers, who all belong to the group e.g. pac00.

Another issue that I often have is that some files are created with PHP and they belong to user httpd. That means they don't show up at all on the quota command, which is not fair for the other users, because everyone has to pay for the used webspace.
The first step is to actually find those files. I have written the script pac-du-httpd, which goes through all the users' directories and prints the filenames that are owned by httpd to a file, and also prints the overall sum size of those files. You can find the file here: pac-du-httpd.sh

The next step is to change the ownership of those files. On the support mailing list (yes, Hostsharing eG has as much open communication as any other Open Source project) there is a very useful explanation of how to delete such files:
Support Anleitung
The basic idea is: first run the script as normal PHP with user httpd, and change the file permissions so that everybody can change them, and then to run the script again, to delete the file.
In my situation though I don't want to delete the file, but would like to change the permission. I finally got this solution to work:
<?php
# first run as php file with httpd, to give permissions (chmod 0666) then run with cgi to recopy the file

$dh = opendir('./');

while( ($file = (readdir($dh))) !== FALSE )
{
if ($_SERVER["ORIG_SCRIPT_NAME"] == '/cgi-bin/phpstub')
{
copy ($file, $file.".tmp");
unlink ($file);
copy ($file.".tmp", $file);
unlink ($file.".tmp");
}
else
{
chmod($file, 0666);
}
}
?>

I first run the script to change the file permissions, and then I run it again via CGI so that it runs for the user that the files should belong to. I make a copy of the file, delete the original, and rename the copy back. This works perfectly. And for the future, I will let the PHP always run via CGI (see also Hostsharing documentation on PHP via CGI)

Another useful tool is pac-du-quota, which is referenced from the Hostsharing Documentation on Webspace.
I have extended it to also list the size of the MySQL databases, which is in my case also quite a bit of data...
Insert this in the function collectSpace just before "#Wenn User exisiteren aufsammeln":
# Mysql Datenbanken
for DB in /var/lib/mysql/${PAC}_*; do
let COUNTER=COUNTER+1
TEMP=`du -s "$DB"`
SPACE[$COUNTER]=`echo $TEMP | sed -e 's/\([^ ]*\).*/\1/g'`
NAME[$COUNTER]="Mysql_`basename $DB`"
done

Tuesday, 26 February 2008

Allow Chinese characters on a Client-Server application

I recently had to provide a working solution for Traditional Chinese for Hongkong.

It involved both ODBC on the Linux server to read correct data from a Progress database, and process that data in .net on Mono, but also on the client side to be able to read data through ODBC.

Here is the solution and also some warnings about what can go wrong:

For Mono, you need to have installed the RPM package mono-locale-extras, which installs the dll I18N.CJK.dll (CJK stands for Chinese Japanese Korean).

Make sure the Progress database is in codepage big-5.
proutil mydb -C convchar convert undefined -G 15
proutil mydb -C convchar convert big-5 -G 15
_progres -pf batch.pf -1 -b -rx -p upgrade.p -param $DLC/prolang/tch/big-5/_tran.df | cat
proutil mydb -C idxbuild all

Make sure that your pf files (or even the Progress startup.pf) contain these lines:
-cpinternal big-5
-cpstream big-5
-cprcodein undefined

For the Progress server, you need to set this variable before the server is started (note: if you have both sql and 4gl server, the first one needs all settings already):
export SQL_CLIENT_CHARSET=BIG-5

Mono would rather expect BIG5 (without the dash), so we need to set another variable so that the default encoding is correct.
Before you start the server in the Mono environment, make sure that you export this variable:
export LANG=zh_TW.big5

The following command shows what languages are available on your Linux:
locale -a
Unfortunately there is no big5 for Hongkong, and zh_HK.big5hkscs does not seem to work for me. zh_TW.big5 works fine.

This code converts the data from the codepage coming through ODBC from the Progress database into Unicode:

FDBEncoding := System.Text.Encoding.Default;
try
sqlClientCodePage := Convert.ToInt32(System.Environment.GetEnvironmentVariable('SQL_CLIENT_CHARSET'));
FDBEncoding := System.Text.Encoding.GetEncoding(sqlClientCodePage);
except on exp: Exception do
end;

function ConvertToUnicode(s: System.String): System.String;
var
bytes: array of byte;
begin
bytes := Encoding.Default.GetBytes(s);
result := FDBEncoding.GetChars(bytes);
end;

function ConvertFromUnicode(s: System.String): System.String;
var
bytes: array of byte;
begin
bytes := FDBEncoding.GetBytes(s);
result := Encoding.Default.GetChars(bytes);
end;

For the client to be able to access through ODBC, we also need to set the environment variable in Windows XP SQL_CLIENT_CHARSET=BIG-5
(Start/Settings/Control Panel/System/Advanced/Environment Variables/System or User Variables)

Sunday, 17 February 2008

What kind of relationship can we have with God

Some christians seem to talk a lot about their faith as a "Face to Face" relationship with God.

I have a problem with those words, because it sounds to me much like a relationship of two equal people who have a good understanding of each other.

The bible mentions the phrase in these places (God and human being face to face):

  • 1Mo (Gen) 32,30 It is because I saw God face to face, and yet my life was spared.
    • Jacob has fought with God before meeting Esau
  • 2Mo (Ex) 33,11 The LORD would speak to Moses face to face, as a man speaks with his friend.
  • 5Mo (Deut) 34,10 Since then, no prophet has risen in Israel like Moses, whom the LORD knew face to face,
    • This was quite a unique relationship in the bible
  • 5Mo (Deut) 5,4+5 The LORD spoke to you face to face out of the fire on the mountain. (At that time I stood between the LORD and you to declare to you the word of the LORD, because you were afraid of the fire and did not go up the mountain.)
    • The whole people of Israel met God, but it could not be continued, so Moses went alone
  • Job 38, 3+4 Brace yourself like a man; I will question you, and you shall answer me. Where were you when I laid the earth's foundation? Tell me, if you understand.
    • Job cannot answer God
  • 1Cor 13,12 Now we see but a poor reflection as in a mirror; then we shall see face to face. Now I know in part; then I shall know fully, even as I am fully known.
    • This is a promise for the future

Now things look a bit different when we consider that Jesus became a man and so represented God to us in a way we can grasp a little.

  • John 14, 9: Anyone who has seen me has seen the Father.

But again, he does not have long discussions, but invites the disciples: Come and see! Follow me! I think there is the danger of just wanting to experience God but not being willing to follow and obey him.

  • John 1, 39: Come, he replied, and you will see. So they went and saw where he was staying, and spent that day with him.
  • Matthew 4, 19: Come, follow me, Jesus said, and I will make you fishers of men.

We don't need to be afraid of Jesus: He is compassionate and approachable

  • e.g. Luke 8, 47: Then the woman, seeing that she could not go unnoticed, came trembling and fell at his feet. [...] Daughter, your faith has healed you. Go in peace.

Jesus enjoyed blessing the children; perhaps that is how I would also describe my relationship with Jesus? I can sit on His lap, I can tell him about my little and big worries, and he will understand. When he starts talking about the things that worry him or he is busy with, I will sit there with big eyes and won't understand much, perhaps with growing maturity get more and more a better idea what is really important.

  • Luke 18, 16: But Jesus called the children to him and said, Let the little children come to me, and do not hinder them, for the kingdom of God belongs to such as these.

We can enter God's presence, and need to be intimate with him. But he will still surpass our understanding

  • Phil 6,7: Do not be anxious about anything, but in everything, by prayer and petition, with thanksgiving, present your requests to God. And the peace of God, which transcends all understanding, will guard your hearts and your minds in Christ Jesus.

My (personal) conclusion:

  • When I follow Jesus, I will see the back of Him. My eyes need to be focused on Jesus' back. I don't want to stand still and face Him, because then I am going in the wrong direction.
  • I know I need times when I sit on His lap and listen to Him and tell Him my joys and worries.
  • I am looking forward to the day when I will see God face to face, and I will understand it all and know Him completely.

Sunday, 10 February 2008

My first little ASP.net project using the Mono XSP server

I wanted to provide an online version for the project Delphi2C#, so that people can just paste their Pascal code on the website, and see how good the converter is for them when it displays the C# version of their code.

On Debian, you need to install:
apt-get install mono-xsp asp.net-examples
This will give you a file
/etc/xsp/debian.webapp
It already contains the configuration for the samples, that live in
/usr/share/asp.net-demos
To start the xsp server, you just run
/etc/init.d/mono-xsp start
And you will be able to access the samples at
http://YOURSERVER:8081/samples
For example to add your own aspx file, copy it to
/usr/share/asp.net-demos/DelphiNet2CSharp.aspx
The source code of that file you can see here:
Browse CVS of Delphi2C#

If you have a dll as well, copy that to
/usr/share/asp.net-demos/bin/Delphi2CSharp.dll
In your aspx file, you need to write at the top to use that dll:
<%@ Import Namespace="Delphi2CSharp" %>
To debug your application (e.g. I had compiled the DLL for .Net 2.0, but the xsp only supported 1.1 and crashed without any message to the browser):
cd /usr/share/asp.net-demos
MONO_OPTIONS=--debug && xsp --verbose
Then in the webbrowser go to
http://YOURSERVER:8080/DelphiNet2CSharp.aspx 
You will see all the Console.WriteLine output, and also any exceptions and Mono crash messages.

Monday, 19 November 2007

Config files in RPM files

see this very helpful description of RPM, %config, and (noreplace) by Jon Warbrick

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

January 2004
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

http://msdn.microsoft.com/visualc/vctoolkit2003/

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.