mod_mono_server init script

為了要讓 mod_mono_server 能在開機時自動啟動,就得自行撰寫 script.
自己嘗試了幾次,總是不如己意.大概是自己的 bash script 功力不到家吧~
只能利用 Google 大神去搜尋別人的成果.
很幸運,已經有人寫出來了.有好幾種版本:
1. mono-server.init, 這個 script 相當不錯,已經可以讓你在配置檔(/etc/xsp/mono-xsp-hosts.conf)裡面設定 host 了.同時也已經收錄,作為 Debian 官方 xsp 套件的一部分.
2. local-xsp, 這個 script 也是 for Debian 的,但沒辦法設定 host.
3. mod_mono, 我是在這兒找到的,這個可以在 fedora/red hat 裡面用,沒問題.
我最後是用了 3 的 solution,並加上了一些修改,不過你應該看的出來,更動並不大就是了 🙂

#!/bin/sh
#
# chkconfig: 2345 99 01
# description: Provides ASP.NET functionality for Apache
# mod_mono Start the mod_mono-server
#
NAME=aspnet
MONOPIDFILE=/var/run/aspnet.pid
export MONO_PATH=/usr/lib/mono/1.0/
start_mod_mono() {
tmp=`ps ax | grep -m 1 “/usr/bin/mono”`
tmp=`echo $tmp | grep “/usr/bin/mod-mono-server.exe” | awk ‘{print $1}’`
if [ $tmp ]; then
echo -n “$NAME already started”
else
echo “Starting server $NAME”
#/usr/bin/mono /usr/bin/mod-mono-server.exe –root /usr/local/share/doc/xsp/test/ –applications /mono:. –nonstop &
#/usr/bin/mono /usr/bin/mod-mono-server.exe –root /var/www/html/mono/ –applications /mono:. –nonstop &
/usr/bin/mono /usr/bin/mod-mono-server.exe –root /usr/share/doc/xsp-0.9/xsp/test –applications /mono:. –nonstop &
sleep 3
chmod 666 /tmp/mod_mono_server
fi
}
stop_mod_mono() {
# (MO): Asking for an existing process for the mod-mono-server
# (MO): Abfragen, ob es eine Prozeß für mod-mono-server schon gibt.
tmp=`ps ax | grep -m 1 “/usr/bin/mono”`
tmp=`echo $tmp | grep “/usr/bin/mod-mono-server.exe” | awk ‘{print $1}’`
if [ $tmp ]; then
echo -n “Stopping mod_mono”
tmp=`ps ax | grep “/usr/bin/mono” | grep “/usr/bin/mod-mono-server.exe” | awk ‘{print $1}’`
kill -9 $tmp
else
echo -n “$NAME is not started”
fi
}
case “$1” in
start)
start_mod_mono
;;
stop)
stop_mod_mono
echo
;;
restart)
echo “Restarting $NAME”
stop_mod_mono
echo
sleep 1
start_mod_mono
;;
status)
tmp=`ps ax | grep -m 1 “/usr/bin/mono”`
tmp=`echo $tmp | grep “/usr/bin/mod-mono-server.exe” | awk ‘{print $1}’`
if [ $tmp ]; then
echo “$NAME is running”;
else
echo “$NAME is not runnung”;
fi
;;
*)
echo “Usage: /etc/init.d/$NAME {start|stop|restart|status}”
exit 1
;;
esac
if [ $? -eq 0 ]; then
#echo
exit 0
else
echo ” failed”
exit 1
fi

cannot handle TLS data

最近更新了 dag 的 mono RPM 以後,mono 只會說

mono: error while loading shared libraries: libmono.so.0: cannot handle TLS data

令人無奈…去抓官方網站 的 RPM for rh9(因為我用的是WBEL,不能用 Fedore Core 3 的 rpm)之後,也無法使用…
在網路上搜尋了一下,其實所謂的 TLS 有兩種: Transport Layer Security, 或是 Thread-Local Storage. 一開始我被搞混了,我以為是 Transport Layer Security, 所以我更新了 openssl 等等相關的 library, 但是卻於事無補.
後來又多花了一天在找這問題,終於,我才發現是 Thread-Local Storage 搞的.可惡,我心裡想,這個我不搞清楚,那我這兩三年的 Linux 經驗豈不是白混的??又繼續找,看到底是缺了什麼 library,才會這樣…今天我終於找到解答,原因是因為我的 glibc 是 i386 arch 的,並沒包含 tls 的部分,所以必須要更新到 i586/i686 才可以.
對,我承認我膽小,所以我不敢強制把我的 glibc 升到 i586 (我的 linux 是架設在 AMD 350 上…,所以是 i586),於是我退而求其次,我重新下載 DAG 網站上的 mono.spec, 把 revision 改為 2, 重新包裝 source rpm, 然後再編譯一次.這次,當然就可以安裝了~~
嗚嗚嗚~~真是花了我不少功夫啊….
註:
Thread-Local Storage
http://linux.web.cern.ch/linux/scientific3/docs/rhel-gcc-en-3/thread-local.html

NAnt 與 mono

既然已經可以使用 mono 了,於是我也想在 mono 下使用 NAnt
幸運的是,NAnt 已經支援 mono 了。所以只要下載解開以後,執行 make 即可。如果你的 mono 是 1.0.6 而你用的 NAnt 又是最新版的 0.85-rc2,那麼我相信你應該會遇到問題。這個時候你應該到 mono 官方網站 下載 unstable 的 1.1.4,雖說是 unstable,但依據網站上的說明,其實這一版已經相當穩定也整合了更多的東西進來。
下載並安裝之後,應該就可以編譯 NAnt 了。
如果你想用 NAnt 的 rpm 來安裝,也是可以,請先到這裡下載 nant.spec,然後打開 nant.spec,將這幾行刪掉:

Patch0: %{name}-xml_syntax.patch
Patch1: %{name}-PlatformID.patch
%patch0 -p1
%patch1 -p1

因為在最新的 NAnt 的 source 已經 patch 了。
接著把 nant 的 tarball 放到 /usr/src/redhat/SOURCES/,執行

#rpmbuild -bs nant.spec
#rpmbuild –rebuild /usr/src/redhat/SRPMS/nant-0.85-0.rc2.1.src.rpm

就可以在 /usr/src/redhat/RPMS/i386 下找到剛 build 完的 nant rpm 了。

Simple page on mono xsp

試了一個下午,終於弄出來.
首先我們得釐清幾件事情:
1.ByteFX 該如何使用?
2.從 mono 的範例看來,code是可以與page寫在一起,沒問題。但是 Codebehind 呢?
ByteFX 基本上與其他的 DataProvider 用法相同,只是 Prefix 改為 MySql,而 ConnectString 基本上只有四個重要的 attribute:
1.Data Source:指的就是機器名稱,一般使用 localhost。
2.Database:資料庫名稱。
3.User ID:使用者帳戶。
4.Password:密碼。

using ByteFX.Data.MySqlClient;
//…
MySqlConnection cn;
MySqlCommand cmd;
MySqlDataReader dr;
string myConnectionString=”Database=test;Data Source=localhost;uid=root;pwd=;”;
cn=new MySqlConnection( myConnectionString );
cmd=cn.CreateCommand();
cmd.CommandType=CommandType.Text;
cmd.CommandText=”select * from table1″;
cn.Open();
dr=cmd.ExecuteReader();
// do anything you want.

Codebehind 的用法基本上也與 Windows 上的 asp.net 相同,沒什麼大問題。在這邊花了比較多的時間,原因是因為太久沒用,而且沒有 IDE,只能手動比對以前的 asp.net 程式碼,才對出來。你的頁面最前面必須要有

<%@ Page language=”C#” debug=”true” Codebehind=”your_page.aspx.cs” AutoEventWireup=”false” Inherits=”your_page_class” %>

而你的 your_page.aspx.cs 則應該要有一個 class,叫作 your_page_class,並且繼承 System.Web.UI.Page。
p.s your_page.aspx.cs / your_page_class 這兩個名稱請依自己的需求做替換。
另外有碰到無法編譯,出現 System.Design.dll 找不到錯誤的問題,這是因為沒有安裝 mono-winforms 的緣故,裝上以後就 ok 了。

asp.net 的 deploy

deploy asp.net program 的時候,如果用 copy 的話,可以這樣用~

XCOPY \\CLIENT1\wwwroot\demowebsrv \\SERVER1\wwwroot\demowebsrv /E /K /R /O /H /I

快又方便.

為 DataGrid 加入 Checkbox

大致就是這樣啦,在 ItemDataBound event 加這個進去就行了~~
主要用在 asp.net 上…
[csharp]
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
CheckBox cb=new CheckBox();
if(e.Item.ItemIndex>=0)
{
if(e.Item.Cells[2].Text==”True”)
{
cb.Checked=true;
}
else
{
cb.Checked=false;
}
e.Item.Cells[2].Controls.Clear();
e.Item.Cells[2].Controls.Add(cb);
}
}
[/csharp]

MDI Form

總之作法大致就是這樣
把 Form 的 property 設一下, Menu 裡面的 Item click event 就是這麼寫…

Private Sub MenuItem3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItem3.Click
  Dim frm As Form3 = New Form3
  If check(frm) Then Return
  frm.MdiParent = Me
  frm.Show()
End Sub

Private Function CeckExist(ByVal compareFrom As Form) As Boolean
  For Each f As Form In Me.MdiChildren
    If f.GetType().Equals(compareFrom.GetType()) Then
      f.BringToFront() ‘ f.Focus() 也可以
      Return True
    End If
  Next
  Return False
End Function

Defrag API C# wrappers

http://blogs.msdn.com 發現了這篇, 想不到居然可以把磁碟重組的 API 包起來用…
這可真是有趣.
搞不好也可以搞一個自己的重組程式喔~~呵呵~~
p.s. 我以前真的不知道 Win32 API 有包括磁碟重組的部份… >_<