价格管制下免税后的效率问题(答友人问)
作者:kmzs 日期:2007-07-23
比如一件产品100块时有100个人买假定需求弹性是1,也就是单位弹性,也就是说价格上涨1块,买产品的人少1个(如果弹性高于1,那么价格上涨一块买的人会少很多,即富有弹性,如果弹性低于1,则销售量的减少比价格的上升量要小,即缺乏弹性)。
现在假如政府开始征税,税收是40,那么对企业来说,最佳的定价是120。因为假如税完全让客户承担,那么市场价格变为100+40=140,销量则变为100-40=60,收入是(140-40)×60=6000。而如果完全自己承担,则收入为(100-40)×100=6000。实际上可以求出价格在120时企业的毛利正好最大化,为(120-40)×80=6400。
价格为120的时候,企业收入是6400,政府税收是40×80=3200,总效率是9600,原来的总效率是100×100=10000,两者相减可得税收造成的效率损失是400。
因此如果此时减税,比如从40减到20,那么同理,市场价格应该变为110,总效率是110×90=9900,效率提高了300。
如果价格是由政府限定的,必须为120,那么减税造成的结果是企业收入8000,政府税收1600,总效率仍为9600。也就是说,有两千块钱从公共财政转移给了企业,没有造成社会总效率的变化。
理论上就是这样,比如政府限定了汽油的价格,那么减税对效率也没啥作用。假如原油价格上涨,而政府不希望石油产品涨价,那么只要一方面规定油价不变,一方面相应减税,就行了。
软件开发技术科普之二:Mac OS X共享库
作者:kmzs 日期:2007-07-19
Windows、Mac OS X和Linux的动态链接库/共享库各有千秋。在这里简单介绍下Mac OS X的共享库。Mac OS X的内核是BSD和Mach混合而成的。由于Mach核心处理CPU相关的最核心的任务,包括线程调度等,因此Mac OS X的原生可执行文件是Mach-O(O是Object的缩写)格式。因此Mac OS X的共享库也一般基于该格式。
Mac OS X除了有框架和包罗框架(又译伞状框架,两者的扩展名都为.framework的包,在此不多做介绍)之外,还有两种共享库格式。一种的扩展名为.dylib,被称为MH_DYLIB格式,是一种仅仅在内存中共享代码的简单的动态库,它不能被其它代码显式的载入。一般在XCode直接创建的BSD、Carbon或Cocoa动态库并进行编译,就能得到这种库。
另外有一种能被代码(一个程序或另一个共享库)显式载入的“插件”库,它是.so的单一格式文件,或者为.bundle的包(如果有相关资源的话,实际上包中的主程序也是.so格式的库)。它被称为MH_BUNDLE。比如ODBC Driver在Mac上一般应该被编译为这种格式,这样它才能被ODBC Driver Manager(也是一个共享库,请参见软件开发技术科普之一)显式载入。MS Office的Mac版中的一些.bundle包也是这种格式的动态库。
用XCode 2.2以上版本编译MH_BUNDLE有些麻烦,曾一度被怀疑为Bug,并在国外一些知名苹果软件开发论坛或邮件列表中有相关的讨论,做法如下:
1、双击Targets中的项目
2、弹出Target Info对话框,切换到Build选项卡以修改其中的选项(每个选项均对应一个GCC 4的编译选项)
3、将Mach-O Type改为bundle
4、此时如在XCode 2.2以上(我用的是2.4)中编译会遇到编译器错误:-compatibility_version only allowed with -dynamiclib,无法link。
5、打开Target Info对话框,在build面板中找到Current Library Version项,默认值为1,单击Edit,清空随后弹出的下拉对话单(sheet window)中的内容,注意直接将1删除是没用,XCode还会把它改回来。
6、再次编译,遇到错误-current_version only allowed with -dynamiclib
7、回到Target Info对话框,找到并用同样的办法清空Compatibility Version。
8、第三次编译,会显示-single_module or -multi_module flags can only be used when -dylib is also specified错误。
9、再次回到Target Info对话框,在build面板中找到Perform Single-Object Prelink,将其选中。
10、这次编译应该能通过了,在编译前,最好将Executable Extension(文件扩展名)改为.so。
11、可以在Build Results窗口(单击主窗口右下角──状态栏最右边的链接)中,将编译设置改为release,编译之——成功!
软件开发技术科普之一:ODBC科普
作者:kmzs 日期:2007-07-11
ODBC技术的目标是让数据库应用程序可以链接到各种各样的数据源,而不必重新编译或链接。比如一个程序在启动时,让用户选择数据源,随后执行一系列代码,比如创建一个表、添加几条记录,然后执行完毕。不管用户选择的数据源是什么类型的数据库、是哪个数据库、它的实际操作如何。也就是说可以写出与数据源无关的程序。
比如下面这组REALbasic代码(需要安装Rb的ODBCDatabase插件)能在数据源名称(DSN)“RSS”所指代的数据库中创建一个空白的表,而不必知道“RSS”的类型。用户如果在ODBC管理器中修改了“RSS”,比如将类型从MySQL改为MS SQL Server,这段代码仍能在不需要重新编译、链接的状况下运行,之不过最后会在MS SQL的数据库中创建表而已。
Dim db As ODBCDatabase
db = New ODBCDatabase
db.DataSource = "rss" 'the DSN you set
If db.Connect Then
'Return the database name set by ODBC Setup
msgbox db.DatabaseName
'Create a table
db.SQLExecute ("Create Table test (texta Text, textb Text)")
if db.Error then
MsgBox db.ErrorMessage
else
db.Commit
MsgBox "Create Table Successed!"
end if
Else
MsgBox db.ErrorMessage
End If
二、如何实现这一目标
实现这一目标的方法是在数据库应用程序和数据源之间添加一个中间层,即ODBC技术。
一般的数据库链接方式是这样的:
数据库程序<——>数据源
加了中间层之后的链接变成了:
数据库程序<——>ODBC Driver Manager<——>ODBC Driver<——>数据源
甚至:
数据库程序<——>ODBC Driver Manager<——>ODBC Driver<—…(多个ODBC Driver)…—>ODBC Driver<——>数据源
或者:
客户端数据库程序<——>客户端ODBC Driver Manager<——>客户端ODBC Driver<—Gateway及其他软件—>服务器端ODBC Driver Manager<——>一系列服务器端ODBC Driver<——>一系列服务器端数据源
三、ODBC Driver
就像需要不同的显卡或打印机驱动程序才能将应用程序中需要输出的内容,在不同的显示屏或打印机上输出出来一样,ODBC驱动程序用于将应用程序与数据源链接起来。它专为特定的数据源编写,提供了操作数据源的功能,并为数据库程序提供了一致的接口,这样数据库应用程序就不需要了解数据源的情况而能直接与之通讯了。ODBC驱动程序本质上十一个动态连接库(共享库),在用户访问特定的数据源时被动态加载。
四、ODBC Driver Manager
ODBC驱动程序管理器也是一个动态链接库。要它干嘛呢?仔细想一下就知道了,虽然ODBC Driver是一个动态库,因此数据库程序不用与它静态链接起来,但程序中也要定义动态库中所有需要使用的成员函数或结构之类。在C/C++/Obj-C之类的语言中,要包含改驱动的头文件,在Basic中要Declare该库中的所需使用的函数。这样不重新编译或链接应用程序就能操作各种不同的数据源的想法显然没法实现。这样ODBC驱动程序管理器就登场了,它通过数据源名称(DSN)中的信息来操作各种各样的ODBC Driver,而用户开发的数据库应用程序则只要操作ODBC Driver Manager这个动态库就行了。因此在C/C++/Obj-C之类的语言中,如果要使用ODBC来开发程序,一般需要包含ODBC Driver Manager的头文件,而ODBC Driver要通过ODBC Driver Manager才能把处理好的结果反馈给用户写的程序,因此当然也要包含ODBC Driver Manager的头文件。
五、ODBC Administrator/DNS (ODBC)和ODBC Setup库
有了ODBC Driver和ODBC Driver Manager,只需要数据源名称(DSN)信息就能操作到数据源了。但驱动也好驱动管理器也好都是动态库,那么用户怎么配置数据源名称(DSN)呢?用户可以手动写注册表(Windows)或ini配置文件(非Windows),或者使用ODBC管理程序,在Windows中叫做“数据源(ODBC)”(控制面板中)。如果需要以图形化方式来配置,还需要带有对话框资源的ODBC Setup动态库(在Windows中一般是必须的)。像Windows ODBC管理器、unixODBC、iODBC一般是ODBC Driver Manager和ODBC Administrator的合称,是带有这两个程序和一些其它实用工具及帮助说明文件的软件包。