房贷还款的计算

怎么样才能付最少的利息是俺准房奴最关心的事儿,到底是拿浮动利率好,还是固定利率好,3年固定还是5年固定好,除了个人对利率走向的预测,还得知道利息是怎样计算的。最近刚刚研究了一下,跟大家分享一下心得吧。

房贷还款其实就是分期还款 (amortization),每期还款金额相同,银行从还款中先扣利息,再算本金。(一般也允许每期多付一点,多付的部分全都算还的本金,因为影响银行的利息收入,一般有限额,这个后面再另说,这里先考虑只老老实实按时还,不多付的情况。)

计算还款金额分两步走,一算周期利率,二算分期金额。

首先说周期利率。通常银行给的那个百分数(4%啊,6%啊什么的)都说是年利率,而付款周期可以是按月付(monthly),半月付(semi-monthly),按周付(weekly),或者双周付(Bi-weekly)。计算利息的时候需要计算周期利率,计息周期和付款周期的选择是会影响最终的实际利息的。一般计息周期和付款周期是相同的,这种情况下计息周期的利率等于年利率除以一年的期数,比如年利率是6%,按月付一年12期,周期利率就是6%/12=0.5%。但是有些情况下,比如加拿大的房贷有些是半年计息的,也就是说一年计两次,而还款还是可以选不同周期,这样计息周期与还款周期不同,周期利率就与前面的计算稍有不同。

周其利率的计算公式是:

其中 是银行给的年利率,c是每年的计息周期数,p是每年还款周期数。

比如还是年利率6%,每半年计息(在很多加拿大银行的网站经常会看到一句 Rate calculated semi-annually, not in advance就是这个意思),每年的计息周期就是2,还是按月还款,每年的还款周期是12, 那么周期利率就是 (1-6%/2)^(2/12)-1=0.494%,看到不同了吧。(不过注意一般只有固定利率的房贷是半年计的,浮动利率的一般还是按还款周期计)。

有了周期利率就可以算每期还款额了,公式如下:

未完待续。。。

参考: Amortization Calculator – Wikipedia

怎样在Eclipse上安装PHP插件

首先你要有已安装好的Eclipse平台,如果没有,可以去这里下载一款合适的版本进行安装。
这里介绍的安装方法是基于Eclipse平台版本3.3.2的,其他版本的安装也大同小异。

PHP插件安装步骤:

1、启动Eclipse,到菜单项 “帮助(Help) -> 软件更新(Software Update) -> 查找和安装(Find and Install…)”

Eclipse安装PHP插件第一步

Eclipse安装PHP插件第一步

2、选择寻找安装新组件(Search for new feature to install),然后点下一步(next)按钮。

Eclipse安装PHP插件第二步

Eclipse安装PHP插件第二步

Read More… »

Website Baker中文插件

编码格式: utf-8
适用版本: Website Baker 2.7.x

如果使用有任何问题,欢迎留言,我会尽快更正。

点击下载

服务器端包含SSI(Server Side Include)简介

服务器端包含 SSI,是英文 Server Side Includes的简写。SSI是一种可以指挥服务器动态声称网页内容的HTML指令。

通常SSI可以用来确保网页中的一些通用内容,比如版权信息、联系方式、或导航信息在全站所有网页中保持一致。使用SSI显示这些通用内容还可以减轻网站维护的工作量,因为当需要修改这些通用信息的时候,只需要改一个地方就可以了,而不需要逐个修改每一个网页。

各个服务器对SSI命令的支持各有不同,但 #include 和 #exec 是通用的。使用 SSI 的页面文件通常都使用扩展名.shtml,而不是.html 或 .htm,这样以便服务器能够辨认出哪些页面包含SSI指令,这些页面需要先经过服务器处理,翻译执行其中的SSI指令,然后才发送给客户端浏览器。  (当然有些服务器还是支持.html,.htm文件中有SSI指令的)。

Read More… »

如何将一个HTML页面嵌套在另一个页面中

这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可。这样便于维护,如果有很多网页,当通用内容需要修改时,只改一个文件就可以了,不需要每个文件单独修改。

最典型的应用比如页脚的版权信息等内容可以放在一个叫做footer.html文件里, 然后其他页面文件在页面内容的最后包含这个文件就可以了,具体例子下面有。

要html文件嵌套,最简单的办法是使用SSI(Server Side Include)技术,也就是在服务器端两个文件就被合并了。除了少数免费网页寄存服务外,几乎所有的网页寄存服务器都支持 SSI。这也是一个比较推荐的方法,它与ASP和ASP.NET网页使用的语法一模一样。如果网站管理员偏向使用PHP或JSP的话,语法会稍有不同。

对于不能使用SSI、ASP、ASP.NET、PHP和JSP等服务器端动态页面语言的情况,这里还将介绍两种客户端镶嵌的办法:JavaScript和iframe的方法。当这两种客户端的方法都有很大的弊病,一般不推荐使用。

下面对各种方法单独具体介绍。

Read More… »

[JAVA]怎样验证XML文件是否符合schema定义

两种方法:

1。 使用SAX解析:

/***
* @param xmlPath - XML文件路径
* @param schemaPath - Schema文件路径
*/
public void saxValidation(String xmlPath, String schemaPath){
try {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setNamespaceAware(true);
saxParserFactory.setValidating(true);
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
saxParser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaPath);
DefaultHandler handler = new DefaultHandler();
saxParser.parse(xmlPath, handler);
} catch(SAXException exc) {
exc.printStackTrace();
}
}

2。 使用DOM解析:

/***
* @param xmlPath - XML文件路径
* @param schemaPath - Schema文件路径
*/
public void domValidation(String xmlPath, String schemaPath){
try {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
docBuilderFactory.setValidating(true);
docBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
docBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaPath);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(xmlPath);
} catch(DOMException exc) {
exc.printStackTrace();
}
}

使用JAVA将彩色图片变为1bit黑白图片

最近做的project需要涉及到对扫描图片的文字识别,需要将扫描得到的彩色图片变为1bit的黑白图片。

搜索到很多解决方案,基本的归纳为两个步骤,首先要将彩色图片变为8bit灰度图片(grayscale image),然后再进一步变为1bit的单色图片(1bit monochrome)。

方案一:使用ColorConvert和Dithering操作

1、代码

目前JAVA最新的图片处理包应该是JAI(Java Advanced Imaging),在JAI API的FAQ页面上,找到了下面的方法来完成这两步工作:

将彩色图片转换为8bit灰度图片(使用ColorConvert颜色转换操作)
public RenderedImage convertTo8BitGray(RenderedImage colorImage){
ParameterBlock pb = new ParameterBlock();
pb.addSource(colorImage);
ColorModel cm = new ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_GRAY),
new int[]{8},
false,
false,
Transparency.OPAQUE,
DataBuffer.TYPE_BYTE);
pb.add(cm);
RenderedImage grayImage = JAI.create("ColorConvert", pb);
return grayImage;
}
将8bit灰度图片转换为1bit黑白图片 (使用errordiffusion或ordereddither操作)
public  RenderedImage applyDithering(RenderedImage grayImage, boolean isErrorDiffusion){
// Load the ParameterBlock for the dithering operation
// and set the operation name.
ParameterBlock pb = new ParameterBlock();
pb.addSource(grayImage);
String opName = null;
if(isErrorDiffusion) {
opName = "errordiffusion";
LookupTableJAI lut = new LookupTableJAI(new byte[] {(byte)0x00, (byte)0xff});
pb.add(lut);
pb.add(KernelJAI.ERROR_FILTER_FLOYD_STEINBERG);
} else {
opName = "ordereddither";
ColorCube cube = ColorCube.createColorCube(DataBuffer.TYPE_BYTE,
0, new int[] {2}); //尝试改变2为其它值,可以得到不同效果
pb.add(cube);
pb.add(KernelJAI.DITHER_MASK_441);
}
// Create a layout containing an IndexColorModel which maps
// zero to zero and unity to 255.
ImageLayout layout = new ImageLayout();
byte[] map = new byte[] {(byte)0x00, (byte)0xff};
ColorModel cm = new IndexColorModel(1, 2, map, map, map);
layout.setColorModel(cm);
// Create a hint containing the layout.
RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout);
// Dither the image.
bwImage = JAI.create(opName, pb, hints);
return bwImage;
}

2、问题

这段sample code在很多地方都被提到过,我不知道别人是否能够让它顺利执行,但是在我的机器上是不行的。

问题主要出在第一个convertTo8BitGray()函数里的ColorConvert操作上。在执行完ColorConvert之后,图片的ColorModel的numberOfComponents变为1。我的理解是因为变为灰度图片,只有一个色了。

然而不知为什么,图片的SampleModel的numberOfBands却仍然保持了3,这就造成了SampleModel和ColorModel 不兼容,所以程序总是抛出java.lang.IllegalArgumentException: The specified ColorModel is incompatible with the image SampleModel…的错误。

Read More… »

ABAP中如何检查字母数字类型(alpha numeric)的变量

Business requirment经常要求某个ID的值只能包含26个字母和10个数字字符,这就要求ABAP程序能够检查相应变量内容,辨别特殊字符。sap-img上的一个例子提供了这样的功能:

REPORT ZCHECK_ALPHA_NUMERIC.

* Declare the variable

* For Length
data: serial_length type i.

* For Alpha numeric
data: str type string.
data: valid_characters type string.

* Fill in those valid characters you need to check
concatenate ‘0123456789′ ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’
‘abcdefghijklmnopqrstuvwxyz’ into valid_characters.

* User Input
parameters testchar(10) default ‘12345abc’.

* Get User Input
str = testchar.

* The Checks
if str co valid_characters.
write: / str, ‘Characters are OK’.
else.
write: / str, ‘Characters are NOT OK’.
endif.

*– End Program

基于同样的原理,下面这个subroutine可以去掉一个字符串中的所有特殊字符

*&———————————————————————*
*&      Form  convert_character_entities
*&———————————————————————*
*  This form removes all non-alpha-numeric characters from a string
*———————————————————————-*
*      <–
*———————————————————————-*

FORM remove_non_alpha_numeric_char.
DATA: l_teststr       TYPE string,
l_alpha_numeric TYPE string.
DATA: l_strlen TYPE i.

DATA: l_char TYPE c.

l_teststr = ‘ref0 0@2$45*8′.
l_strlen = strlen( l_teststr ).
WRITE: / l_teststr, ‘length:’, l_strlen.

l_alpha_numeric = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’.

WHILE l_strlen <> 0.
l_strlen = l_strlen – 1.
l_char = l_teststr+l_strlen(1).
IF l_alpha_numeric NA l_char.
REPLACE SECTION OFFSET l_strlen LENGTH 1 OF l_teststr WITH ”.
ENDIF.
ENDWHILE.
l_strlen = strlen( l_teststr ).
WRITE: / l_teststr, ‘length:’, l_strlen.

ENDFORM.

SAP中国家代码和国家名称对应查询

SAP中的国家代码表是T005T.

另外 ADRC表的COUNTRY字段的帮助视图(Help View),也可以看到country code 和 country name的对应表。

ABAP字符串比较操作中空格的影响

ABAP对字符串有很多隐形的操作,有时更方便程序员,有时又比较容易使人困惑。

比如在比较字符串的值时,ABAP会自动忽视有效字符后面的空格,而如果在字符前面有空格,则会影响比较的结果。

比如: ‘X’ 和 ‘X__’ 比较的结果是相等;而’X'和’__X’比较的结果则是不相等。 (这里下划线__代表空格)

运行下面的程序可以看到效果:

DATA: l_string1 TYPE string,
l_string2 TYPE string,
l_string3 TYPE string.
l_string1 = ‘X’. “No space
l_string2 = ‘X ‘. “Space after X
l_string3 = ‘ X’. “Space before X
IF l_string1 EQ l_string2.
WRITE: / ‘String 1 and String 2 are identical.’.
ELSE.
WRITE: / ‘String 1 and String 2 are NOT identical.’.
ENDIF.
IF l_string1 EQ l_string3.
WRITE: / ‘String 1 and String 3 are identical.’.
ELSE.
WRITE: / ‘String 1 and String 3 are NOT identical.’.
ENDIF.

运行结果是输出:

String 1 and String 2 are identical.

String 1 and String 3 are NOT identical.