2006年12月18日

SQL Server 中文乱码问题

使用 SQL Server 的查询分析器和企业管理器显示远程数据库表时出现乱码,但将表用复制工具复制到本地后,显示却正常!

刚开始以为是 ntwdblib.dll 的版本问题,因为原来用 py-mssql 时发现 pymssql-0.7.4.win32-py2.4.exe ,
自带的 ntwdblib.dll 版本 (2000.80.2039.0)insert 中文到表时,会是乱码。
把它改成旧的版本(2000.2.8.0)就好了。
新的py-mssql(pymssql-0.8.0.win32-py2.4.exe)使用(2000.80.2187.0)版本的ntwdblib.dll,没有乱码问题。

于是我就试着替换使用3个版本的 ntwdblib.dll 来解决乱码问题,但是不能解决!
(我装的SQL server 2000 Personal Edition,打SP4补丁,ntwdblib.dll 版本为 2000.80.2039.0。)
(远程的SQL server 2000 Enterprise Edition,打的SP4补丁,ntwdblib.dll 版本同为 2000.80.2039.0。)

最终发现去掉 企业管理器->工具->选项->高级->“执行字符数据的转换” 和
查询分析器->工具->选项->连接->“执行字符数据的转换”
问题就解决了!

网上查了很久,说是字符转换的问题(比如配置ODBC时,不选字符集自动转换),但很长时间都没找到不用ODBC时是在哪里调!

PostGreSQL里可在数据库里设置存储字符为Unicode,而在客户端某个字符集,如GBK时,
只要在连接后执行 Set Client_Encoding = ‘GBK’ (应该没写错吧)就可以了!

2006年10月07日

发现通过SSH通道使用FTP似乎比使用UDP还FTP麻烦,
网上很多自称FTP应用与VNC或POP等类似的大拿
大多只考虑到FTP的控制通道(Port 21),没考虑到数据通道。

PuTTY提供隧道功能的同时,它的说明文档,也谈到
鉴于FTP协议的复杂性、各FTP软件在分配数据通道端口规则的不统一性,
PuTTY不想把自己搞得那么复杂去动态跟踪FTP应用层协议,
来获取端口号。

如此,透过SSH使用FTP还真有点麻烦。
FileZilla和FileZilla Server似乎能指定被动模式时双方各自使用的端口范围,
但我实际试了下,FTP连接总能成功,但列举目录时有时会报错,
说创建Socket失败。

FTP主动模式和被动模式好久没想它了,又忘了,从网上抄了一段,先记在这:

被动模式下数据通道的建立:
客户端向服务器发送PASV命令。
服务器收到命令后动态地打开一个收听端口来建立数据通道,
并把自己的IP地址、收听的端口号通过控制通道发送给客户端。
客户端收到后就指派一个本地端口连接到服务器的收听端口。
数据通道就这样被建立起来了。

主动模式下数据通道的建立:
客户端打开一个收听端口来建立数据通道,
并把自己的IP地址、收听的端口号通过控制通道发送给服务端。
服务端收到后就指派一个本地端口连接到客户端的收听端口。
数据通道就这样被建立起来了。

总之,被动模式下服务端只被动接受连接,客户端只主动发出连接。
主动模式下双方既被动接受连接也主动发出连接。

下面的VNC连接和反向VNC连接都只要求一端有公网IP并安装了OpenSSH。

2006年09月16日

#include <windows.h>
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{ while(1)
  { WinExec("wget -q -O- –http-user=username –http-passwd=password http://www.3322.org/dyndns/update?system=dyndns&hostname=domainname.3322.org", SW_HIDE);
    Sleep(300000);
  }
}

记下了配置OpenSSH for Windows为密钥认证的过程,备忘
———————————————————-
1. 创建一个Windows用户ssh专用来SSH远程登陆。
可以在本地安全策略中设置禁止ssh本地登陆,不过这样以来单机调试就不方便了。
———————————————————-
2. 生成用户信息。这里是生成了所有用户的信息,当然只指定用户ssh也行
.\bin\mkgroup  -l >> .\etc\group
.\bin\mkgroup  -d >> .\etc\group
.\bin\mkpasswd -l >> .\etc\passwd
.\bin\mkpasswd -d >> .\etc\passwd
———————————————————-
3. 生成用户ssh的home目录
mkdir home
cd home
mkdir ssh
cd ssh
mkdir .ssh
———————————————————-
4. 修改cygwin环境默认的home目录
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\/home]
"native"="C:\\Program Files\\OpenSSH\\home"
"flags"=dword:0000000a
———————————————————-
5. 生成密钥
cd bin
mkdir keys
ssh-keygen -t rsa -b 2048 -f keys\rsa2048 -C "This is passphrase hint" -N "This is passphrase"
mkdir keys\.ssh
cat rsa2048.pub > keys\.ssh\authorized_keys
———————————————————-
6. 将上面生成私转为SSH客户端可使用格式,这里用PuTTY,可用PuTTYgen转为PuTTY用的PPK格式
———————————————————-
7. 将OpenSSH设置为只接受密钥认证。
这里额外开了sftp服务。另外,StrictModes no选项将告诉OpenSSH不检查用户ssh的home目录的权限设置
Protocol 2
Port 22
HostKey /etc/ssh_host_rsa_key
PermitRootLogin no
PermitEmptyPasswords no
StrictModes no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#IgnoreUserKnownHosts yes
PasswordAuthentication no
UsePAM no
UsePrivilegeSeparation no
MaxStartups 10:30:60
Subsystem sftp /usr/sbin/sftp-server
———————————————————-
8. 设置路由器NAT和软件防火墙
NAT设置了映射22号端口的TCP包。
软件防火墙设置允许C:\Program Files\OpenSSH\usr\sbin\sshd.exe侦听TCP port 22。
———————————————————-
9. 基本上差不多了,要启用或停止OpenSSH服务可
net start opensshd
net stop opensshd
在services.msc里启用或停止也可
———————————————————-
10. PuTTY作中端还不错,就是中文不好办。
要sftp的话,用WinSCP和FileZilla都行。
WinSCP和FileZilla看及进入中文目录名/文件名都没问题,但拷贝等操作报服务端找不到文件错误,
也许和OpenSSH for Windows带的sftp-server.exe版本低了有关吧(3.x的样子)
注意cygwin环境下将Windows各磁盘映射为/cygdrive/。

2006年09月06日

有三台电脑,暂称作A,B,C
IP分别是192.168.111.10,192.168.111.11,192.168.111.12,DNS是192.168.111.254
其中A,B是域Z中,平时电脑登陆为域用户user.Z
现在的问题是:B传文件给A,可以通过网上邻居,那C传文件给A呢?

目前解决办法:

1. 在A中登陆本地Administrator,创建用户如ssh,设置密码(不能为空)
2. 在A中安装OpenSSH for Windows,安装时选作为系统服务,开机自动启动,
(可以通过 net start opensshd 和 net stop opensshd 启动/停止服务)
并如quickstart.txt所示,进行配置:
(暂未特别考虑安全而使用通过公私钥加密)
@echo Maybe you should rm .\etc\group and .\etc\passwd by hand first
@pause
.\bin\mkgroup -l >> .\etc\group
@rem .\bin\mkgroup -d >> .\etc\group
.\bin\mkpasswd -l -u ssh >> .\etc\passwd
@rem .\bin\mkpasswd -d >> .\etc\passwd
3. 在B中安装WinSCP,就可以以ssh登陆A了!
OpenSSH for Windows是构筑在CygWin基础上的,用WinSCP访问时的根目录是
OpenSSH的安装目录,要访问Windows的其它目录,设置WinSCP登陆目录为/cygdrive/即可。
/cygdrive/下即是Windows的各盘符。

当然,B机器可以同C机器一样设置来登陆A机器

2006年08月06日

1。安装python module:Sybase

===============================

网上搜到Python DB-API 2.0规范的Sybase数据库访问接口,于是在Windows XP下下载之 名曰sybase-0.37.tar.tar,python setup.py install 之…

结果报找不到Sybase环境变量,看来真像说明文档里讲的,需要Sybase Client Library。Windows下 Sybase Client Library不是Free的,找了半天也没见着,干脆迅雷下载 sybase ase (ase1500_de_win.zip,400多M,大呀!),安装之(D:\Sybase\)。再python setup.py install 之…

结果发现需要Visual Studio 7.1,也就是Visual Studio .net 2003,没办法,迅雷下载 visualstydio2003net.exe(600多M!)并安装之。再python setup.py install…

结果报找不到libblk.lib等,这个大概就是依赖的Sybase Client Library吧。在D:\sybase\OCS-15_0\lib\下找到了libsyblk.lib等5个lib,把他们改名拷到setup.py目录下,再python setup.py install…

OK!终于安装上Sybase module了
实际上这样编译需要D:\sybase\OCS-15_0\目录下的include、lib和dll,编译后生成sybasect.pyd和Sybase.py,即是Sybase module,不过要移植到其它机器上的话,除了这两个文件,还需要dll目录下的那些dll,总共不到3M

2。启动 Sybase ase

====================================

Sybase ase 安装后,注册了2个手动启动服务,一个叫Sybase Unified Agent,一个叫Sybase SQLServer _ JJY,这后面一个的JJY是安装的时候创建了一个Server。启动这两个服务…

运行Sybase central,connect JJY,创建一个新数据库mydb,创建一个新表table1,创建两个字段,一个叫price,float型,一个叫name,text型,sybase central可以关了

3。示例脚本

====================================

# -*- coding: cp936 -*-
import Sybase
db = Sybase.connect(‘JJY’, ’sa’, ”, ‘mydb’)
c = db.cursor()
c.execute(‘insert table1 (price,name) values(30.0, "haha")’)
c.execute(‘insert table1 (price,name) values(30.0, "哈哈")’)
db.commit()
c.execute(’select * from table1 where price > @price’, {‘@price’:20.0})
rs = c.fetchall()
for r in rs:
    for col in r:
        print col,
    print
c.close()
db.close()

运行之,结果报错!

The context allocation routine failed when it tried to load localization files!!
One or more following problems may caused the failure

Your sybase home directory is D:\sybase. Check the environment variable SYBASE if
 it is not the one you want!
Using locale name "zh_CN" defined in environment variable LANG
Locale name "zh_CN" doesn’t exist in your D:\sybase\locales\locales.dat file
Traceback (most recent call last):
  File "C:\Documents and Settings\new\桌面\sybase-0.37\eg.py", line 2, in ?
    import Sybase
  File "c:\python24\Lib\site-packages\Sybase.py", line 282, in ?
    raise InternalError(‘cs_ctx_alloc failed’)
Sybase.InternalError: cs_ctx_alloc failed

还在脚本所在目录生成一个sybinit.err文件,内容如下:

The context allocation routine failed when it tried to load localization files!!
One or more following problems may caused the failure

Your sybase home directory is D:\sybase. Check the environment variable SYBASE if it is not the one you want!
Using locale name "zh_CN" defined in environment variable LANG
Locale name "zh_CN" doesn’t exist in your D:\sybase\locales\locales.dat file

看样子是sybase设置有问题,我的LANG变量为zh_CN,sybase像是不支持,google了下,最终这样解决:

在D:\sybase\locales\locales.dat文件的[NT]节里添加了一行(下面的最后一行)

[NT]
locale = enu, us_english, iso_1
locale = fra, french, iso_1
locale = deu, german, iso_1
locale = rus, russian, cp1251
locale = hun, us_english, cp1250
locale = ell, us_english, cp1253
locale = heb, us_english, cp1255
locale = ara, us_english, cp1256
locale = trk, us_english, cp1254
locale = esp, spanish, iso_1
locale = jpn, japanese, sjis
locale = japanese, japanese, sjis
locale = chs, chinese, eucgb
locale = cht, tchinese, big5
locale = kor, korean, cp949
locale = us_english.utf8, us_english, utf8
locale = default, us_english, iso_1
locale = zh_CN, us_english, iso_1

现在运行脚本没问题了!

30.0 但是
30.0 但是
30.0 haha
30.0 haha
30.0 haha
30.0 haha
30.0 haha
30.0 haha

4。Unicode问题

====================================

Unicode总是个麻烦问题,像wxPython动不动就生成一个Unicode串。SQL语句里有Unicode对象时,会报类型错,目前只好如下解决:

if type(s)   == types.UnicodeType: s = s.encode(‘cp936′)

5。FreeBSD下访问这个装了Sybase ase的机器

====================================

FreeBSD下有py-sybase这个port,小巧,make install clean就行了

(不过再这之前我安了FreeTDS port,不知先安了这家伙对后面的py-sybase有无影响)

FreeBSD下脚本运行没问题!如下:

# -*- coding: cp936 -*-
import Sybase
db = Sybase.connect(‘192.168.0.101:5000′, ’sa’, ”, ‘mydb’) # FreeBSD在192.168.1.102上,192.168.1.101是Windows机器,5000是安装JJY server是选的端口
c = db.cursor()
c.execute(‘insert table1 (price,name) values(30.0, "haha")’)
db.commit()
c.execute(’select * from table1 where price > @price’, {‘@price’:20.0})
rs = c.fetchall()
for r in rs:
    for col in r:
        print col,
    print
c.close()
db.close()

要说明的是,我的FreeBSD的LANG是在zh_CN.eucCN

2006年08月03日

FreeBSD里混音需要设置  因为默认虚拟声道数为0  这样同时刻只能有一个程序能使用音频设备
如打开xmms放歌后再用mplyer 会提示 device busy

设置方法handbook里有
如设置虚拟声道数为4:
sysctl hw.snd.pcm0.vchans=4
sysctl hw.snd.maxautovchans=4

要持续生效,可写到 /etc/sysctl.conf:
hw.snd.pcm0.vchans=4
hw.snd.maxautovchans=4

2006年07月30日

珍惜生命 远离编译内核
珍惜生命 远离美化桌面
珍惜生命 远离Linux
珍惜生命 远离FVWM
珍惜生命 远离Emacs
珍惜生命 远离游戏
珍惜生命 远离论坛
珍惜生命 远离网络
珍惜生命 远离电脑
珍惜生命 远离烟酒
珍惜生命 远离浮躁

有人在到处的吹
有人在无休的骂
有人在静静的看
有人在默默的干
 

何去何从 浮躁的一代

2006年07月28日

fvwm.png