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.