用blackberry写一个blog看看,我就不指望能写到msn 的spaces上去了,刚才试了一下,好像wordpress也不能用这个ucweb登录,还是原始的blogbus好。
分类目录归档:不是技术
Blackberry JDE 4.x
Gosh…..!下载这个东西真变态!bb的官方网站搞了一个动态的链接来下载,而且还不知道文件的具体大小,恐怖,天知道它会有多大,不过失败了两次之后,我决定在国内的论坛里面查找了。
OK,80M,下来就好了。
运行安装,sorry,你的JDK版本不够高哦,1.4.2
1.5! 于是干脆下个JDK6,这些只是一个符号而已
重装MySQL
在这些所谓的技术上犯的错误越多,越能快速了解它的原理,不是么?
因为allen配的jabberd2的MySQL版本过低,于是我去把它升级到5.0,真是费力不讨好的事情,原来的3.23不是挺好用的么?
rpm -e ……
有些不肯走的,rpm -e –nodeps ……
rpm -ivh …server…
rpm -ivh …client…
然后MySQL能跑了,可是Jabberd2怎么也起不来,没错,找不到libmysqlclient.so.?? well,我算是知道devel是干嘛用的了。
不过我上次是怎么解决这个问题的?嗯….估计是我以前的libmysqlclient没卸载干净造成了。想起来也好笑,上次libmysqlclient没卸干净,却把原来的mysql.h卸掉了,于是找了个源代码包……真是太土了。
well,上了一下mysql,看明白了,也就是server,client,devel三个包
其中devel包括有开发库和头文件。
于是装上devel,jabberd2就可以起来了。
然后发现mysql对于字符的处理,哭了,怎么那么多的字符类型变量。
Blackberry 7290的软件下载问题
关键词:黑莓, Blackberry, 数字签名无效,7290
BB7290到手有将近一个月了,按照完全的攻略下载桌面管理器,下载新软件,比如Opera mini版,安装的时候总会出现同样的问题:“无法加载下列模块,数字签名无效” xxxxxxx.cod …
花了一个上午时间看了一下论坛,总算明白了,然后照着做了,解决这个问题。
过程中也尝试过这样那样比如刷rom,比如修改vendor.xml的过程。
几个说明:
1.ROM是一个操作系统的载体,刷ROM相当于重装操作系统,系统的模块之间或许会有依赖关系,如果担心出问题就不要重装了。
2.找到合适你的BB的桌面管理器和合适你的BB的系统的安装文件,比如我用BB7290的是这两个:
41112dtMULT(桌面管理器for7290).exe
7290C_PBrER4[1].1.0_rel466_PL1.8.0.149_A4.1.0.351_CSL_rebundle.exe
上一个是桌面管理器,下一个开头是7290C,意思就是7290用的中文版,后面A4.1.0.351是该系统的版本号,诸如major version minor version等等。
如果担心有问题可以到官方主页去下载,官方主页google一下就可以了。
3.先说说刷ROM。安装完桌面管理器之后启动,进入主界面会发现有个
应用程序加载程序
的 icon,如果BB已经通过USB线连上了,可以运行这个看看有什么已经安装了的模块/程序。
很多地方都说到这个vendor.xml的问题,不过语焉不详。这里我详细说一下:
安装桌面管理器之后,C:\Program Files\Common Files\Research In Motion\AppLoader 目录下会有一大堆应用相关的文件,其中vendor.xml保存了BB各个发行版的软件信息。在启动同一个目录底下的Loader.exe(事实上这就是桌面管理器里面的
应用程序加载程序
)的时候,Loader会根据BB发过来的Vendor号在vendor.xml获取系统的编号,只有当找不到vendor.xml或者在vendor.xml中找不到相关信息的时候才会继续去BB里面获取更多的系统软件信息。因此只要把vendor.xml改名之后,运行应用程序加载程序才能获得系统中软件模块信息,并对其进行删除修改等等操作。
对于7290,vendor.xml似乎确实是可有可无的,前提是没有别的操作只能使用vendor.xml。(此结论不确定是否适用于别的型号,因为我没用过,^_^)
4.所有的第三方软件加载的时候都说“无法加载下列模块,数字签名无效”,为什么?
先说说安装桌面管理器时候的一个option,桌面转寄器和Blackberry Internet Service(下面简称BIS)。
桌面转寄是通过PC转寄邮件到BB中。
而BIS则是一种Internet Service服务,需要IT policy来支持,也就是如果你通过架设一个企业内部的IT Policy Manager来管理BB的安全性。
很不幸的是,手上的BB有IT Policy。(水货嘛,没办法了)
a.用桌面管理器备份信息。
b.选项-
安全选项-
一般设置下按下滚轮,擦除手持设备。
c.重装桌面管理器(这里可以选择修改安装),optional那里选Blackberry Internet Service。然后把一个Blackberry IT Policy Manager产生的policy.bin放到安装目录下,修改注册表
[HKEY_CURRENT_USER\Software\Research In Motion\BlackBerry\Policy Manager]
Path
=
C:\\Program Files\\Research In Motion\\BlackBerry\\policy.bin
d.连接,运行,恢复备份。
e.下载安装其他的第三方软件。
5.总算是把这个问题解决的,下一步我打算还是建一个exchange服务器,用公司的所有的blackberry来玩玩。毕竟BB的优势在于其安全管理,一味的求方便,增增删删程序让人感到只是一个小孩在玩玩具。
jabberd2
最后还是选择了采用多c2s多sm实例的方法去实现,这样对source code的改动也就降低到最少了。
目前对系统的改动有几个方面:
a.增加三个表: jab_com (用来保存多域名信息,co是企业域名) jab_groups (企业内部对员工的预分组,co是企业域名) jab_members(企业内部员工信息,co是企业域名)
需要修改的目前只是mod_roster.c,其中获取groups的部分,改改就OK了。这样的默认结构是不允许block/delete/add的,add了也没有用。
其他的大概就不用改动了……毕竟只是roster-items和roster-groups的影响。
jabberd多域共享实现
没有采取多sm的方式,而是采用一个比较诡异的做法,把jid重新解释成本机jid,然后分发。有点搞笑,对吧?
我觉得也是,而且我看看要改的地方,估计也还有两三处。不过也好,可以更深入理解jabberd的各个模块。
标准C库函数
C-1 标准输出输入函数
C -2 字元检查函数
C -3 字串函数
C -4 数学函数
C -5 日期/时间函数
C -6 工具函数
C-1 标准输出输入函数
FILE* fopen(const char* filename, const char* mode):使用mode模式开启参数filename的档案,传回档案串流,失败传回NULL.
FILE* freopen(const char* filename, const char* mode, FILE* stream):关闭档案后重新开启档案.
int fflush(FILE* stream):清除缓冲区的内容,成功传回0,失败传回EOF.
int fclose(FILE* stream):关闭档案.
int remove(const char* filename):删除参数的档案,失败传回非零值.
int rename(const char* oldname, const char* newname):将档案名称oldname改为newname,失败传回非零值.
FILE* tmpfile():建立
wb+
模式的暂存档案,当结束程式后就会关闭且删除此档案.
char* tmpname(char s[L_tmpnam]):指定暂存档案的名称为s.
int setvbuf(FILE* stream, char* buf, int mode, size_t size):指定串流暂存区尺寸size,使用mode参数值_IOFBF为完整暂存区,_IOLBF是线性暂存区或_IONBF没有暂存区.
void setbuf(FILE* stream, char* buf):指定串流的暂存区为参数buf.
int fprintf(FILE* stream, const char* format, …):将格式化字串写入档案串流.
int printf(const char* format, …):在标准输出显示格式化字串.
int sprintf(char* s, const char* format, …):将格式化字串输出到字串s.
int fscanf(FILE* stream, const char* format, …):从档案串流读取指定格式的资料.
int scanf(const char* format, …):从标准输入读取指定格式的资料.
int sscanf(char* s, const char* format, …):从字串s读取指定格式的资料.
int fgetc(FILE* stream):从档案串流读取一个字元.
char* fgets(char* s, int n, FILE* stream):从档案串流读取一个字串.
int fputc(int c, FILE* stream):写入一个字元到档案.
char* fputs(const char* s, FILE* stream):写入一个字串到档案.
int getc(FILE* stream):从档案串流读取一个字元.
int getchar(void):从标准输入读取一个字元.
char* gets(char* s):从标准输入读取一个字串.
int putc(int c, FILE* stream):写入一个字元到档案.
int putchar(int c):在标准输出显示一个字元.
int puts(const char* s):在标准输出显示一个字串.
int ungetc(int c, FILE* stream):将一个字元放回档案串流.
size_t fread(void* ptr, size_t size, size_t nobj, FILE* stream):从档案读取指定大小的资料.
size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* stream):将指定大小的资料写入档案.
int fseek(FILE* stream, long offset, int origin):移动档案指标到offset位移量,其方向是origin参数值SEEK_SET的档案开头,SEEK_CUR是目前位置或SEEK_END档尾.
long ftell(FILE* stream):目前档案指标的位置.
void rewind(FILE* stream):重设档案指标到档头.
int feof(FILE* stream):是否到达档尾.
int ferror(FILE* stream):是否档案串流产生错误.
C-2 字元检查函数
int isalnum(int c):isalpha(c)或isdigit(c)的字元.
int isalpha(int c):isupper(c)或islower(c)的字元.
int iscntrl(int c):是否是ASCII控制字元.
int isdigit(int c):是否是数字.
int isgraph(int c):是否是显示字元,不含空白字元.
int islower(int c):是否是小写字元.
int isprint(int c):是否是显示字元0x20 (‘ ‘)到0x7E (‘~’).
int ispunct(int c):是否是显示字元,不包含空白,字母,数字字元.
int isspace(int c):是否是空白字元.
int isupper(int c):是否是大写字元.
int isxdigit(int c):是否是十六进位字元.
int tolower(int c):转换成小写字元.
int toupper(int c):转换成大写字元.
C-3 字串函数
char* strcpy(char* s, const char* ct):将字串ct复制到字串s.(String Copy)
char* strncpy(char* s, const char* ct, size_t n):将字串ct前n个字元复制到字串s.
char* strcat(char* s, const char* ct):连结字串ct到字串s之后.(String Catanation)
char* strncat(char* s, const char* ct, size_t n):连结字串ct前n个字元到字串s.
int strcmp(const char* cs, const char* ct):比较字串cs和ct.
int strncmp(const char* cs, const char* ct, size_t n):比较字串cs和ct的前n个字元.
char* strchr(const char* cs, int c):传回字元c第一次出现在字串cs位置的指标.
char* strrchr(const char* cs, int c):传回字元c第后一次出现在字串cs位置的指标.
char* strpbrk(const char* cs, const char* ct):传回字串ct任何字元在字串cs第一次出现的位置指标.
char* strstr(const char* cs, const char* ct):传回字串ct在字串cs第一次出现的位置指标.
size_t strlen(const char* cs):传回字串cs的长度.
char* strerror(int n):传回指定错误代码的说明文字内容.
char* strtok(char* s, const char* t):以字串t的任何字元为分隔字元,找寻字串s中下一个token记号.
void* memcpy(void* s, const void* ct, size_t n):从位置ct复制n个字元到位置s,传回s.
void* memmove(void* s, const void* ct, size_t n):从位置ct搬移n个字元到位置s,传回s.
int memcmp(const void* cs, const void* ct, size_t n):比较位置ct和位置cs的前n个字元.
void* memchr(const void* cs, int c, size_t n):传回cs位置开始前n个字元第一次出现字元c的位置指标.
void* memset(void* s, int c, size_t n):取代cs位置开始前n个字元成为字元c,传回位置指标s.
C-4 数学函数
double exp(double x):自然数的指数e^x.
double log(double x):自然对数logx
double log10(double x):十为底的对数log10x.
double pow(double x, double y):传回参数x为底,参数y的次方值x^y.
double sqrt(double x):参数x的平方根.
double ceil(double x):传回大於或等於参数x的最小double整数.
double floor(double x):传回小於或等於参数x的最大double整数.
double fabs(double x):传回参数x的绝对值.
hypot(double x, double y):传回√(x^2+y^2)公式的值
double ldexp(double x, int n):x乘以2的n次方是x*2^n.
double frexp(double x, int* exp):将参数x的浮点数分解成尾数和指标,x = m*2^exp,传回m值的尾数,将指数存入参数exp.
double modf(double x, double* ip):将浮点数x分解成整数和小数部分,传回小数部分,将整数部分存入参数ip.
double fmod(double x, double y):如果y为非零值,传回浮点数x/y的余数.
double sin(double x):正弦函数.
double cos(double x):余弦函数.
double tan(double x):正切函数.
double asin(double x):反正弦函数.
double acos(double x):反余弦函数.
double atan(double x):反正切函数.
double atan2(double y, double x):参数y/x的反正切函数值.
double sinh(double x):hyperbolic正弦函数,sinh(x)=(e^x-e^(-x))/2.
double cosh(double x):hyperbolic余弦函数,cosh(x)=(e^x+e^(-x))/2.
double tanh(double x):hyperbolic正切函数,tanh(x)=(e^x-e^(-x))/(e^2+e^(-x)).
C-5 日期/时间函数
clock_t clock(void):传回程式开始执行后所使用的CPU时间,以ticks为单位,除以常数CLK_TCK就是秒数.
time_t time(time_t* tp):传回目前的历法时间(Calendar Time),也会指定给参数的tp指标,如为无效时间,传回-1.
double difftime(time_t time2, time_t time1):传回参数time2和time1的时间差,即time2-time1.
time_t mktime(struct tm* tp):将参数*tp的当地时间改为历法时间, 如果不能转换传回-1.
char* asctime(const struct tm* tp):传回参数tm结构指标转换成日期/时间格式的字串,字串最后有新行字元\n.
char* ctime(const time_t* tp):传回参数time_t指标转换成当地日期/时间的字串,字串最后有新行字元\n.
struct tm* gmtime(const time_t* tp):传回将参数的time_t指标转换成UTC(Coordinated Universal Time)日期/时间的tm结构指标.
struct tm* localtime(const time_t* tp):传回将参数的time_t指标转换成当地日期/时间的tm结构指标.
size_t strftime(char* s, size_t smax, const char* fmt, const struct tm* tp):将参数tp的日期/时间以格式化字串fmt输出到字串s,s最多储存smax个字元.
C-6 工具函数
int abs(int n),long labs(long n):传回整数n的绝对值.
double atof(const char* s):将参数字串s转换成浮点数,如果字串不能转换传回0.0.
int atoi(const char* s):将参数字串s转换成整数,如果字串不能转换传回0.(Char to integer)
int itoa():将整数转换成参数字串s.(Integer to Char)
long atol(const char* s):将参数字串s转换成长整数,如果字串不能转换传回0.
double strtod(const char* s, char** endp):函数忽略字串s前的空白字元,将数字部分转换成浮点数,如果尚有未转换的部分字串,则设成参数endp指标.
long strtol(const char* s, char** endp, int base):函数忽略字串s前的空白字元,将数字部分转换成长整数,如果尚有未转换的部分字串,则设成参数endp指标.
unsigned long strtoul(const char* s, char** endp, int base):如同strtol函数,其传回值是无符号长整数.
void* calloc(size_t nobj, size_t size):传回一块参数nobj阵列大小的记忆体指标,nobj元素大小为size初值为0,错误传回NULL.
void* malloc(size_t size):传回大小size记忆体指标,没有指定初值,错误传回NULL.
void* realloc(void* p, size_t size):将指标p的记忆体改为size大小,不会更改原记忆体的值,多配置部分初值为0,错误传回NULL.
void free(void* p):释放参数p指标的记忆体空间.
void abort():强迫程式以不正常方式结束,如同呼叫raise(SIGABRT)函数.
void exit(int status):程式以正常方式结束,传回系统环境状态值,0表示正常结束.
int system(const char* s):将字串s的指令传给环境来执行,也就是执行MS-DOS的指令.
char* getenv(const char* name):传回参数name的环境字串,如果没有传回NULL.
void* bsearch(const void* key, const void* base, size_t n, size_t size, int (*cmp)(const void* keyval, const void* datum)):阵列基础的二元搜寻函数,阵列是参数base,键值是参数key,n是阵列大小,size是每个元素的大小,最后的参数是指向函数的指标,这是比较元素大小的函数,找到传回该元素指标,没有找到传回NULL.
void qsort(void* base, size_t n, size_t size, int (*cmp)(const void*, const void*)):阵列基础的快速排序法函数,阵列是参数base,n是阵列大小,size是每个元素的大小,最后的参数是指向函数的指标,这是比较元素大小的函数.
int rand(void):传回乱数的整数值,其值的范围是0到RAND_MAX常数,其值为0x7FFF.
void srand(unsigned int seed):指定乱数的种子数,参数是无符号整数,如果没有指定,预设的种子数为1.
jabberd2
Ubuntu下的jabberd2很全,钱果然不是盖的,很丰富的可安装的资源。
我发现居然不用下源代码编译直接就能用,真有点不敢相信,不过代码还是要改的……
估计Ubuntu的也只能装来玩玩
Jabberd
上周在redhat上装的Jabberd2。
因为有半年没有编译过程序了,这两个月来我一直在
pjoke
上写php或者actionscript。突然转回Linux编译项目有点反应不过来了。
不过还算顺利。
Jbd2的数据库和验证用的是默认的MySQL,安装这个好烦,我觉得目前好多的所谓安装过程写得都不理想,没有从根本上让你理解linux上安装的概念。各种功能的文件放置在什么路径下,还有各种参数是什么意思。不过总算搞定了,赫赫。
然后把jbd2 configure了,再make, make install。在windows上跑了个gaim,一切正常。
今天开始VMWare+Ubuntu+Jabberd2,看看容易装不。
临界星座速查表
http://pjoke.com/astro/checkastro.php
1950年到1999年的星座速查,精确到分。
根据一个流行的表做的,我浏览了这个表一下,星座的分界跟太阳历不尽相同,大概是用恒星历?
搞不清楚这个差别,不过我还是忠于这个表格作了。