php得到用户浏览器类型(UA)

2008年4月26日 评论已被关闭 726 views

使用php判断用户访问的浏览器类别
判断如果得不到浏览器类型或者得到的浏览器类型为手机类型的话,页面跳转到手机可以访问的wap站点。

//add redirect to wap
$browser = $_SERVER[‘HTTP_USER_AGENT’];

if(empty($browser)||$browser==””||strpos(strtolower($browser),”mot”)||strpos(strtolower($browser),”norkia”)||strpos(strtolower($browser),”sonyericsson”)){
header(“location:http://2hei.net”);
}

if(strpos(strtolower($browser),”msie”)||strpos(strtolower($browser),”opera”)||strpos(strtolower($browser),”firefox”)){
  echo “www-access”;
  echo strlen($browser);
}

注意:使用header进行页面跳转时,前面不要有任何输出。

获得其他访问用户信息。

“HTTP_USER_AGENT”
“REMOTE_ADDR”
“REMOTE_PORT”

分类: php 标签: ,

mantis安装与使用

2008年4月23日 评论已被关闭 912 views

mantis是不错的Bug反馈系统,值得体验。

http://www.mantisbt.org/ 下载最新版本:mantis-1.1.1

http://www.mantisbt.org/manual/ 使用帮助

前提:apache+php4.4以上+mysql已经配置正确

cp config_inc.php.sample config_inc.php

vi config_inc.php
        # — database variables ———

        # set these values to match your setup
        $g_hostname      = “localhost”;
        $g_db_username   = “root”;
        $g_db_password   = “123456”;
        $g_database_name = “bugtracker”;
        $g_db_type       = “mysql”;

        $g_default_language = “chinese_simplified”;

        # — email variables ————-
        $g_administrator_email  = ‘bugtracker@yourdomain.com’;
        $g_webmaster_email      = ‘bugtracker@yourdomain.com’;

        # the “From: ” field in emails
        $g_from_email           = ‘noreply@yourdomain.com’;

        #——— own email —-
        $g_smtp_host = ‘mail.yourdomain.com’; # SMTP 服务器
        $g_smtp_username = ‘bugtracker’; # 邮箱登录用户名
        $g_smtp_password = ‘123456’; # 邮箱登录密码
        $g_use_phpMailer = ON; # 使用 PHPMailer 发送邮件
        $g_phpMailer_path =’.\core\phpmailer’; # PHPMailer 的存放路径
        $g_phpMailer_method = 2; # PHPMailer 以 SMTP 方式发送 Email

#       $g_path = “http://172.16.0.252/bugtest“;
#       $g_icon_path = $g_path.”images/”;
#       $g_absolute_path = “/home/mantis-1.1.1/”;
        $g_use_iis = OFF;       #我用的是linux
        $g_show_version = ON;

        # the return address for bounced mail
        $g_return_path_email    = ‘bugtracker@yourdomain.com’;
 $g_allow_file_upload    = ON;

 

apache的配置:

vi httpd.conf

Alias /bugtest “/home/mantis-1.1.1”

<Directory “/home/mantis-1.1.1”>
  Options Indexes MultiViews Includes FollowSymLinks +ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

http://172.16.0.252/bugtest/admin/install.php

after install , you can delete the admin’s dir

mantis_2.jpg

 

 

 

mantis_1.jpg

 

 

 

 

 

 

 

 

 

 

 

 

the most interesting thing is you can register in mantis and recieve a comfirm mail!

 

分类: OpenSource 标签:

date_default_timezone_set

2008年4月17日 评论已被关闭 928 views

找了一下企业网站的php程序,开源的很少,让我满意的就更少了。

找来找去,找到了深喉咙http://www.deepthroat.com.cn

网上宣传的确实不错,而且有个Deepthroat [Version 2.3 ] Php版本(开源版本) 。
果然是傻瓜式安装啊,都给打成了集成包。不过我的系统都是Linux的,所以还是手工安装了一下。
感觉开源的版本的模板少的可怜,好看的模板都是商业版本的。

安装了一下商用版本,提示让我导入授权文件,汗!既然收费了,那就不用了。

不过安装商用版3.5时,也是颇费周折,遇到了 date_default_timezone_set()的问题。

打开index.php,提示

Fatal error: Call to undefined function: date_default_timezone_set() in /home/www/deep/index.php on line 5

Google了一下,原来是我的php版本的问题,原来的版本是php5.0.5,于是把php升级到5.2就可以了。

分类: OpenSource 标签:

java 调用dll文件总结

2008年4月17日 评论已被关闭 827 views

java 调用dll文件时

几个注意点:
1. package的使用
2. javah的使用
3.path路径的设定

 

下面实例介绍java调用dll中的Max函数:

hello.java

package 2hei.net.dll;

public class hello
{
    static
    {
        //System.out.println(System.getProperties().get(“java.library.path”));
        System.loadLibrary(“Hello”);
    } 
    public native static int Max(int a,int b);
   
    public static void main(String[] args)
    {
        int maxnum = 0;
        int aa = 10;
        int bb = 11;
        hello hi= new hello();
        maxnum = hi.Max(aa,bb);
        System.out.println(“max is “+maxnum);        
    }
}

生成.h头文件

createh.bat

cd E:\src\java\2hei\net\dll  

javah hello

会生成一个2hei_net_dll_hello.h的文件

编辑编辑 2hei_net_dll_hello.h  把#include <jni.h> 改成#include “jni.h”

从jdk的目录里面找到jni.h  和 jni_md.h

下面使用VC++生成dll文件。

新建一个dll工程,比如Hello  编辑Hello.cpp

// Hello.cpp : Defines the entry point for the DLL application.
//

#include “stdafx.h”
#include “Hello.h”
#include “2hei_net_dll_hello.h”

JNIEXPORT jint JNICALL 2hei_net_dll_hello_Max
  (JNIEnv *, jclass, jint a, jint b)
{
 if(a>=b)return a;
 else
 return b;
}

编译工程后,在Debug目录中找到Hello.dll文件,放到java的path目录下面。

执行hello.java 即可以得到想要的结果。

 

分类: c, java 标签: ,

使用vbs脚本写注册表来设置Ghostscript环境

2008年4月13日 评论已被关闭 736 views

 

很多与pdf相关的开源的插件(如:imagemagick ),
一般都需要ghostscript的支持,imagemagick的一些命令行的工具非常方便,但是用户往往不希望安装多个软件,
所以需要解决绿色安装的方式,通过脚本来写注册表。

具体方式如下:

首先可以先到http://www.ghostscript.com下载最新的版本。
比如gs8.61,先安装上,然后把整个安装目录复制出来。
搜索注册表,看到gs注册了两个键值,然后我们通过直接写注册表的方式来手工注册。

关键是配置gs的lib目录和字体目录。

建立vbs文件 gs_install.vbs

Set ws = WScript.CreateObject(“WScript.Shell”)

Dim ws, n, p, itemtype

p = “HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\8.61\GS_DLL”
itemtype = “REG_SZ”
n = “E:\2hei.net\gs\gs8.61\bin\gsdll32.dll”
ws.RegWrite p,n,itemtype

p = “HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\8.61\GS_LIB”
itemtype = “REG_SZ”
n = “E:\2hei.net\gs\gs8.61\lib;E:\2hei.net\gs\fonts;E:\2hei.net\gs\gs8.61\Resource;C:/WINDOW/fonts”
ws.RegWrite p,n,itemtype

ws.Run “cmd.exe /c cmd.bat”,vbhide

说明:
cmd.bat 是你想要真正执行的脚本文件,上面的则是设置依赖的gs环境。
——————————————

 

或者写reg文件

gs.reg

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SOFTWARE\GPL Ghostscript\8.61]
“GS_DLL”=”E:\\2hei.net\\gs\\gs8.61\\bin\\gsdll32.dll”;
“GS_LIB”=”E:\\2hei.net\\gs\gs8.61\\lib;E:\\t2hei.net\gs\fonts;E:\\2hei.net\\gs\\gs8.61\\Resource;C:/WINDOWS/fonts”;

说明:
Windows Registry Editor Version 5.00
// – 注释 (空一行)
[路径] (注意用大小写);
“键名”=”键值” (针对字符串型键值);
“键名”=hex:键值 (针对二进制型键值);
“键名”=dword:键值 (针对DWORD键值);

分类: OpenSource 标签: ,

study English everyday(5)

2008年4月9日 评论已被关闭 695 views

solicitor n.律师,法律顾问
on the next floor
I have been chased by a bull. chase n.追赶,追击;vt.追逐,追赶,雕镂
footpath 人行道,小路
bullock n.阉牛,一岁以下的小牛
a bright red anarak  anarak n.带帽兜的夹克
buck   n.元;雄鹿,公羊,公兔
pretty scared 恐惧的
jog 慢跑
bark at sb. bark n.树皮,吠声;v.吠,咆哮,剥树皮
The dog hit him in his leg.
Tom aged two. John is six months old.
Secretary General 秘书长
Prime Minister    总理,首相
President         总统
his short holiday
General Assembly 会员大会
scorecard  记分卡

分类: English 标签:

构造函数和析构函数

2008年4月8日 评论已被关闭 831 views

构造函数的作用是给每个对象的数据成员合适的初始值。构造函数的名字与类的名字相同,没有返回值。一个类可以有多个构造函数,通过不同的形参表进行区分。
创建一个类的对象时,编译器自动调用构造函数。
构造函数不能声明为const。当创建的类的对象为const时,调用普通的构造函数即可。const Item A = Item();
构造函数可以包含一个初始化列表。初始化列表以 “:”开始,以“,”分隔数据成员,每个数据成员后面是放在括号里的初始化式。(初始化式只在构造函数的定义中,不在声明中出现。)
Sales_item::sales_item(const string book):isbn(book),units_sold()0 {}
类通过默认构造函数初始化没有被显示初始化的成员变量。没有默认构造函数的类类型以及const或饮用类型的成员必须在构造函数初始化列表中进行初始化。
构造函数初始化列表仅指定用于初始化成员的值,并不指定初始化的顺序。成员被初始化的顺序就是声明成员的顺序。建议按照成员声明的顺序编写初始化列表。
如果类包含内置或复合类型(如指针、数组),应该定义自己的构造函数来初始化这些成员。
当构造函数声明为explicit时,可以防止在需要隐式转换的上下文中使用构造函数。
每个派生类构造函数除了初始化自己的数据成员以外,还要初始化基类成员,但是只能初始化直接基类的成员。直接基类就是在派生类列表中指定的类。
派生类执行构造函数时,先执行基类的构造函数,然后初始化派生类中的成员。
基类可以被包含在派生类的初始化列表中,从而被初始化。

析构函数用以完成资源释放。
只有删除指向动态分配对象的指针或实际对象(不是对象引用)超出作用域时,才会运行析构函数。
编译器总会合成一个析构函数。合成的析构函数按照对象创建时的逆序撤销每个非static成员。不删除指针成员所指的对象。
析构函数没有返回值,没有形参。

分类: c 标签:

resin jvm 性能调试

2008年4月7日 评论已被关闭 936 views

resin3.1.3+jdk1.6+hibernate+struts

配置了多个域名上去,服务器内存2G,jvm -Xmx使用1536m (1.5G)
每每重新上传了程序后必须要重新启动resin服务,虽然非常确定了类已经编译过去了,
但是hibernate还要重新初始化一下,只要2-3次,服务便会报outOfMemoryError错误。
不知道是java程序写的不好,资源没有释放,还是hibernate占用了太多的内存
如果没有上传新类,则没有outOfMemoryError的情况发生。

郁闷之中,恰好手边来了新的伙计,Dell 2950服务器,四核,4G内存,正好可以测试一下。

配置了一下Java的 Web服务。
我想新机器内存大,今儿个哥们高兴,给丫配个3G看看,谁知Resin居然不给面子,没有起来。
 
以下启动是加载的内存:

      <jvm-arg>-Xmx3072m</jvm-arg>
      <jvm-arg>-Xss1m</jvm-arg>
      <jvm-arg>-Xdebug</jvm-arg>
      <jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>

网上相关文档有介绍 Max Heap 为内存的70%的。

[2hei.net]# java -Xmx3072m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

[2hei.net]# java -Xmx2560m -version
java version “1.6.0_03”
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode)

经过几番测试后,感觉4G内存加载的最大内存为2560m,也就是2.5G,再大的话,resin无法启动。

分类: resin 标签: ,

study English everyday(4)

2008年4月3日 评论已被关闭 696 views

I am still feeling pretty homesick. homesick/思乡,思乡病

It’s bound of be strainge at first.     be bound of/一定的

Can I give a lift? give a lift/免费搭乘,顺风车

I have shivery/ shivery/颤抖的,寒冷的,令人心碎的,易碎的

continental breakfast/欧式早餐

Would you prefer honey, marmalade or jam?  honey/蜂蜜 marmalade/橘子或柠檬等水果制成的果酱

Both of them took off their hetmets. hetmet/头盔

a new brand brand/商标,牌子,烙印;vt,打烙印,侮辱

We are having the house decorated. decorate/装修

I wonder wheather the dentist could fit me in early tomorrow. dentist/牙医

How do you want it? Just a trim, please. trim/a.整齐的;vt.整齐,修整

What have you got in the way of brown, suede jackets,size forty? in the way of/关于…方面 suede/小山羊皮

I am spending a few months brushing up my English. brush up/擦亮,提高,复习

cosy a.舒服的,安逸的

intimate atmosphere intimate/亲密的,隐私的;vt.宣布,表示明白;n.密友

Hid it under your mattress. mattress/床垫

If you took up burglary, you’d made a fortune. burglary/入室抢劫  burglar/夜贼

 

 

 

分类: English 标签:

C++中的虚函数(学习)

2008年4月2日 评论已被关闭 731 views

虚函数实现C++中的多态(polymorphism)。只有指定为虚函数的成员才能进行动态绑定。必须通过基类的引用或指针对虚函数进行调用。
通过引用或指针调用虚函数时,编译器将生成代码,运行时确定调用哪个函数。被调用的函数时与动态类型相对应的。
虚函数编译处理的方式:
VTABLE机制。编译器发现一个类中有虚函数时,会为其创建一个虚函数表,即VTABLE。VTABLE实际上是一个函数指针的数组,每个函数占用这个数组的一个slot。一个类只有一个VTABLE。派生类有自己的VTABLE,与基类有相同的函数排列顺序。创建类实例,调用构造函数时,编译器会在每个实例的内存区中增加一个VPTR字段,该字段指向VTABLE。
虚函数的语法:virtual function();
基类中声明的虚函数在派生类中也是虚函数。

基类的析构函数必须是虚函数。
class A
{
  ~A();
}

class B
{
  ~B();
}

void foo
{
  A *a = new B;
  delete a;
}

上面的例子,delete a时,只有A::~A()被调用,B::~B()没有被调用。将A的析构函数改为virtual ~A(),上面例子中的B::~B()才被调用。
基类private 的虚函数,派生类可以访问。
一个类的虚函数在它自己的构造函数和虚函数中调用时,就变成普通函数了。

纯虚函数: virtual function() = 0;
一个函数声明为纯虚函数后,其所在的类为抽象类,不能被实例化。

分类: c 标签: