Profilo di 磊Mrgaolei的BlogFotoBlogElenchi Strumenti Guida

Blog


27 novembre

hibernate 使用数据库字段默认值的问题解决

有个表
Table servers
{integer id, string name, string ip, integer port default 10123, timestamp lastuse}
用hibernate 插入的时候,不给port赋值,想使用数据库结构的默认值10123,打死也不行,hibernate总是自己给他插入一个0。

网上搜了半天,什么not-null啊,.hbm.xml的default=""啊,还有update="false"等等,均无效

最后一高人说要:dynamic-insert="true" dynamic-update="true",也无效。

实在不行整个项目发过去,原来POJO类错了,
我的POJO类是private int port,而正确应该是private Integer port。

分析原因,int是primary type,没有null,而Integer是Object type,有null。
问题解决
19 novembre

MySQL 的计算字符串长度函数 length()

今天要将一个临时表中的某个字段field1中200个汉字以内的字段导入另外一个表,不想用PHP,想直接一句SQL语句搞定。

开始尝试
select len('hello');
select strlen('hello');
均不行
select length('hello');
输出5,成了。

于是SQL语句出来了:
insert into `table1` (field1) select field1 from `table2` where length(field1) < 400; -- 400字符代表200汉字
一句话搞定

14 novembre

DreamweaverCS4使用1小时,便发现了coding10年来最期待的功能

【代码拆分】视图
经常写一个很长的代码的时候,尤其是javascript+html 或者 css+html
经常需要先看head,写一些代码
然后滚动到下面的body内,写一些代码
滚来滚去,浪费了好多时间
用该视图,可以同时看一个文件的两个位置,编辑一处,同时同步,太爽了。
11 agosto

php通过ADO在Windows下操作Access数据库范例

<?php //读取mdb数据库例程
$conn = new com("ADODB.Connection");
$connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath("data/db.mdb");

$conn->Open($connstr);
$rs = new com("ADODB.RecordSet");
$rs->Open("select * from [table1]",$conn,1,1);
while(! $rs->eof) {
$f = $rs->Fields(1);
echo $f->value;
$rs->MoveNext();
}
?>
04 agosto

MySQL导入导出数据库直接复制data目录的可行性方案

以前假如要备份某个数据库如cms,直接复制mysql/data/cms目录,恢复时拷贝回去是不行的,要么没有cms数据库,要么只能在show tables;时候看到表,而无法访问表资源。今天在高人指点下,确定了这种备份方法的局限性。

要向使用拷贝粘贴的方法备份数据库,必须满足如下几个要求:
1,所有表均为MyISAM
2,无论是备份还是恢复时,均要停掉mysql服务
3,删除ib_logfile0,ib_logfile1等文件

这种方法适用范围:
1,简单的数据库应用。没有用到视图,存储过程触发器等高级功能
2,不要求数据库实时在线的应用或者本机开发程序
3,数据量非常大,通过sql文件导入导出困难的时候
14 maggio

网站负载承受力差又一波——网民捐款挤瘫红十字会与基金会两大网站

这说明了什么?
系统架构师对一个Web项目来说多么重要。
18 aprile

今天在rhel4下编译apache+php使其支持gd库的感想

以前一直认为是个很繁琐的过程,编译php的时候需要加一大堆的参数,弄不好就要出错。今天静下心来好好琢磨了一下,原来只要gd库安装好了,php编译的时候只需要--with-gd={GD库的路径}就可以了,无需--with-png-dir={} --with-jpeg-dir={}等等一大堆。
今天在装好gd库的前提下,只用了下面的简单命令,就装好了。
'./configure' \
'--with-apxs2=/usr/local/apache2/bin/apxs' \
'--with-mysql=/usr/include/mysql/' \
'--enable-mbstring' \
'--with-gd=/usr/lib'
08 aprile

写了一个PHP5的连接数据库类,支持分页,面向对象

<?php
class Database {
    private $host = "localhost";
    private $schema = "hgcms";
    private $username = "hgcms";
    private $password = "123456";
    private $connected = false;
    private $conn = null;

    /**
     * Database 类 构造方法
     *
     * @param string $host
     * @param string $schema
     * @param string $username
     * @param string $password
     */
    public function __construct($host = null, $schema = null, $username = null, $password = null, $autoConn = true) {
        $host        == null ? $host        = self::getHost()        : $host = $host;
        $schema        == null ? $schema    = self::getSchema()        : $schema = $schema;
        $username    == null ? $username    = self::getUsername()    : $username = $username;
        $password    == null ? $password    = self::getPassword()    : $password = $password;
        self::setHost($host);
        self::setSchema($schema);
        self::setUsername($username);
        self::setPassword($password);
        if ($autoConn) self::connect();
    }
   
    /**
     * connect()
     *
     */
    public function connect() {
        if ($this->connected) return;
        $conn = @mysql_connect(self::getHost(), self::getUsername(), self::getPassword()) or die("Error Database unavaliable!");
        self::setConn($conn);
        mysql_select_db(self::getSchema(), self::getConn()) or die("Error Select db!");
        mysql_query("set names 'GBK'");
        $this->connected = true;
    }
   
    /**
     * execute($sql) without resultset
     *
     * @param string $sql
     * @return resource
     */
    public function execute($sql) {
        #echo "<h1>" . $sql . "</h1>";
        $result = @mysql_query($sql, self::getConn()) or die("Cann't execute T-SQL : <br />\n $sql");
        return $result;
    }
   
    /**
     * executeCount($sql)
     *
     * @param string $sql
     * @return integer
     */
    public function executeCount($sql) {
        $sql = str_replace("*", "count(*) as count", $sql);
        $result = self::executeQuery($sql, 0);
        return $result[0]->count;
    }
   
    /**
     * executeQuery($sql) with resultset
     *
     * @param string $sql
     * @param integer $pageSize
     * @param integer $page
     * @return object
     */
    public function executeQuery($sql, $pageSize = 20, $page = 1) {
        $array = array();
        # 开始分页处理
        if ($pageSize != 0) {
            $recordCount = self::executeCount($sql);
            $pageCount = intval($recordCount / $pageSize);
            if ($recordCount % $pageSize) $pageCount ++;
            if (isset($page) && intval($page) > 0){
                $page = intval($page);
            } else {
                $page = 1;
            }
            if ($page > $pageCount) $page = $pageCount;
            $offset = $pageSize * ($page - 1);
            $limit = " limit $offset, $pageSize";
            $sql.= $limit;
        }
        # 分页处理结束
        $result = self::execute($sql);
        while ($rs = mysql_fetch_object($result)) {
            $array[] = $rs;
        }
        return $array;
    }
   
    /**
     * getHost()
     *
     * @return string
     */
    public function getHost() {
        return $this->host;
    }
   
    /**
     * setHost($host)
     *
     * @param string $host
     */
    public function setHost($host) {
        $this->host = $host;
    }
   
    /**
     * getSchema()
     *
     * @return string
     */
    public function getSchema() {
        return $this->schema;
    }
   
    /**
     * setSchema($schema)
     *
     * @param string $schema
     */
    public function setSchema($schema) {
        $this->schema = $schema;
    }
   
    /**
     * getUsername()
     *
     * @return string
     */
    public function getUsername() {
        return $this->username;
    }
   
    /**
     * setUsername($username);
     *
     * @param username $username
     */
    public function setUsername($username) {
        $this->username = $username;
    }
   
    /**
     * getPassword()
     *
     * @return string
     */
    public function getPassword() {
        return $this->password;
    }
   
    /**
     * setPassword($password)
     *
     * @param string $password
     */
    public function setPassword($password) {
        $this->password = $password;
    }
   
    /**
     * getConn()
     *
     * @return resource
     */
    public function getConn() {
        return $this->conn;
    }
   
    /**
     * setConn($conn)
     *
     * @param resource $conn
     */
    public function setConn($conn) {
        $this->conn = $conn;
    }
   
   
}
?>
04 marzo

My first DC - Kodak Z712 IS

昨天入手,1750带一大堆配件。
今天试拍微距两张,见相册。
07 dicembre

因祸得福,昨天晚上突然无法上网,保修之后速度飙升500KB/s

晚上挂上淘宝旺旺正在屋子里面溜达,听到室友一声不好,又上不了网了。进入无线路由管理,发现又得不到IP了,该死的中电飞华,每月总有那么几天上不了网。赶紧打电话申报故障。10-20分钟后能上了,室友又是一声,爽!我们的512K网络平时下载速度也就60左右,今天一下飙升到500KB/s,而且是稳定速度。我也赶快打开迅雷,速度保持在160KB以上,而那个室友500多的速度没有收到任何影响。看来他们重启服务器之后,忘了开限速软件了。
26 novembre

搞定了Vista和Ubuntu双启动(Vista的bootmgr引导Ubuntu的grub)

硬盘是全新的,先装了XP,然后装了Ubuntu,现在引导被grub抢了去,然后进入DOS键入fdisk /mbr,把引导全交给XP,修改boot.ini指向C盘的grub4dos,再将Ubuntu的/boot/grub/menu.lst复制到C:\,这样就做成了XP和Ubuntu双启动(ntldr引导grub4dos,然后grub4dos引导Ubuntu)以上操作没什么难度。主要是下面,Vista的bootmgr引导Ubuntu的grub。

首先进入WinPE,格式化C盘,安装Vista到C盘。重新启动之后,已经没有了Ubuntu的选项,只能进入Vista了。现在下载EasyBCD这个软件,截止到今天,最新版本是1.7.1,(http://neosmart.net/dl.php?id=1)。在Vista下安装并运行。选择“Add/Remove Entries”,在下面的“Add an Entries”面板中,选择“Linux”选项卡,Type是Grub,Name随便,Drive选择你安装Linux的/分区,再选中“GRUB isn't installed to the bootsector”复选框,最后点击“Add Entries”按钮。重启之后,便可出现Vista和Ubuntu的双启动菜单了。选择Ubuntu,进入Grub,下面的就明白了吧?

Add-Remove Entries - Linux

23 novembre

Raid给我带来的麻烦太大了,决定今天删除Raid

自从前些阵子新购置了一块跟现在一模一样的ST380811AS硬盘,用板载集成的Raid芯片组成了Raid0以后,给我带来了n多麻烦。

1,装XP以及2003系统的时候,认不到硬盘,Vista倒是不错,直接认。没办法只能用网友集成版XP了。
2,装Linux(Ubuntu)更是神奇,竟然发现了我的两块硬盘,就跟我没做Raid一样。

根据第二条现象,我有些怀疑我的板载Raid,因为真正做成了Raid,理论上从软件中是看不到硬盘的了,可是为什么Linux能发现我的两块硬盘呢?后来从网上搜集了一些资料,原来所有的主板集成Raid,都是半硬Raid,也就是说通过BIOS模拟,达到Raid效果,实际上数据的存储分割还是要通过CPU来计算,这样看来,我做Raid就亏本了。所以,决定今天晚上删除Raid,恢复两块硬盘普通模式。

分区模式初步计划为:

Disk1:C盘20G,装Vista,D盘40G,装软件游戏,E盘15G,装Apache,MySQL等工具、开发的项目以及我的文档;
Disk2:分区1,20G,挂载/;分区2,20G,挂载/home;分区3,35G,NTFS,备份,包括操作系统,安装程序等。

晚上回家就开始搞。

22 settembre

微星K9N Neo-F组阵列后Checking NVRAM慢问题已经解决

在微星大陆官方论坛发帖咨询3天没结果。
在微星台湾官方论坛发帖咨询半天得到解决办法:
将IDE通道的光驱条线设置成Slave,怀着将信将疑的态度,回家一试,还真行了,开机不再出现Checking NVRAM提示。终于了了我心头一件不爽之事。原因分析中。
20 settembre

微星K9N Neo-F(nForce 550 MCP)组Raid 0心得以及阵列迁移

爱机配置如下:
AMD Athlon64 3000+ AM2
MSI K9N Neo-F(nForce 550 MCP)BIOS 160
宇瞻512MB DDR2 667 * 2
ST380811AS
7300GT DDR2 256MB

Vista U版(联想版,因为BIOS刷成了联想的,无须激活)

由于不怎么玩游戏,从不看电影。所以,硬盘和显卡一直够用。不过本人偏好收集操作系统,故80G硬盘已经力不从心了。特从电脑城找了一款相同型号的硬盘,打算回家组个Raid 0。一方面升级硬盘,另外一方面全面提升爱机性能。

买回来之后:

主板上有4个SATA插槽,0,1,2,3。原来硬盘在0上面,属于通道0。由于没有经验,我感觉插在不同通道上,应该可以获得更快的速度。于是把新硬盘插在了通道1,也就是插槽3上面。开机,BIOS顺利检测到两块硬盘。进入Vista,没有发现新硬件。正在奇怪,打开资源管理器,没错是两块硬盘。可能是因为硬盘型号完全一样,所以自认。先借了一个移动硬盘备份数据(注意,硬盘做Raid,要清空数据的)。然后进入BIOS,打开Raid Function。下面出现了SATA的4个接口。问都要启动那个接口,我选了0和3,也就是插两块硬盘的接口,保存重启。

开机自检完成后,出现了Press F10 to setup RAID。按F10设置RAID。里面设置很简单,将两块Free硬盘,拖动到Array组里面即可。当然类型要选择Striping(Raid 0),保存推出即可。重新启动之后,系统已经没了,拿出我的Vista安装光盘进行安装。安装程序顺利认出硬盘,无须另外加载驱动,安装过程也很顺利。第一次启动时间也大幅减少,总体来说系统快了很多,系统中只能发现一块硬盘,就是NVIDIA Striping,容量是两块硬盘容量总合。Raid 0设置成功。


后来发现了一些问题,启动Raid的时候,开机自检停留在Checking NVRAM要2-3分钟。打了微星客服,告知先将BIOS升级到180,然后要把两块硬盘插在一个通道。
首先,升级BIOS不太可能,因为180目前还没有找到联想版本。升级之后Vista用不了了。还是先移动硬盘试试。冒着数据全部丢失的风险(我已经把先前备份的数据考回来了),我把硬盘2从接口3移动到了接口1。开机。Raid报错,说阵列损坏。进入设置,说丢失了一块硬盘。我进入BIOS,那个Raid Function里面,将下面启动的0,3接口,修改为0,1。重新启动,本以为还要按F10重新设置Raid,不想它自动识别了,成功进入系统,Raid 0迁移成功。

不过,Checking NVRAM问题还是没有解决。正在努力找180 BIOS中。
22 agosto

解决Java版Discuz! passport 通行证 API中文注册乱码问题

首先感谢lovaling发表的Java版Discuz! passport 通行证帮我解决了Java与Discuz!同步用户的问题。
http://www.discuz.net/viewthread.php?tid=216986&extra=&page=1

在使用中我发现用中文注册会出现乱码,经过网上查资料以及反复测试,终于解决了该问题。

在lovaling发的DiscuzPassportUtils类中,修改了public static String passportEncode(Map<String, String> data) 方法
新的方法实现如下:
    public static String passportEncode(Map data) {
        Set skeys = data.keySet();
        String ret = "";
        String key = "";
        String tmp_1 = "";
        for (Iterator keys = skeys.iterator(); keys.hasNext();) {
            key = keys.next().toString();
            try {
                if (key == "username") {
                    tmp_1 = java.net.URLEncoder.encode((String) data.get(key), "GBK");
                } else {
                    tmp_1 = java.net.URLEncoder.encode((String) data.get(key), "UTF-8");
                }
                ret += java.net.URLEncoder.encode(key, "UTF-8")
                    + "="
                    + tmp_1
                    + "&";
            } catch (UnsupportedEncodingException e) {
                return "";
            }
        }

即,用户名不用UTF-8编码,而用GBK编码。不过这样做对于德语,法语,西班牙语等用户名就无效了。期待高手写出更经典更完善的代码。
19 luglio

今天上厕所碰到个妙龄少女

写了一下午程序,17点左右出去方便,方便完了正在拉拉链的时候,后面大方便的一个小屋一推门,出来一个妙龄少女。


TNND我都无语了,半天没回过神来。我头晕走错了不成?回头看看自己刚方便完的设施,女厕所不应该有啊。

出了厕所,发现那个女的就是我们公司隔壁公司的,貌似是新来的,要不然就是面试的。

那个女的惊讶的看看我,看看厕所……
17 luglio

MySQL 5.0.45 发布,解决了我的心头大患

MySQL以前的版本一直有一个问题,就是当你安装好MySQL以后,重装系统之后或者再次升级MySQL,配置最后一步设置root密码时经常出错。那是因为MySQL修改密码需要提供原始密码,而那个傻蛋MySQL配置程序不能提供原始密码,导致最后配置出问题,这也是大家安装MySQL遇到的最多的问题。
最新版本MySQL 5.0.45解决了这一问题,在设置新密码的时候,问你老密码,这样大大减低了出错的几率,赞一个。
官方下载页面地址:
http://dev.mysql.com/downloads/mysql/5.0.html
其它新特性正在发现中……