2007年10月28日

Use MySQL Gui tools to securely connect to remote database

This particular example is going to be based on a connection from Windows XP using Putty, MySQL GUI tools and Dreamhost.

Quick summary of issue: I want to use MySQL Query Browser to access my database on my dreamhost account.  The database allows connections from the webserver only – nothing external.  I have an SSH account on the webserver.

Quick answer: This requires us to tunnel from our machine to the webserver and connect through this tunnel to the database server.

Lets take a look on how we can accomplish this:

Get Putty

Download Putty Here.   PuTTY is a free implementation of Telnet and SSH for Win32 and Unix platforms, along with an xterm terminal emulator.

Configure a new SSH connection in Putty

We need to make a new connection in putty and configure it to do tunneling.

  1. 1.jpg Create a connection to your webserver with the SSH protocol and proper port.

    In this case, it’ll be our server ‘dreamhost.server.com’ on port 22 using SSH.

  2. 4.jpgFind the tunnels dialog.  Expand the connection item, expand the SSH item, and click on Tunnels.

    We’re going to make a tunnel from our local source port to our remote destination port at the server.  Choose a source port number that is not in use on your machine and put it in the source box.  Finally, put the mysql server name, colon, mysql port in the destination box.

    In my example, I am using source of 9999, ‘local’ destination (thats local to the ssh server) of mysql.dreamhost.server.com:3306 (3306 being the standard mysql port).

  3. Next, click ‘Open’ (You might want to save the session for future reference), and then log in using your credentials (In the future, you might want to set up a public/private key to remove the need for you to interact with the login – you might also want to set up a new SSH user with no permissions to run any commands to increase security.  They only need to connect!)
  4. 3.jpgOpen MySQL GUI Tool.  In this case, I’m going to use the query browser.

    Since we’ve got our connection open at port 9999 on our local machine, we need to change the server to ‘localhost’ and our port to 9999.  This will make the connection over the tunnel.

    Finally, enter your normal credentials and click ‘OK’

2007年10月27日

# sudo wget http://dl.google.com/linux/linux_signing_key.pub -O- | sudo apt-key add -
在/etc/apt/sources.list加入:
deb http://dl.google.com/linux/deb/ stable non-free
然后不用说了。

2007年10月23日

ubuntu 7.10

启动时fsck错误:
/etc/fstab把windows的分区的pass列(最后一列)改成0,就可以取消检测了

声卡:
sudo gedit /etc/modprobe.d/alsa-base
在最后加上下面两行
options snd-hda-intel model=3stack
options snd-hda-intel probe_mask=1

字体:
sudo mkdir /usr/share/fonts/truetype/ttf-microsoft-fonts
sudo mv *.ttf /usr/share/fonts/truetype/ttf-microsoft-fonts
sudo fc-cache -f -v
最后一句可能出错,用这句:sudo fc-cache -fv 2>&1 | grep failed | cut -f1 -d":" | xargs -i sudo touch {} && sudo fc-cache -fv

刷新率:
安装nvidia-settings,在这里面改。ubuntu自带的改不了。

2007年02月11日

(一)

我微笑着,冷漠地看着身边的每个人,那是一中歇斯底里的微笑,两种极端的交点。

我已忘了怎样去哭。

一个人坐在角落里,我面无表情地望着冰冷的墙壁,汲取着手中热茶的唯一一点热量。

看着嬉笑的人群,依旧微笑,我的悲伤没人发觉。

(二)

血不断从手上的伤口中涌出来,我忘了痛,任新鲜的血液一滴滴地坠落在地板上。突然,我发现自己的血不是鲜红色的,它的颜色与寂寞相同。我已忘了寂寞的颜色。

打开门,我闻到了冬天的气息,而我的心却无法冬眠,在寒风中,赤裸的心灵被撕裂,痛到麻木,失去了感觉。

(三)

我与寂寞同一国度,这或许是宿命。黑暗里我点起一支蜡烛,昏黄的火焰轻轻地跳动着,那是寂静的心跳。蜡烛燃尽,黑暗吞噬了我,没有反抗,没有挣扎。

我早已习惯了漆黑一片。

独自走在深夜无人的街,我的世界仍然只有我自己,寒冷和无奈悄悄地蔓延,我与痛苦为伍。

(四)

沸腾的白开水不停地冒着热气,我呆呆地看着它,思绪一点一点地飞离我的身体。

我在想什么?

我还能做什么?

不断地问着自己,没有回答。

我已经习惯了质疑自己。

没有思想,却有呼吸,清晰地呼吸,我可以听得见自己心跳的声音。有力地一下一下,我到底还是活着?

(五)

打开电脑,听见鼠标和键盘在宁静的夜里发出清脆的声音。QQ上没有人。突然有人要求通过身份验证,在他的自我介绍一栏,我看见了一句颇有道理的话:“因为无聊所以上网,上了网却更寂寞!”毫不犹豫地,我握着鼠标按下了“通过验证”,然后下线,关闭了电脑。躺在床上,双眼望着天花板,不停想着那句话。

原来,我早已习惯了无聊。

(六)

我的生命没有意义,我的生活没有快乐,因为无奈,由于无情。没有目标,我以自己独特的方式活着,活在自己的世界中。

走在路上,不去理会那些指点和冷眼,我依然从容坚定地向前走着,脸上还是挂着莫名的微笑。生命中的过客,何必念念不忘,那你是否也只是我的过客?想起你,我收起笑容,停下了脚步,抬头看看天,不是蓝色的,是寂寞的颜色。

我无法强迫自己不去想你。

(七)

窝在沙发上,用手不停地用力揉着太阳穴,习惯性的偏头痛侵袭着我。桌上放着一杯冰水和止痛片,我没有去碰它们,闭上眼睛,感受着疼痛带给我的压力。

我已习惯了折磨自己。

冰冷的手上忽然感觉到了温暖,原来是滚烫的泪水,我以为自己早已没有了眼泪。

(八)

天使有翅膀,我没有,所以我不是天使。

魔鬼有魔力,我没有,所以我不是魔鬼。

我有的,是无奈、绝望和孤独的自由。

心底的希望和绝望激烈地斗争着,获胜的却是无奈。我已学会了接受无奈,想无奈妥协。

……

天使的缺点是太善良,魔鬼的缺点是太邪恶,我的缺点是太无奈。

(九)

轻轻地闭上眼睛,使劲、贪婪地呼吸着没有你的空气。是自由?还是思念?我无法回答自己,原来没有你的空气是如此地稀薄。

我也学会了去适应空气的稀冷。

笑过、哭过、吵过、闹过,如今我需要的,只是冷漠。

(十)

明媚的阳光透过窗子,暖暖地照在我的身上。睁开眼睛,用手挡了挡刺眼的光线,蒙上被子,我准备继续被打断的美梦。

美梦一旦被惊醒便无法在延续。气恼地从床上坐起身来,双手支着头,我的头发凌乱地垂了下来。梦醒了。我对自己苦笑着摇摇头,带着绝望去接受现实,去迎接毫无意义的新的一天。

我已习惯了一成不变的生活。

(十一)

“背影是真的,人是假的,没什么执着,一百年前你不是你,我不是我,悲哀是真的,泪是假的,本来没因果,一百年后没有你也没有我。”

恍惚之间我仿佛看见了你,伸出手,却只触碰到一片空白。我知道,一百年后你依然会是你,只是少了我的思念。

(十二)

风吹乱了我的头发,我不在意,慢慢地走在寒冬的街头。我麻木地移动着,有点模糊,隐隐约约看见你在我的前方,一步一步向前,你却离我越来越远。

我拼命地向你狂奔,知道你在我的眼前消失。停下脚步大口大口地喘着粗气,我开始笑,笑自己的傻,笑自己的愚蠢。

(十三)

房间里,书本堆满了整个桌子,我坐在堆积如山的书本面前,叹了口气。沉默了片刻,我突然站起来,伸手抓过那些令人乏味的破书,用力地朝四周的墙上扔去,然后把自己重重地摔在床上。

许久,我起身把那些书一本一本拾起来,重新放到桌子上,无可奈何地笑笑,把自己埋进了书堆。

(十四)

趴在桌子上,我把脸深深地埋进自己的臂弯,眼泪竟这样涌了出来。我不断做着深呼吸,企图平抚心里的波动,可我控制不了自己。

(十五)

我卸下了虚伪的微笑,摆出一张疲倦的脸。对你的眷恋依旧,只是我以学会了隐藏。

……

我的生活依然一如既往地平静,唯一的波动就是想你时的心悸。

诱惑,我知道,我们的距离以光年计算。

2007年01月23日

配置基于Eclipse的Seam开发环境

作者:flmn

参考文档:http://wiki.jboss.org/wiki/Wiki.jsp?page=EclipseSeamAutoDeploy

因为我的电脑配置比较低,在试过Netbeans和IDEA后,我还是决定使用Eclipse,因为它要快那么一点点。

安装Eclipse的插件:

emf-sdo-xsd-SDK-2.2.1
GEF-runtime-3.2.1
JBossIDE-2.0.0.Beta2
JEM-runtime-1.2.1
wtp-R-1.5.2-200610261841

在属性里添加JBoss服务器就不说了。

大原则就是:将所有生成的目录放在本地,让jboss到这里来找javaee工程。

新建一个EJB3.0的工程,假设这个工程叫abcd,一切按照默认,选择好服务器,我用的是jboss-4.0.5.GA,在工程文件夹下建立目录。
deploy:放生成的class文件和网页文件。
dist:放打包生成的abcd.ear,abcd.jar和abcd.war。
lib:放编译期需要的jar包,比如myfaces那两个。

本来的src目录不动,将来源码放这儿。

假设这个工程叫abcd

在deploy目录建立子目录abcd.ear,可以把数据源的配置文件放在deploy目录,如abcd-ds.xml。

进入abcd.ear目录,将需要的jar文件考入abcd.ear目录,如el-api.jar,el-ri.jar,jboss-seam.jar,jbpm-3.1.3.jar等,建立abcd.jar,abcd.war和META-INF目录,META-INF目录放application.xml,jboss-app.xml和MANIFEST.MF。参考文档里说建目录扩展名为ejb3的,但是如果建jar的,等打包的时候application.xml就不用改了,不明白为什么用ejb3这个目录扩展名,jar不影响使用。

将工程的输出目录由默认的bin改为deploy/abcd.ear/aboa.jar,懒得找选项窗口直接改.classpath文件。这样,除了源文件,src目录也放上seam.properties和META-INF目录,META-INF目录放components.xml,ejb-jar.xml,persistence.xml和MANIFEST.MF,编译的时候这些文件会被自动考到deploy/abcd.ear/aboa.jar。

abcd.war放web文件,xhtml,css等,abcd.war目录还要放META-INF和WEB-INF,都是标准配置,不说了。

关键的,修改%JBOSS_HOME%\server\default\conf\jboss-service.xml,在文件最下面,找到这段:
<attribute name="URLs">
    deploy/
</attribute>
这个设置服务器搜索应用的路径,加上我们自己的目录,如:
<attribute name="URLs">
    deploy/,

    file:/E:/eclipse/abcd/deploy/
</attribute>

这样起了jboss就不用频繁重启了,但是好像改了java没有重新部署,再研究一下,至少网页没问题了。

目录结构如下:

abcd
    deploy
        aboa.ear
            aboa.jar
                com
                META-INF
                    components.xml
                    ejb-jar.xml
                    MANIFEST.MF
                    persistence.xml
                seam.properties
            aboa.war
                META-INF
                    MANIFEST.MF
                WEB-INF
                    classes
                    lib
                        ajax4jsf.jar
                        jboss-seam-debug.jar
                        jboss-seam-ui.jar
                        jsf-facelets.jar
                        oscache-2.3.2.jar
                    components.xml
                    events.xml
                    faces-config.xml
                    pages.xml
                    web.xml
                index.htm
            META-INF
                application.xml
                jboss-app.xml
                MANIFEST.MF
            el-api.jar
            el-ri.jar
            jboss-seam.jar
            jbpm-3.1.3.jar
        aboa-ds.xml
    dist
    lib
        myfaces-api-1.1.4.jar
        myfaces-impl-1.1.4.jar
    src
        com
        META-INF
            components.xml
            ejb-jar.xml
            MANIFEST.MF
            persistence.xml
        seam.properties

2007-01-23更新:
重新保存deploy\abcd.ear\META-INF\application.xml会让服务器重新部署这个应用程序。按照unix的说法,就是touch一下这个文件。

2007年01月17日

<web-app>
    <security-constraint>
        <display-name>Restrict HTML Documents</display-name>
        <web-resource-collection>
            <web-resource-name>HTML</web-resource-name>
            <url-pattern>*.html</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description>
                Only Let ‘developer’s access HTML pages
            </description>
            <role-name>developer</role-name>
        </auth-constraint>
    </security-constraint>
</web-app>

2006年12月08日

1. IP地址设置

debian:~#vi /etc/network/interfaces

// 动态DHCP获得

# 启动系统激活设备.
# Loop回环地址.
auto lo
iface lo inet loopback

# 启动系统激活设备.
# 网卡eth0设置为DHCP类型.
auto eth0
iface eth0 inet dhcp

————————————

// 静态Static获得

# 启动系统激活设备.
# Loop回环地址.
auto lo
iface lo inet loopback

# 启动系统激活设备.
# 网卡eth0设置为Static类型.
auto eth0
iface eth0 inet static

# 指定IP地址.子网掩码.广播.网关.
address x.x.x.x
netmask x.x.x.x
gateway x.x.x.x

2. DNS地址设置

debian:~#vi /etc/resolv.conf

// 必须设置.否则无法访问任何URL

nameserver x.x.x.x
nameserver x.x.x.x

3. 配置完了之后重新启动网络

debian:~#/etc/init.d/networking restart

2006年11月22日

FILE指针传递给DLL为何无法正确操作--隐式重复定义的陷阱

作者: Panic 2006年1月10日

程序环境:
win2k pro sp4
vc6 sp5

问题提出:(已经省略无关内容)

主      题: 请教一个问题: 主程序里面打开一个文件,将文件指针传入dll中,在dll中对文件执行读写 回复根帖
作      者: zill_li (书生)
发表时间: 2006-1-9 21:33:20
正文内容:
int main(int argc, char* argv[])
{
    FILE * stream;
    if( (stream=fopen("F:\\1.txt","w+")) !=NULL )
    {
        printf("fp1=%X\n", stream);
        testFile( stream );
    }
    return 0;
}

//dll中
void testFile(FILE *fp)
{
    int xx=1234;
    fread(&xx,sizeof(int),1,fp);   
}

这样出错, 提示00000010地址不能为写!

 

先解释几个基本概念:

1,重复定义

出现变量或者函数重复定义,VC6一般报这样一个错误:fatal error LNK1169: one or more multiply defined symbols found

这个错误表明某个符号在工程中被定义了两份。这种情况一般发生在,某个变量在多个源文件(注:区别于头文件)出现定义。

2,工程间源文件分享

这种分享有两种方式,一种是通过.h文件单独分享,一般情况下,这种分享是安全的。

另一种是通过.h + .lib,或者 .h + .c,.cpp共享,这时候就会发生所谓的“隐式重复定义”。

观察问题中的结构,可以发现问题的起因就是FILE *指针的共享,那么在fopen,fwrite之类的函数中,到底对FILE *做了些什么呢?

调试这个源代码,可以在

_file.c

文件中跟踪到如下代码:
void __cdecl _lock_file (
        void *pf
        )
{
        /*
         * The way the FILE (pointed to by pf) is locked depends on whether
         * it is part of _iob[] or not
         */
        if ( (pf >= (void *)_iob) && (pf <= (void *)(&_iob[_IOB_ENTRIES-1])) )
            /*
             * FILE lies in _iob[] so the lock lies in _locktable[].
             */
            _lock( _STREAM_LOCKS + ((FILE *)pf – _iob) );
        else
            /*
             * Not part of _iob[]. Therefore, *pf is a _FILEX and the
             * lock field of the struct is an initialized critical
             * section.
             */
            EnterCriticalSection( &(((_FILEX *)pf)->lock) );
}

这是在fread中调用到的一个函数,注意函数中的这句:

if ( (pf >= (void *)_iob) && (pf <= (void *)(&_iob[_IOB_ENTRIES-1])) )

这里和 pf 比较的变量 _iob 是唯一没有跟随FILE * (pf)一起传递的变量,那么问题是否就出在这里呢?

在这个文件中,找到了 _iob的定义:

FILE _iob[_IOB_ENTRIES] = {
        /* _ptr, _cnt, _base,  _flag, _file, _charbuf, _bufsiz */

        /* stdin (_iob[0]) */

        { _bufin, 0, _bufin, _IOREAD | _IOYOURBUF, 0, 0, _INTERNAL_BUFSIZ },

        /* stdout (_iob[1]) */

        { NULL, 0, NULL, _IOWRT, 1, 0, 0 },

        /* stderr (_iob[3]) */

        { NULL, 0, NULL, _IOWRT, 2, 0, 0 },

};

这样一来,问题就清楚了。

_file.c是一个公共源文件,工程exe和dll分别引用了这个文件。

于是在exe中和dll中,这个变量_iob就存在了两份(隐式重复定义),而这个变量是影响相关函数执行结果的一个变量。(这个问题也会出现在使用lib作为公共源文件的场合)

在exe中,调用fopen,fread等函数的时候,内部调用的是链接进exe文件的_iob,而dll的导出接口调用的,是链接进dll内部的同名变量。

问题发生了,exe中的改变并不会影响dll中同名变量的数值,那么当在exe中想当然的认为正确的数值,到了dll中就面目全非了,结果必然是出错。

解决这个问题的方法有三个:

1,修改DLL,把所有相关的函数,包括fopen,fread,fwite等全部导出。

这样做可以确保所有调用引用的_iob都指向DLL内部的版本,但是由于涉及的函数比较多,操作复杂,并且影响DLL外部接口的清晰。

2,修改程序逻辑,把传递FILE * 改为传递自定义的文件缓冲区指针。

这样可以完全避免问题,同时程序的接口也将更简单。

3,修改_file.c及相关库的实现。

这么作的好处是一劳永逸,并且也为其他库的使用者避免了麻烦(当然,用户还是需要更新库文件并且重新编译链接),只是这个恐怕需要库供应商的支持,并且是否可行还有待商榷。

在目前的情况下,恐怕2是唯一可行的方案,而且不但如此,还需要在FILE *的使用说明上面,醒目的加一句:FILE *不允许在exe和DLL之间作为接口参数传递。

查阅了msdn,并没有找到相关的描述。

不过相信在其他库中,应该还存在其他的类似问题,这里友情提醒大家在编码的时候多加留意。

补充:感谢小明的建议

可以把工程的C++ library设成(Debug) Multithread DLL版本就不会有这个问题了。

原本只修改了工程的,所以问题依旧,现在两边都修改就没有问题了。

2006年11月16日

安装Apache2.2先。

把php解压到c:\

在httpd.conf加

LoadModule php5_module "c:/php/php5apache2_2.dll"
AddType application/x-httpd-php .php

2006年10月21日

原文地址:     http://kenya.bokee.com/5425606.html

JSP Standard Tag Libraries
Formatting and Internationalization
Two form input parameters, ‘date’ and ‘isoDate’, are URL-encoded in the link leading to this page. ‘isoDate’ is formatted according to the ISO8601 standard.
Formatting of numbers and dates is based on the browser’s locale setting. Formatting will change if you switch the default language setting from English to French or German, for example. (The browser needs to be restarted, too.)

Library import and parameter capturing:

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

新版本的应该是 :  <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<fmt:parseDate value="${param.date}" var="date" pattern="yyyy/MM/dd:HH:mm:ss>
<fmt:parseDate value="${param.isoDate}" var="isoDate" pattern="yyyyMMdd’T'HHmmss">

The input parameters must match the patterns, or the JSP will thrown an exception. This page does no error handling.

Input parameters:
Date:    2004/04/01:13:30:00   Java format: Thu Apr 01 13:30:00 CST 2004
isoDate: 20040531T235959       Java format: Mon May 31 23:59:59 CDT 2004

Dates
Tag Output
Attribute: value; required. Tag has no body.
<fmt:formatDate value="${date}" type="both"/>

 2004-4-1 13:30:00  
<fmt:formatDate value="${isoDate}" type="both"/>

 2004-5-31 23:59:59  
Attribute: type; optional. Indicates what to print: date, time, or both.
<fmt:formatDate value="${date}" type="date"/>

 2004-4-1  
<fmt:formatDate value="${isoDate}" type="time"/>

 23:59:59  
Attribute: dateStyle; optional. Varies the date format.
<fmt:formatDate value="${isoDate}" type="date" dateStyle="default"/>

 2004-5-31  
<fmt:formatDate value="${isoDate}" type="date" dateStyle="short"/>

 04-5-31  
<fmt:formatDate value="${isoDate}" type="date" dateStyle="medium"/>

 2004-5-31  
<fmt:formatDate value="${isoDate}" type="date" dateStyle="long"/>

 2004年5月31日  
<fmt:formatDate value="${isoDate}" type="date" dateStyle="full"/>

 2004年5月31日 星期一  
Attribute: timeStyle; optional. Varies the time format.
<fmt:formatDate value="${isoDate}" type="time" timeStyle="default"/>

 23:59:59  
<fmt:formatDate value="${isoDate}" type="time" timeStyle="short"/>

 下午11:59  
<fmt:formatDate value="${isoDate}" type="time" timeStyle="medium"/>

 23:59:59  
<fmt:formatDate value="${isoDate}" type="time" timeStyle="long"/>

 下午11时59分59秒  
<fmt:formatDate value="${isoDate}" type="time" timeStyle="full"/>

 下午11时59分59秒 CDT  
Attribute: pattern; optional. Inidcates date/time custom patterns.
<fmt:formatDate value="${date}" type="both" pattern="EEEE, MMMM d, yyyy HH:mm:ss Z"/>

 星期四, 四月 1, 2004 13:30:00 -0600  
<fmt:formatDate value="${isoDate}" type="both" pattern="d MMM yy, h:m:s a zzzz/>