我相信人生是值得活的,尽管人在一生中必须遭受痛苦,卑劣,残酷,不幸和死亡的折磨,我依然深信如此.但我认为人生不一定要有意义,只是对一些人而言,他们可以使人生有意义. ---J 赫胥黎
安装超任模拟器 Snes9X GTK
我对SFC有很深的感情. 试想在90年代, 一盘任天堂卡带动辄200-300银子, 而刷一张超任磁碟最多3块钱. 换个4碟的游戏三国志4才最多12块钱. 多么节省银子啊.
感谢这个软件的作者, 向其致以崇高的敬意. 让我得以在Ubuntu重温超任旧梦.
官方主页: https://launchpad.net/~bearoso/+archive/ppa
E文不好的同学请看我的翻译:
首先,打开源配置文件
sudo gedit /etc/apt/source.list
根据你的Ubuntu版本号, 追加以下源到文件里.
注意, 我是Ubuntu904, 如果你装的是804/810/910, 请自行将jaunty 换成 hardy 等字样
保存并关闭文件. 运行如下命令
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6CF5CE97
sudo apt-get update
sudo apt-get install snes9x-gtk
这样安装就完成了.但
需要注意的是, 默认将游戏的分辨率设成你电脑的分辨率. 这样你打开游戏会非常慢. 解决方法很简单, 依次打开 options -- preference 在左方的树形菜单找到 display , 在右方找到 change fullscreen resolution , 打上勾, 并将之设置为 1024 * 768, 保存即可.
这是我玩多拉基亚776的画面. 感谢游戏的翻译者和这个模拟器的开发者. 再次对你们表达我的敬意.(图暂时传不上)
安装PS模拟器 ePSXE 1.6
网上安装ePSXE的文章多数很老, 介绍在Ubuntu710 下装的. 今天翻出了一篇强文, 该文作者写了个一键式的安装脚本. 让我如获至宝. 下载后再经自己验证, 修改, 最终得出了这个完善了的安装程序. 应该能通行于Ubuntu 804/810/904/910
首先, 打开这个页面下载安装脚本:
http://www.uushare.com/filedownload?user=diegoyun&id=2586695然后运行如下安装命令
sudo ./installepsxe-32bit-diego-version.sh
命令运行完毕之后, 你将会看到 ~/epsxe 文件夹.
为了玩PS,你需要一个bios文件. 限于版权, 我不能直接把这个文件放到网上. 请自行搜索 Scph1001.bin 和 Scph7502.bin 文件, 并将之放到 ~/epsxe/bios 文件夹.
现在, 运行 ~/epsxe 目录里的 epsxe, 你就可以打开模拟器玩游戏了.
显卡的设置如果你发现打开游戏的速度很慢, 那么你的显卡大概像我的一样差. 这种情况下, 你可以使用peter's people soft 驱动. 这个驱动的显示效果较次, 但速度很快. 对于玩PS的人来说, 足够满足需求了.
先打开模拟器, 依次点击 config -- video , 在下拉列表里, 选择 P.E.Op.S. SoftX Driver 1.18
然后点 Configure , 设置很简单, 先点 Nice, 然后点 Window Mode . (这一步很重要. 如果你不点, 默认是全屏打开. 你会看不到游戏界面. ) 我目前设置的是1024 * 768, 再大点我的显卡就不行了. 你可以自己调整试试.
附注: 参考文章: http://ubuntuforums.org/showthread.php?t=1376675 对作者致以崇高敬意.
问题记录格式
从老美那学到的格式,记录开发配置中所遇到的问题.例如当A遇到问题需要B解决时,就可以将之记录下来.这种格式的好处是:
例如,请看看这个例子
问题编号
| 问题描述
| 提出者
| 提出时间 | 建议谁来解决
| 状态
| 解决时间
| 实际解决者
| 解决办法
|
1
| 现在我们想达到的效果如下: 1)银行对账扫描的是系统真实的a表. 2)b公司记录扫描的是经筛选的b表. 但一个数据库不能有两个表同名.如何满足我们这个需求?
| 张三
| 2009/03/14 | 李四
| open
|
|
|
|
2
| 什么时候建好svn或cvs?
| 李四
| 2009/03/14
| 张三
| closed
| 2009/03/15
| 张三
| 已经在192.168.1.1上建好svn服务器,连接地址为.....
|
当然,如果时间允许,可以装类似bug zilla或者jira之类issue tracking工具. 如果实在没时间,就用这个格式先对付着干.
怎样取得hsql的返回值
取多个字段,Hibernate把每个id和name做成一个2个元素的单维数组,List实际上是一个单维数组的集合。
Query q = s.createQuery("select Cat.id, Cat.name, from Cat ");;
List l = q.list();;
for (int i=0; i< l.size();; i++); {
Object[] row = (Object[]); l.get(i);;
Long id = (Long); row[0];
String name = (String); row[1];
}
在这种情况下,HQL是不会去构造PO的
get(find) 和 load的区别http://blog.csdn.net/cin_ie/archive/2009/07/13/4345475.aspx
http://blog.csdn.net/kunmingkunlun/archive/2008/03/20/2198818.aspx
简单总结
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
之所以记下这个主题, 是今天在arm里发现一个很骇人的查询性能问题. 某处程序出错, 原因是该对象的引用对象的父对象id不存在, 于是我随随便便写了个find语句去取出对象. 举例如下
A.getB.getC.getId
在hbm里, a引用了b,b引用了c. 但因为如果不用lazy的模式,hsql会立刻找出所有的对象关系树. 恰好这几个对象都大量引用了其他对象. 最后就这个小小的操作,居然执行了将近50条sql查询语句!
经验总结:
1) 在查询多表关联的时候,尽量用jdbc. 如果一时贪方便用hsql, 那么也要用query方法而不是直接find,load. 并且做好良好的dao接口. 这样在该方法出现性能问题时,可以在dao实现里修改而不影响业务逻辑.
2) 侧面证明了把sql/hsql放在dao层的重要性. 对很简单的sql, 放在service和dao的区别不大, 但如果预见到该方法查询的数据多, 可能出现性能问题, 那么尽量将之放到dao. 当然, 这和程序员的经验有关.
hibernate 2.1连ORACLE有错,需查看SQL,可是UPDATE或INSERT中的值都被替换成“?”,如何才能显示出完整的SQL呢? 在WEB-INF/classes/log4j.properties添加如下内容:
### log just the SQL
log4j.logger.net.sf.hibernate=info
### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=debug
Eclipse
不太喜欢
Eclipse的鼠标悬停提示功能(主要是变量类型声明和Doc帮助提示),突然弹出的窗口妨碍视线还影响思路,关闭方法如下:
Window->Preferences->Java->Editor->Hovers 将[Combined Hover]取消即可腾讯的图片验证码地址:
http://ptlogin2.qq.com/getimage?aid=15000101&
设置wsad启动内存
wsad , 到安装目录找到 wsappdev.ini
VMArgs=-Xj9 -Xmx1024M
昨天,我以为是机器运行时间太长,重启一下,果然好了。但是今天又来了。看了一下错误提示,我以为是JVM有问题,就在启动Eclipse里加个
JVM的参数,结果还是不行。
后
来在网上找了一下,有人说是JAVA环境配置的问题,我想这不可能,因为以前一直用的好好的。有人说是JVM的问题,这个我刚刚换了一个,也不是这个问
题,后来看来有人说是:eclipse.ini中内存设置过大的问题,虽然我不以为然,还是试了一下,以前我修改过内存设置,一直都好好的,之前
eclipse.ini的配置如下:
-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-Duser.language=en
-XX:PermSize=256M
-XX:MaxPermSize=512M
现在修改了一下,-Xms256m改成-Xms128m,
把Xmx512m 改为 Xmx256m,结果还真的好了,没想到居然是这样的小问题引起来的。
oracle : 插入单引号 . insert into org_region (reg_id,reg_nom,reg_description) values (111,'rest ''','test')
hibernate插入mysql中文乱码问题找到my.ini, 修改默认的encoding为gb2312.
注意, 原有数据库要删除重建. 许多人就失败在这一步上.
oracle:合并多行字符串 :
http://czjxdm.javaeye.com/blog/466948
tnsnames.ora
at path: \ora92\network\admin
service_name:
means database instance.
Parser parser
=
new
Parser();
parser.setURL(address);
NodeFilter tableFilter
=
new
NodeClassFilter(TableTag.
class
);
NodeList list
=
parser.extractAllNodesThatMatch(tableFilter);
String test
=
new
String(list.toHtml().getBytes(
"
iso8859-1
"
),
"
gb2312
"
);
System.out.println(test);
这是我写的一段抓网页的程序, 开始抓回来的数据在ie显示正常, 而在firefox为乱码. 在eclipse里打印也是乱码. 后来将字符串以iso8859-1 转到gb2312, 一切正常.
牢记: get和post方式发送请求, 默认就是iso8859-1. 只不过ie隐含的将之转换而已.
iso8859-1 我称为结果编码. gb2312称为显示编码. 怎么找这两个编码?
1>get和post默认都是iso8859-1, 所以结果编码一般为iso8859-1. 但如果是ajax请求, 则一般为utf-8. 所以可以在两者之间试试.
2>显示编码在该网页就能抄到.要不网页也不能正确显示中文.
也可以加上:
parser.setEncoding("gb2312");省了手动转码的工夫.
//多行记录合并.
public List generateDataList(HttpServletRequest request) {
List systemOwners = new ArrayList();
List dataList = new ArrayList();
try {
systemOwners = (List)Manager.GetInstanceSystemOwner(null);
List entityList = getEntityList();
List regionList = getRegionList();
RoleActeur actor;
Map result =null;
String instanceId;
String instanceLabel;
String scopeId;
String scope;
String scopeLabel;
String key=null;
String lastKey=null;
String validatorStr=null;
String sep=",";
for(Iterator it = systemOwners.iterator();it.hasNext();){
actor = (RoleActeur)it.next();
instanceId = actor.getEntiteOrganisationnelle().toString();
instanceLabel = actor.getInstanceName();
scopeId = actor.getScopeId().toString();
scope = actor.getScope();
scopeLabel = getEntityOrRegionName(scope,scopeId,entityList,regionList);
key = instanceId+"_"+scopeId+"_"+scopeLabel;
if(!key.equals(lastKey)){
if(result!=null){
dataList.add(result);
}
result = new HashMap();
result.put("IAP_ID",instanceId);
result.put("IAP_LIBELLE",instanceLabel);
result.put("SCOPE_ID",scopeId);
result.put("SCOPE_LABEL",scopeLabel);
lastKey = key;
}
concateString(result,"INSTANCE_IDS",actor.getIdActeur(),sep);
}
if(result!=null){
//Add the last one.
dataList.add(result);
}
}catch (Exception e) {
logger.error(e);
}
return dataList;
}
曾经想过写个接口. 后来想想很难包含其他业务. 干脆先把代码记录下来.
iframe
使用iframe的时候, ie6 要在setting里设置浏览器为" 每次都去取新路径. " 要不浏览器就会在缓存取内容. 这样导致的结果就是, 假如iframe里有跳转, 那么只有第一次跳转是对的. 其他时候都显示第一次跳转的内容.
判断文档加载:(extjs 也是这么做的. 用一个interval函数来反复检查.)
document.onreadystatechange = function(){ if(document.readyState=="complete") { alert('加载完毕'); } }
2006-03-13 @ 15:29:24 · 作者 volcano · 归类于 PHP, AJAX, JAVASCRIPT
上个礼拜整了个ajax调用yahoo搜索的demo,不想有网友发现search.htm会报javascript错 --- 系统错误: -1072896658.
他的服务器环境是apache 2.05+php4.3+ie6/firefox 1.07+windows server
2003,而我的服务器环境是apache 2.2+php5.1.2/php4.3+ie6/firefox
1.07+winxp.这个时候俺几乎就要把所有的错归结到windows server
2003身上了.但是对方可以正常查看我放在网上的demo,所以这跟windows的亲戚应该没太大干系,用-1072896658作为关键字
google了一下,很快有了答案.
http://www.panoramio.com/blog/explorer-system-error-1072896658/
如果XMLHttpRequest对象请求的文档未指定正确的utf-8编码,就会出现这个错误
浏览器系统错误:-1072896658(Explorer system error: -1072896658)
解决办法很简单,给代理proxy.php加上简单的一行就一切ok:
header('text/javascript; charset=utf-8'); 或
header('Content-Type:text/html; charset=utf-8');
或
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
摘要: Java:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package org.diegochen.yuitut.base.controller;import java.io.PrintWriter;import java.util.List;imp...
阅读全文
在网上找到一篇很棒的文章:
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html翻译并根据实际情况进行了小小修改,仅关注Linux下动态共享库(Dynamic shared library .so)的开发.
1 简单的so实例
源文件
//test1.c
int test1(){
return 1;
}
//test2.c
int test2(){
return2;
}
//mytest.c
#include <stdio.h>
int test1();
int test2();
int main(){
printf("result of test1:= %d\n",test1());
printf("result of test2:= %d\n",test2());
}
打包成so文件
在代码的目录下运行如下命令: (如果你不是Ubuntu系统,请将命令的sudo都去掉)
gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o
sudo mv libctest.so.1.0 /usr/lib
sudo ln -sf /usr/lib/libctest.so.1.0 /usr/lib/libctest.so
sudo ln -sf /usr/lib/libctest.so.1.0 /usr/lib/libctest.so.1
参数详解:
- -Wall: 包含warning信息
- -fPIC: 编译动态库必须,输出不依赖位置的代码(原文 :Compiler directive to output position independent code)
- -shared: 编译动态库必需选项
- -W1: 向链接器(Linker)传递一些参数.在这里传递的参数有
"-soname libctest.so.1"
- -o: 动态库的名字. 在这个例子里最终生成动态库 libctest.so.1.0
两个符号链接的含义:
- 第一个:允许应用代码用 -lctest 的语法进行编译.
- 第二个:允许应用程序在运行时调用动态库.
2 so路径设置
为了使应用程序能够在运行时加载动态库,可以通过3种方式指定动态库的路径(以下例子均假定/opt/lib是动态库所在位置):
用ldconfig指定路径
运行
sudo ldconfig -n /opt/lib
/opt/lib 是动态库所在路径. 这种方式简单快捷,便于程序员开发.缺点是重启后即失效.
修改/etc/ld.so.conf文件
打开/etc/ld.so.confg 文件,并将/opt/lib 添加进去.
(
注: 在Ubuntu系统中, 所有so.conf文件都在/etc/ld.so.conf.d目录. 你可以仿照该目录下的.conf文件写一个libctest.conf并将/opt/lib填入)
用环境变量LD_LIBRARY_PATH指定路径
环境变量的名字一般是LD_LIBRARY_PATH, 但是不同的系统可能有不同名字. 例如
Linux/Solaris:
LD_LIBRARY_PATH, SGI:
LD_LIBRARYN32_PATH, AIX:
LIBPATH, Mac OS X:
DYLD_LIBRARY_PATH, HP-UX:
SHLIB_PATH) (
注: 此说法未经验证)
修改~/.bashrc , 增加以下脚本:
if [ -d /opt/lib ];
then
LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
fi
export LD_LIBRARY_PATH
在第一章的简单例子中, /usr/lib 是Ubuntu默认的动态库目录,所以我们不须指定动态库目录也能运行应用程序.
3 简单的动态调用so例子
C调用例子
保留第一章的test1.c和test2.c文件,并增加ctest.h头文件如下:
#ifndef CTEST_H
#define CTEST_H
#ifdef __cplusplus
extern "C" {
#endif
int test1();
int test2();
#ifdef __cplusplus
}
#endif
#endif
我们继续使用第一章生成的libctest.so,仅需增加一个新的应用程序 prog.c:
//prog.c
#include <stdio.h>
#include <dlfcn.h>
#include "ctest.h"
int main(int argc, char **argv)
{
void *lib_handle;
int (*fn)();
char *error;
lib_handle = dlopen("libctest.so", RTLD_LAZY);
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
return 1;
}
fn = dlsym(lib_handle, "test1");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
return 1;
}
int y=fn();
printf("y=%d\n",y);
dlclose(lib_handle);
return 0;
}
然后用如下命令运行(由于没有使用其他库,所以忽略-L等参数):
gcc -Wall prog.c -lctest -o prog -ldl
./progdl
方法简介
dlopen("libctest.so", RTLD_LAZY): 加载动态库,如果加载失败返回NULL. 第二个参数可以是:
- RTLD_LAZY: lazy模式. 直到源码运行到改行才尝试加载.
- RTLD_NOW: 马上加载.
- RTLD_GLOBAL: 不解(原文: Make symbol libraries visible.)
dlsym(lib_handle, "test1"): 返回函数地址. 如果查找函数失败则返回NULL.和微软的动态加载dll技术对比如下:
- ::LoadLibrary() - dlopen()
- ::GetProcAddress() - dlsym()
- ::FreeLibrary() - dlclose()
C++调用例子
增加一个prog2.cpp
#include <dlfcn.h>
#include <iostream>
#include "ctest.h"
using namespace std;
int main(){
void *lib_handle;
//MyClass* (*create)();
//ReturnType (* func_name)();
int (* func_handle)();
string nameOfLibToLoad("libctest.so");
lib_handle = dlopen(nameOfLibToLoad.c_str(), RTLD_LAZY);
if (!lib_handle) {
cerr << "Cannot load library: " << dlerror() << endl;
}
// reset errors
dlerror();
// load the symbols (handle to function "test")
//create = (MyClass* (*)())dlsym(handle, "create_object");
//destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");
func_handle =(int(*)())dlsym(lib_handle, "test1");
const char* dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol test1: " << dlsym_error << endl;
}
cout<<"result:= "<<func_handle()<<endl;
dlclose(lib_handle);
return 0;
}
然后用如下命令运行:
g++ -Wall prog2.cpp -lctest -o prog2 -ldl
./prog2
编译命令简介
假设C文件是prog.c, C++调用文件是prog2.cpp,那么编译脚本分别是:
C语言:
gcc -Wall -I/path/to/include-files -L/path/to/libraries prog.c -lctest -o prog
C++语言:
g++ -Wall -I/path/to/include-files -L/path/to/libraries prog2.cpp -lctest -ldl -o prog2
参数详解:
- -I: 指定头文件目录.
- -L: 指定库目录.
- -lctest: 调用动态库libctest.so.1.0. 如果在打包so时没有创建第一个符号链接,那么这个参数会导致编译不成功.
- -ldl: C++编译必须
相关知识
命令
ldd appname 可以查看应用程序所依赖的动态库,运行如下命令:
ldd prog
在我的机器输出:
linux-gate.so.1 => (0xb80d4000)
libctest.so.1 => /usr/lib/libctest.so.1 (0xb80be000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7f5b000)
/lib/ld-linux.so.2 (0xb80d5000)
4 C++开发带class的so
//myclass.h
#ifndef __MYCLASS_H__
#define __MYCLASS_H__
class MyClass
{
public:
MyClass();
/* use virtual otherwise linker will try to perform static linkage */
virtual void DoSomething();
private:
int x;
};
#endif
//myclass.cpp
#include "myclass.h"
#include <iostream>
using namespace std;
extern "C" MyClass* create_object()
{
return new MyClass;
}
extern "C" void destroy_object( MyClass* object )
{
delete object;
}
MyClass::MyClass()
{
x = 20;
}
void MyClass::DoSomething()
{
cout<<x<<endl;
}
//class_user.cpp
#include <dlfcn.h>
#include <iostream>
#include "myclass.h"
using namespace std;
int main(int argc, char **argv)
{
/* on Linux, use "./myclass.so" */
void* handle = dlopen("./myclass.so", RTLD_LAZY);
MyClass* (*create)();
void (*destroy)(MyClass*);
create = (MyClass* (*)())dlsym(handle, "create_object");
destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");
MyClass* myClass = (MyClass*)create();
myClass->DoSomething();
destroy( myClass );
}
编译和运行:
g++ -fPIC -shared myclass.cpp -o myclass.so
g++ class_user.cpp -ldl -o class_user
./class_user
这篇教程是<Beginning Linux Programming> 3rd 第二章的读书笔记.进行了一些小小的改动,更好突出主题.
1 起步走
这个例子说明了如何编写shell,声明变量,读入用户输入,引用变量
#!/bin/sh
#Author: Yunshichen
#Created at: 2009.08.19
a=Hello
echo "a is: "$a
#带空格的字符串必须要用双引号括起来.
#a=Hello world!
#echo "a is: "$a
a="Hello world!"
echo "a is: "$a
#=号两边不能有空格.
#a = "Hello world!"
echo "a is: "$a
echo "What's your name?"
read aname
echo "hello, "$aname
exit 0
#知识点:
#1>每个shell都以#!/bin/sh开头,文件名一般是xxx.sh
#2>变量都存储为字符串
#3>如果字符串包含空格,就必须用引号括起来
#4>变量赋值时,等号两边不能有空格.
#5>从终端读取变量不需要引号.
#6>用$varname的方式引用变量值
把上述程序存为1.sh,打开文件所在的文件夹,依次执行
chmod +x 1.sh
./1.sh
就可以看到程序运行效果.
写完shell程序之后,都必须以上述方式改变文件属性,执行才能得到输出结果.以下不再赘述这个过程.
2 单引号的使用
#!/bin/sh
#Author: Yunshichen
#Created at: 2009.08.19
myvar="Hi there"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar
echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0
#知识点:
#1>单引号的作用
#2>$可以通过\取消变量
3 参数变量
如果脚本程序在调用时带有参数,Linux就会创建一些额外的变量.姑且称之为参数变量
#!/bin/sh
#Author: Yunshichen
#Created at: 2009.08.19
echo "The separator between parameters is: $IFS"
echo "The program $0 is now running"
echo "There are $# parameters"
echo "The first parameter was $1"
echo "The second parameter was $2"
echo "The parameter list was $*"
IFS=''
echo "Using \$@,the parameter list was $@"
echo "Using \$*,The parameter list was $*"
exit 0
#知识点
#1>$IFS : 分隔单词的字符,通常是空格,制表符和换行符.
#1>$0: shell脚本的名字
#2>$#: 传递给脚本的参数个数
#3>$$: shell脚本的进程号
#4>$1,$n..: 脚本程序的参数
#5>$*: 在一个变量间列出所有参数,各个参数以IFS定义的分隔符分隔.
#6>$@: 在一个变量间列出所有参数,不同的是参数不用IFS分隔.所以用$@比用$*更好.
将文件存为3.sh .输入 ./3.sh aaa bbb ccc 察看输出结果.