bianbian coding life

便便代码人生: 关注技术, 翻译文档, 偶尔动动手

Archive for July, 2007

[问] fwrite的问题

Posted by bianbian on 2007-07-28 12:52


本文Tags:

fwrite(const void *buffer,size_t size, size_t count, FILE *fp);
这个似乎是把内存里的一股脑儿write到文件里去。
如果buffer是new出来的一大堆数据,有可能在内存里是分片存的,这时候一大堆一起写就有问题。
我不清楚是VC6的问题,还是fwrite本来就有这个问题:

  1. ....
  2. double *_bt[k] = new double[_header.wHeight * _header.wWidth];
  3. ....
  4. for(k=0; k < _GRAY_BANDS; k++)
  5. {
  6.   //用:fwrite(_bt[k], sizeof(double), _header.wHeight * _header.wWidth, fp2); 就不对
  7.   //必须一个一个保存
  8.   for(int j=0; j < _header.wHeight; j++)
  9.   {
  10.     for(int i=0; i < _header.wWidth; i++)
  11.     {
  12.        int idx = j * _header.wHeight + i;
  13.        fwrite(& _bt[k][idx], sizeof(double), 1, fp2);
  14.     }
  15.   }
  16.   delete[] _bt[k];
  17. }
  18. fclose(fp2);

哪位经过告诉我一声。

标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in C/C++, Technology | 3 Comments »

[原] C的struct和JSON交互

Posted by bianbian on 2007-07-15 04:55


本文Tags: ,

经过一天努力,现在百合涂鸦板用了JSON传递数据:http://bbs.nju.cn/pntdoc?board=beginner
虽然把数据和页面分开了,不过觉得过程还是比较麻烦:
1)新建JSON对象,C读取struct,把值插入
2)输出to_JSON_String
3)Javascript解析JSON,通过JST模板生成页面

实在是比较麻烦,有没有可能把一个struct直接转成JSON对象?
或者直接丢struct的字节码(加上描述信息)过去让Javascript负责解析成JSON对象?

struct就是一段长度固定的二进制码,如果想个办法能和JSON对象之间转换,应该能大大解放C作FastCGI的生产力。我的意思是这样:
C:
struct obj {
char name[3];
int age;
};

JSON:
obj {
name: “12″,
age: int
}

让我想想。

标签: ,

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in C/C++, JavaScript, Technology | No Comments »

[转] Hibernate映射对象标识符(OID)与数据库主键对应关系

Posted by bianbian on 2007-07-13 04:36


本文Tags:

原文:http://www.blogjava.net/action/archive/2007/05/22/119134.html
Hibernate采用对象标识符,也就是通常我们所说的OID来创建对象和数据库表里记录的对应关系,对象的OID和表里的主键对应,所以说OID是非常重要的,不应该让程序来给它赋值.数据库区分同一表的不同记录是用主键来区分.数据库中的主键最重要的3个基本要素就是不允许为null,不允许有重复值,主键永远不会改变.所以通常我们设计表都会设计主键的值为自动增加,没有业务逻辑含义的一组数字,当然针对每个数据库,设置的方法也不同.但是都非常简单.加一个属性就可以了.
而JAVA区分同一类的不同对象是用内存地址,在JAVA语言中判断两个对象的引用变量是否想相等,有以下两种比较方式.1)用运算符”==”比较内存地址,此外还可以用Object的equals方法也是按内存地址比较.2)比较两个对象的值是否相同,JAVA中的一些覆盖了Object类的equals方法实现比较合适.例如String和Date类,还有JAVA包装类.如果是String.equals(String)这种方式的比较就是比较这两个String的值的.如果是Object原是的equals方法就是比较地址了.这点很容易混淆.
通常,为了包装Hibernate的OID的唯一性和不可变性,由Hibernate或者底层数据库来给OID赋值比较合理.因此我们在编程的时候最好把持久化类的OID设置为private或者protected类型,这样可以防止JAVA程序随便更改OID.而OID的get方法我们还是要设置为public类型,这样方便我们读取. 在对象-关系映射文件里的 1)increment 代理主键,hibernate自动以递增的方式来生成标识符,每次增加1.
2)identity 代理主键,由底层数据库生成标识符,前提就是底层的数据库支持自动增长的类型.
3)sequence 代理主键,hibernate根据底层数据库生成的标识符,前提是底层数据库支持序列
4)hilo 代理主键,hibernate根据higg/low算法来生成的标识符,把特定表的字段作为high的值,默认选用hibernate_unique_key表的next_hi字段
5)native 代理主键,根据底层数据库对自动生成标识符的支持能力,还选择identity,sequence,或hilo.
6)uuid.hex 代理主键,hibernate采用128位的UUID算法生成标识符,UUID算法能够在网络环境下生成唯一字符串标识符.不过字符串要比数据占用的空间多的多.所以不流行使用.
7)assigned 适用于自然主键,由JAVA应用程序负责生成标识符,为了能让JAVA设置OID.不能吧setId方法设置为非公共类型了,这种方式也尽量避免使用.
这里个人觉得第一种方式,也就是说由Hibernate来生成对象标识符的方式比较好.但是这种方式的缺点是只能一个Hibernate对应一个数据库的表.当同时创建了SeesionFactory实例的时候.两个或者更多的Hibernate对应同一个数据库的时候就会插入出错.这个时候我们可以选择第二种方式把标识符的生成工作交给底层数据库.还有一个小知识点要注意就是OID必须定义为long,int,short类型,如果定义为byte会报异常,这里推荐用long.
总结一下,这7中生成OID标识符的方法,increment 比较常用,把标识符生成的权力交给Hibernate处理.但是当同时多个Hibernate应用操作同一个数据库,甚至同一张表的时候.就推荐使用identity 依赖底层数据库实现,但是数据库必须支持自动增长,sequence 以来底层数据库实现,但是数据库必须支持系列.hilo 根据特定的表实现.这三种方式了.当然针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况下.可以选择第三种.或者用native 让Hibernate来帮选择identity,sequence,或hilo.后边的自然主键不推荐使用,因为自然主键就是具有业务含义的主键,在现在的软件开发结构中,已经很少有人用了.下面总结一下几种常用数据库,可以使用的标识符类型.
MySQL:identity数据库底层实现,需要支持自动增长,increment由Hibernate实现,hilo用特定的表实现,
MSSQL:identity数据库底层实现,需要支持自动增长,increment由Hibernate实现,hilo用特定的表实现,
Oracle:sequence数据库底层实现,需要支持序列,increment由Hibernate实现,hilo用特定的表实现,
以上不难发现,所有的数据库都支持Hibernate用increment实现OID的生成,MYSQL和MSSQL数据库底层实现支持自动增长,而Oracle支持序列,还有用特殊表的实现方式这三个数据库都支持.还有一种实现方式适用于所有的数据库,就是native,由Hibernate去选择使用什么样的方式来生成IOD对象标识符,这种方式也是跨平台的.下面是各种设置方式的例子*.hbm.xml文件四个.例题来源孙MM的<<精通Hibernate>>一书.我非常喜欢这本书,讲的非常简单明了.感兴趣的朋友可以去买一本看看(当当打7.3折哦).

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping
  3. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  5. <hibernate-mapping>
  6.  
  7.   <class name="mypack.HiloTester"  table="HILO_TESTER">
  8.    
  9.     <id name="id" type="long" column="ID">
  10.     <generator class="hilo">
  11.                 <param name="table">hi_value</param>
  12.                 <param name="column">next_value</param>
  13.                 <param name="max_lo">100</param>
  14.         </generator>
  15.     </id>
  16.  
  17.     <property name="name" type="string" >
  18.         <column name="name" length="15" />
  19.     </property>
  20.    
  21.   </class>
  22.  
  23. </hibernate-mapping>
  24.  
  25. <?xml version="1.0"?>
  26. <!DOCTYPE hibernate-mapping
  27. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  28. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  29. <hibernate-mapping>
  30.  
  31.   <class name="mypack.IdentityTester"  table="IDENTITY_TESTER">
  32.    
  33.     <id name="id" type="long" column="ID">
  34.       <generator class="identity"/>
  35.     </id>
  36.  
  37.     <property name="name" type="string" >
  38.         <column name="name" length="15"/>
  39.     </property>
  40.    
  41.   </class>
  42.  
  43. </hibernate-mapping>
  44.  
  45. <?xml version="1.0"?>
  46. <!DOCTYPE hibernate-mapping
  47. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  48. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  49. <hibernate-mapping>
  50.  
  51.   <class name="mypack.NativeTester" table="NATIVE_TESTER" >
  52.    
  53.     <id name="id" type="long" column="ID">
  54.       <generator class="native"/>
  55.     </id>
  56.  
  57.     <property name="name" type="string" >
  58.         <column name="name" length="15" />
  59.     </property>
  60.    
  61.   </class>
  62.  
  63. </hibernate-mapping>
  64.  
  65. <?xml version="1.0"?>
  66. <!DOCTYPE hibernate-mapping
  67. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  68. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  69. <hibernate-mapping>
  70.  
  71.   <class name="mypack.IncrementTester" table="INCREMENT_TESTER" >
  72.    
  73.     <id name="id" type="long" column="ID">
  74.       <meta attribute="scope-set">private</meta>
  75.       <generator class="increment"/>
  76.     </id>
  77.  
  78.     <property name="name" type="string" >
  79.         <column name="NAME" length="15" />
  80.     </property>
  81.    
  82.   </class>
  83.  
  84. </hibernate-mapping>
标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Database, Java, Technology | No Comments »

[嗯] 肯为用户着想的软件绝对是第一的

Posted by bianbian on 2007-07-11 09:53


本文Tags:

Nokia的手机软件肯为用户着想,绝对是第一的。
今天又发现了一个细节,我很佩服Nokia的软件设计。
在6600的电话簿里按K(我手机里存的快递联系人电话都是K开头的),想加一个快递收货人。
于是就按了选项、新名片。
一般的手机也就出来个输入界面让你输吧?
6600不。在出来的输入界面里,名字一栏已经有“K”这个字母了。
如此贴心的设计,让做软件的我很吃惊。
小细节上可以看出一种精神,肯为用户着想,肯站在用户的角度考虑问题,绝对所向披靡。
祝Nokia越来越牛逼。我们都要向为用户着想的人学习。

标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in Technology | No Comments »

[转]ENVI使用小技巧:如何在“快速制图”中正常显示经纬度格网字体?

Posted by bianbian on 2007-07-06 11:59


本文Tags:

由于中国用户使用的基本上全部是中文系统,所以在进行“快速制图”操作过程中会出现经纬度格网字体不能正常显示(经纬度符号显示为“?”)。
通过以下操作可以解决这个问题:
方法一:通过修改“envi. cfg”文件解决
1. 找到ENVI的安装目录下的“envi. cfg”文件,并以记事本的方式打开。路径为:\\RSI\IDL*\products\envi*\menu。
2. 将“DEGREE SYMBOL = 32”拷到envi. Cfg文件中。
3. 重新启动ENVI即可。
方法二:直接在“快速制图”中修改
1. 启动ENVI。
2. 通过“File -> Open Image File’ dialog”选择ENVI自带的实例数据“bhtmref.img
3. 将波段1、2、3分别赋给红、绿、蓝通道,彩色合成显示在ENVI主图像窗口中选择“File -> QuickMap -> New QuickMap…”打开“快速制图”工具。
4. 在“Default QuickMap Layout”对话框中点击“OK”选取默认值。
5. 在“QuickMap Image Selection”对话框中点击“OK”选择全部图像。
6. 在“QuickMap Parameters”对话框中,将“Gridlines”项的“Font”通过下拉列表重新选择为“Hershey Font-> Roman1”即可。点击“Apply”,查看经纬度格网字体已经可以被正常显示。

标签:

遵守创作共用协议,转载请链接形式注明来自http://bianbian.org 做人要厚道

相关日志

Posted in ENVI & IDL, Technology | No Comments »