共 36 页, « 第一页 ... « 29 30 31 [32] 33 34 35 » ... 最后一页 »
前一阵子遇到的一个问题是,如何在Java程序中调用Windows DLL的函数。查了查资料,得知使用名为JNI(Java Native Interface)的方式可以让Java调用DLL中的函数。JNI的使用方法如下:
- 在Java中定义JNI调用,并撰写使用该JNI调用的相关代码。
- 根据定义好的JNI调用生成相应的C语言头文件。
- 利用上一步生成的头文件,使用C书写Windows平台上的代码。
- 编译C代码生成DLL库文件。
- 执行Java程序中JNI调用的代码。
自己开设的服务器,希望晚上睡觉的时候它能自动关机减少噪音,早上起床之后再自动开机提供服务。我的主板是微星815EP Pro,Award BIOS v3.3(2001/4/20)。
首先重新启动计算机,按Del键进入BIOS设置。在BIOS下找到Integrated Peripherals中的PWRON After PWR-Fail,将其设定为On。这样停电之后再次供电时电脑就可以自动开机。
然后进入Power Management Setup,选择Resume By Alarm,将其设置为Enabled。然后将下面的Date(of Month) Alarm选项设置为0,表示每天定时开机。Date(hh:mm:ss)设置为开机时间,我设置为10:0:0。设置好之后重新启动计算机,进入操作系统,然后再关机。注意主板说明书上只说明了“修改后需要重新启动计算机”,要注意的是重新启动之后必须要进入操作系统,再关机,才会按照指定的时间开机。
然后设置自动关机。比较简单,在 /etc/cron.d 下面添加一个 shutdown 文件,内容如下:
30 2 * * * root /sbin/shutdown -h now
设置每天2:30定时关机。
今天一个朋友问我,一个表有两个字段mac和ip,如何找出所有的mac相同而ip不同的记录?想了半天写出了下面的这个SQL语句。
mysql> select * from ip;
+-----+-----+
| mac | ip |
+-----+-----+
| abc | 123 |
| def | 456 |
| ghi | 245 |
| abc | 678 |
| def | 864 |
| abc | 123 |
| ghi | 245 |
+-----+-----+
7 rows in set (0.00 sec)
mysql> SELECT DISTINCT a.mac, a.ip
-> FROM ip a, ip b
-> WHERE a.mac = b.mac AND a.ip <> b.ip ORDER BY a.mac;
+-----+-----+
| mac | ip |
+-----+-----+
| abc | 678 |
| abc | 123 |
| def | 864 |
| def | 456 |
+-----+-----+
4 rows in set (0.00 sec)
本文总结了Java中很容易误解的一些知识点。
阅读全文 »
我们原有的论坛使用的是基于 ASP 的 LeadBBS,后来由于服务器出现了一些小故障,导致 RegExp 对象不能用,于是论坛的许多用到正规表达式的功能全部失效。后来考虑将论坛整个转移到 PHP 系统上。而我维护的另一个论坛使用的是 NewvBB,这个系统是基于国外最流行的 vBulletion 修改而成的,该论坛相当成熟,管理功能也十分强大,于是就准备把论坛移动到 vBulletion 系统上。
目前面临的任务是 LeadBBS -> NewvBB。到网上查了一下资料,发现有关 LeadBBS 数据转换的程序很少,可能是由于在国内动网论坛独霸天下的原因吧。最后总算找到了一个 LeadBBS->phpWind 3.0的转换程序。经过进一步的调查,我决定了转换方法:LeadBBS -> phpWind 3.0 -> Discuz! 2.5F -> NewvBB 3.0。这样做起来相当麻烦,不过似乎是唯一可行的途径了。
1. LeadBBS->phpWind 3.0
这一步基本上没有遇到任何问题,简单地安装一个 phpWind 3.0,然后利用转换程序就能够把用户和帖子数据完整地转换过来。附件不能转换,不过算了,附件本来就不多,以后再慢慢手动修复吧。
转换后使用安装 phpWind 时设置的管理员密码进入 phpWind 的管理员界面,重新建立缓存。
2. phpWind 3.0->Discuz! 2.5F
这一步稍稍遇到一点困难。Discuz官方主页上找到的转换程序是 phpWind 2.0.1->Discuz! 2.5F的,直接利用该程序转换时,转换到第5步出现错误,说在 pw_tmsgs表中找不到用于 order by 语句的 id 列。查了一下数据库结构,发现 pw_tmsgs 中的字段名为 tid 而不是 id,于是修改转换程序的 340 行的列名为 tid ,于是转换成功。
转换成功之后试图登录管理面板结果失败了。查明原因,升级之后 Discuz! 原有的管理员的用户组id变成了普通用户,于是直接修改 cdb_members 表中 Admin 行的 adminid 和 groupid 列为管理员的相应值。管理员的用户组 id 可以在 cdb_admingroups 和 cdb_usergroups 表中找到。
修改之后即可成功登录管理员界面,重新建立缓存。
如果错误登录次数过多而导致被系统禁止登录,可以清除 cdb_failedlogins 表中的内容。
3. Discuz! 2.5F -> NewvBB 3.0
这一步也比较容易,直接利用留爱论坛上提供的转换程序即可成功转换。转换之后也同样遇到 admin 用户组变成普通用户的问题,修改 user 表中的 usergroupid 列即可。最后进入管理面板,更新缓存。
昨天编译完binutils就一点多了,……困啊。今天继续。
首先需要把环境变量重新设置一下(因为昨天关机了):
$ export TARGET=powerpc-kurobox-linux-gnu $ export PREFIX=/home/charlee/cross/tools
然后我们准备开始编译gcc的第一遍。编译之前首先要准备好两个东西,一个是C语言库的头文件,一个是内核源码的头文件。昨天我们已经解压了glibc和kernel,现在只需要把这些头文件复制到目标目录下面就可以了。
$ cp -a glibc-2.3.5/include/ $PREFIX/$TARGET $ cp -a linux-2.6.11.11/include/linux/ $PREFIX/$TARGET/include $ cp -a linux-2.6.11.11/include/asm-ppc/ $PREFIX/$TARGET/include $ cd $PREFIX/$TARGET/include $ ln -s asm-ppc asm
之后回到工作目录 /home/charlee/cross 下,为gcc建立编译目录:
$ mkdir gcc-build-bootstrap
编译gcc:
$ cd gcc-build-bootstrap
$ ../gcc-4.0.0/configure --target=$TARGET --prefix=$PREFIX \
--without-headers --with-newlib --with-gnu-as --with-gnu-ld \
--with-local-prefix=${PREFIX}/${TARGET} --disable-shared
$ make all-gcc
结果编译时报告 pthread.h 和 unistd.h 出错。
第一天
首先确定自己的需求:Host为 i386, Linux; Target为 powerpc, Linux。本来想使用 i386/cygwin 作为host,但是觉得实在难度太大,反正我还有一台Linux主机闲置,就先做成 i386/Linux的host吧。
必不可少的自然是查找相关资料了。找来找去最后找到了这个网站:
- CrossGCC: http://www.billgatliff.com/
根据该网站的介绍,建立交叉编译环境需要四个步骤:
- 建立生成目标代码的binutils;
- 建立生成目标代码的 gcc 框架;
- 建立运行库;
- 生成最终的 gcc。
首先将必须的软件包下载。好在 binutils、gcc、glibc 都可以在 http://ftp.gnu.org/gnu/ 下找到,不算很麻烦。最新版本分别为 binutils-2.16、gcc-4.0.0、glibc-2.3.5。另外别忘了同时下载 glibc-linuxthreads。另外,编译 gcc 时需要用到内核头文件,所以顺便将最新的内核下载。最新版本为 2.6.11.11,位于 http://www.kernel.org/ 。
然后在 Host 上建立工作目录,并在其中为最后生成的交叉编译工具建立目录:
$ cd /home/charlee $ mkdir -p cross/tools
最后将下载的软件全部复制到 cross 目录中并解压缩。
$ cd /home/charlee/cross $ tar xzvf binutils-2.16.tar.gz $ tar xzvf glibc-2.3.5.tar.gz $ tar xzvf glibc-linuxthreads-2.3.5.tar.gz $ tar xjvf gcc-4.0.0.tar.bz2 $ tar xjvf linux-2.6.11.11.tar.bz2
然后设置环境变量以方便以后的工作:
$ export TARGET=powerpc-kurobox-linux-gnu $ export PREFIX=/home/charlee/cross/tools
下面开始编译 binutils。binutils的说明文件中建议不要在binutils的源码目录中进行编译,所以我们为它建立编译目录,并进行配置和编译。
$ cd /hoem/charlee/cross $ mkdir binutils-build $ cd binutils-build $ ../binutils-2.16/configure --target=$TARGET --prefix=$PREFIX $ make all install
安装结束之后,就可以在 /home/charlee/cross/tools 目录下看到开发工具了。
NULL值不等于0,也不等于空,它表示该值不定。
任何运算(加减乘除、字符串连接等)的运算数中包括NULL值时,整个表达式的值即为NULL。使用单行函数对NULL值进行处理,得到的结果也为NULL(NVL等函数除外)。
但是NULL值的布尔运算结果并不一定是NULL,例外的情况为,FALSE AND NULL 结果为FALSE,TRUE OR NULL 结果为TRUE。这是因为在AND运算时只要有一个运算数为FALSE结果即为FALSE,即使另一个运算数为NULL,结果也是一定为FALSE的。反之OR运算中,只要有一个运算数为TRUE,结果即为TRUE。
分组函数均忽略NULL值。
排序时,NULL被看作是最大的值,即正序时NULL显示在最下方,逆序时NULL显示在最上方。
处理NULL值的函数有如下几个:
- NVL(参数1, 参数2):如果参数1不为NULL,则返回参数1;如果参数1为NULL,则返回参数2
- NVL2(参数1, 参数2, 参数3):如果参数1不为NULL,则返回参数2;如果参数1为NULL,则返回参数3。该函数的返回值的类型总是与参数2相同,当参数1为NULL时,Oracle会将参数3转换成参数2的数据类型之后再返回。
- NULLIF(参数1, 参数2) :如果参数1等于参数2,则返回NULL;如果参数1不等于参数2,则返回参数1。
- COALESCE(参数1, 参数2, ..., 参数n):返回参数1到参数n中第一个不为NULL的值。
Linux 对 PCMCIA 设备提供了很好的支持。本文简单介绍了Linux下PCMCIA设备的安装方法。
阅读全文 »
是否遇到过这样的问题,划分了 10G 的一个分区,挂接到 /home 下,可是随着时间的流逝,10G 的空间开始不够用了,需要把它扩充。假设要扩充到 12G,那么唯一的方法就是建立一个 12G 的新分区,然后将原来的 10G 分区中的数据全部移动到新分区中,再修改挂接配置。这样不仅麻烦而且浪费时间。
Linux 2.4 开始支持 LVM(Logical Volume Manager,逻辑卷管理器),通过 LVM,可以动态地改变“分区”(准确地说应当称之为卷)的大小,而不必担心数据移动的问题。LVM 的原理是,首先在硬盘上创建 PV(Physical Volume: 物理卷)。PV 可以创建在一个分区上,也可以创建在整个硬盘上,它由许多的 PE(Physical Extent)组成,每个 PE 的默认值为 4MB。之后将数个 PV 合在一起组成一个 VG(Volume Group: 卷组)。最后在 VG 中创建 LV(Logical Volume: 逻辑卷),它也由许多的 LE(Logical Extent)组成,LE 的大小与 PE 相同,并与 PE 一一对应。LV 就可以像普通的分区一样挂接在任何地方了。
阅读全文 »