<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ada的博客 – 点滴分享，用心品味生活 &#187; 编程</title>
	<atom:link href="http://www.jianghuimin.com/program/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jianghuimin.com</link>
	<description>喜欢产品设计，移动开发，捣鼓网站相关东东</description>
	<lastBuildDate>Sun, 29 Jan 2012 01:28:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Linux生成core文件、core文件路径设置</title>
		<link>http://www.jianghuimin.com/program/cplusplus/1521.html</link>
		<comments>http://www.jianghuimin.com/program/cplusplus/1521.html#comments</comments>
		<pubDate>Fri, 27 Jan 2012 14:21:33 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[core]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1521</guid>
		<description><![CDATA[在Linux下产生并调试core文件 先看看我用的是个什么机器： $ uname -a Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux 再看看默认的一些参数，注意core file size是个0，程序出错时不会产生core文件了。 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) 4 max memory size (kbytes, -m) unlimited [...]]]></description>
			<content:encoded><![CDATA[<p>在Linux下产生并调试core文件 先看看我用的是个什么机器：</p>
<p>$ uname -a<br />
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux</p>
<p>再看看默认的一些参数，注意core file size是个0，程序出错时不会产生core文件了。</p>
<p><span id="more-1521"></span><br />
$ ulimit -a<br />
core file size (blocks, -c) 0<br />
data seg size (kbytes, -d) unlimited<br />
file size (blocks, -f) unlimited<br />
max locked memory (kbytes, -l) 4<br />
max memory size (kbytes, -m) unlimited<br />
open files (-n) 2048<br />
pipe size (512 bytes, -p) 8<br />
stack size (kbytes, -s) 10240<br />
cpu time (seconds, -t) unlimited<br />
max user processes (-u) 7168<br />
virtual memory (kbytes, -v) unlimited</p>
<p>写个简单的程序，看看core文件是不是会被产生。</p>
<p>$ more foo.c</p>
<p>#include <stdio.h></p>
<p>static void sub(void);</p>
<p>int main(void)<br />
{<br />
    sub();<br />
    return 0;<br />
}</p>
<p>static void sub(void)<br />
{<br />
    int *p = NULL;</p>
<p>    /* derefernce a null pointer, expect core dump. */<br />
    printf("%d", *p);<br />
}</p>
<p>$ gcc -Wall -g foo.c<br />
$ ./a.out<br />
Segmentation fault</p>
<p>$ ls -l core.*<br />
ls: core.*: No such file or directory</p>
<p>没有找到core文件，我们改改ulimit的设置，让它产生。1024是随便取的，要是core文件大于1024个块，就产生不出来了。</p>
<p>$ ulimit -c 1024</p>
<p>$ ulimit -a<br />
core file size (blocks, -c) 1024<br />
data seg size (kbytes, -d) unlimited<br />
file size (blocks, -f) unlimited<br />
max locked memory (kbytes, -l) 4<br />
max memory size (kbytes, -m) unlimited<br />
open files (-n) 2048<br />
pipe size (512 bytes, -p) 8<br />
stack size (kbytes, -s) 10240<br />
cpu time (seconds, -t) unlimited<br />
max user processes (-u) 7168<br />
virtual memory (kbytes, -v) unlimited</p>
<p>$ ./a.out<br />
Segmentation fault (core dumped)<br />
$ ls -l core.*<br />
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128</p>
<p>注意看上述的输出信息，多了个(core dumped)。确实产生了一个core文件，9128是该进程的PID。我们用GDB来看看这个core。</p>
<p>$ gdb --core=core.9128<br />
GNU gdb Asianux (6.0post-0.20040223.17.1AX)<br />
Copyright 2004 Free Software Foundation, Inc.<br />
GDB is free software, covered by the GNU General Public License, and you are<br />
welcome to change it and/or distribute copies of it under certain conditions.<br />
Type "show copying" to see the conditions.<br />
There is absolutely no warranty for GDB. Type "show warranty" for details.<br />
This GDB was configured as "i386-asianux-linux-gnu".<br />
Core was generated by `./a.out'.<br />
Program terminated with signal 11, Segmentation fault.<br />
#0 0x08048373 in ?? ()<br />
(gdb) bt<br />
#0 0x08048373 in ?? ()<br />
#1 0xbfffd8f8 in ?? ()<br />
#2 0x0804839e in ?? ()<br />
#3 0xb74cc6b3 in ?? ()<br />
#4 0x00000000 in ?? ()</p>
<p>此时用bt看不到backtrace，也就是调用堆栈，原来GDB还不知道符号信息在哪里。我们告诉它一下：</p>
<p>(gdb) file ./a.out<br />
Reading symbols from ./a.out...done.<br />
Using host libthread_db library "/lib/tls/libthread_db.so.1".<br />
(gdb) bt<br />
#0 0x08048373 in sub () at foo.c:17<br />
#1 0x08048359 in main () at foo.c:8</p>
<p>此时backtrace出来了。</p>
<p>(gdb) l<br />
8         sub();<br />
9         return 0;<br />
10     }<br />
11<br />
12     static void sub(void)<br />
13     {<br />
14         int *p = NULL;<br />
15<br />
16         /* derefernce a null pointer, expect core dump. */<br />
17         printf("%d", *p);<br />
(gdb)</p>
<p>在程序不寻常退出时，内核会在当前工作目录下生成一个core文件（是一个内存映像，同时加上调试信息）。使用gdb来查看core文件，可以指示出导致程序出错的代码所在文件和行数。</p>
<p>1.core文件的生成开关和大小限制<br />
---------------------------------<br />
 1）使用ulimit -c命令可查看core文件的生成开关。若结果为0，则表示关闭了此功能，不会生成core文件。<br />
 2）使用ulimit -c filesize命令，可以限制core文件的大小（filesize的单位为kbyte）。若ulimit -c unlimited，则表示core文件的大小不受限制。如果生成的信息超过此大小，将会被裁剪，最终生成一个不完整的core文件。在调试此core文件的时候，gdb会提示错误。</p>
<p>2.core文件的名称和生成路径<br />
----------------------------<br />
core文件生成路径:<br />
输入可执行文件运行命令的同一路径下。<br />
若系统生成的core文件不带其他任何扩展名称，则全部命名为core。新的core文件生成将覆盖原来的core文件。</p>
<p>1）/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1，表示添加pid作为扩展名，生成的core文件格式为core.xxxx；为0则表示生成的core文件同一命名为core。<br />
可通过以下命令修改此文件：<br />
echo "1" > /proc/sys/kernel/core_uses_pid</p>
<p>2）proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。<br />
可通过以下命令修改此文件：<br />
echo "/corefile/core-%e-%p-%t" > core_pattern，可以将core文件统一生成到/corefile目录下，产生的文件名为core-命令名-pid-时间戳<br />
以下是参数列表:<br />
    %p - insert pid into filename 添加pid<br />
    %u - insert current uid into filename 添加当前uid<br />
    %g - insert current gid into filename 添加当前gid<br />
    %s - insert signal that caused the coredump into the filename 添加导致产生core的信号<br />
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间<br />
    %h - insert hostname where the coredump happened into filename 添加主机名<br />
    %e - insert coredumping executable name into filename 添加命令名</p>
<p>3.core文件的查看<br />
-----------------<br />
 core文件需要使用gdb来查看。<br />
 gdb ./a.out<br />
 core-file core.xxxx<br />
 使用bt命令即可看到程序出错的地方。<br />
以下两种命令方式具有相同的效果，但是在有些环境下不生效，所以推荐使用上面的命令。<br />
1）gdb -core=core.xxxx<br />
file ./a.out<br />
bt<br />
2）gdb -c core.xxxx<br />
file ./a.out<br />
bt</p>
<p>4.开发板上使用core文件调试<br />
-----------------------------<br />
如果开发板的操作系统也是linux，core调试方法依然适用。如果开发板上不支持gdb，可将开发板的环境（依赖库）、可执行文件和core文件拷贝到PC的linux下。<br />
在 PC上调试开发板上产生的core文件，需要使用交叉编译器自带的gdb，并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法，不需要每次启动gdb都配置以上变量，即：在待运行gdb的路径下建立.gdbinit。<br />
配置文件内容：<br />
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH<br />
set solib-search-path YOUR_CROSS_COMPILE_PATH<br />
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH<br />
handle SIG32 nostop noprint pass</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/cplusplus/1521.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>httpclient连接超时设置</title>
		<link>http://www.jianghuimin.com/program/java/1515.html</link>
		<comments>http://www.jianghuimin.com/program/java/1515.html#comments</comments>
		<pubDate>Fri, 27 Jan 2012 14:08:49 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[andoird]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[httpclient]]></category>
		<category><![CDATA[超时]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1515</guid>
		<description><![CDATA[/* 从连接池中取连接的超时时间 */ ConnManagerParams.setTimeout(params, 1000); /* 连接超时 */ HttpConnectionParams.setConnectionTimeout(params, 2000); /* 请求超时 */ HttpConnectionParams.setSoTimeout(params, 4000); 第一行设置ConnectionPoolTimeout：这定义了从ConnectionManager管理的连接池中取出连接的超时时间，此处设置为1秒。 第二行设置ConnectionTimeout：这定义了通过网络与服务器建立连接的超时时间。Httpclient包中通过一个异步线程去创建与服务器的socket连接，这就是该socket连接的超时时间，此处设置为2秒。 第三行设置SocketTimeout：这定义了Socket读数据的超时时间，即从服务器获取响应数据需要等待的时间，此处设置为4秒。 以上3种超时分别会抛出ConnectionPoolTimeoutException,ConnectionTimeoutException与SocketTimeoutException。 &#160; httpclient post方法封装 public static String post(String url, NameValuePair... params) { try { // 编码参数 List&#60;NameValuePair&#62; formparams = new ArrayList&#60;NameValuePair&#62;(); // 请求参数 for (NameValuePair p : params) { formparams.add(p); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, CHARSET); [...]]]></description>
			<content:encoded><![CDATA[<p>/* 从连接池中取连接的超时时间 */<br />
ConnManagerParams.setTimeout(params, 1000);<br />
/* 连接超时 */<br />
HttpConnectionParams.setConnectionTimeout(params, 2000);<br />
/* 请求超时 */<br />
HttpConnectionParams.setSoTimeout(params, 4000);</p>
<p>第一行设置ConnectionPoolTimeout：这定义了从ConnectionManager管理的连接池中取出连接的超时时间，此处设置为1秒。<br />
第二行设置ConnectionTimeout：这定义了通过网络与服务器建立连接的超时时间。Httpclient包中通过一个异步线程去创建与服务器的socket连接，这就是该socket连接的超时时间，此处设置为2秒。<br />
第三行设置SocketTimeout：这定义了Socket读数据的超时时间，即从服务器获取响应数据需要等待的时间，此处设置为4秒。<br />
以上3种超时分别会抛出ConnectionPoolTimeoutException,ConnectionTimeoutException与SocketTimeoutException。</p>
<p>&nbsp;</p>
<p>httpclient post方法封装</p>
<p><code>public static String post(String url, NameValuePair... params) {<br />
try {<br />
// 编码参数<br />
List&lt;NameValuePair&gt; formparams = new ArrayList&lt;NameValuePair&gt;(); // 请求参数<br />
for (NameValuePair p : params) {<br />
formparams.add(p);<br />
}<br />
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams,<br />
CHARSET);<br />
// 创建POST请求<br />
HttpPost request = new HttpPost(url);<br />
request.setEntity(entity);<br />
// 发送请求<br />
HttpClient client = getHttpClient();<br />
HttpResponse response = client.execute(request);<br />
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {<br />
throw new RuntimeException("请求失败");<br />
}<br />
HttpEntity resEntity =  response.getEntity();<br />
return (resEntity == null) ? null : EntityUtils.toString(resEntity, CHARSET);<br />
} catch (UnsupportedEncodingException e) {<br />
Log.w(TAG, e.getMessage());<br />
return null;<br />
} catch (ClientProtocolException e) {<br />
Log.w(TAG, e.getMessage());<br />
return null;<br />
} catch (IOException e) {<br />
throw new RuntimeException("连接失败", e);<br />
}</p>
<p>}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/java/1515.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP数组适用unset删除重建索引</title>
		<link>http://www.jianghuimin.com/program/php/1498.html</link>
		<comments>http://www.jianghuimin.com/program/php/1498.html#comments</comments>
		<pubDate>Mon, 23 Jan 2012 16:23:45 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1498</guid>
		<description><![CDATA[1.unset删除元素后不会重建数组的索引。 array_values()可以实现索引重建 //************about unset************************ //$a = array(1 => 'one', 2 => 'two', 3 => 'three'); //unset($a[2]); /* will produce an array that would have been defined as $a = array(1 => 'one', 3 => 'three'); and NOT $a = array(1 => 'one', 2 =>'three'); */ //$b = array_values($a); // Now $b is array(0 => 'one', [...]]]></description>
			<content:encoded><![CDATA[<p>1.unset删除元素后不会重建数组的索引。</p>
<p>array_values()可以实现索引重建<br />
<span id="more-1498"></span><br />
			//************about unset************************<br />
			//$a = array(1 => 'one', 2 => 'two', 3 => 'three');<br />
			//unset($a[2]);<br />
			/* will produce an array that would have been defined as<br />
			   $a = array(1 => 'one', 3 => 'three');<br />
			   and NOT<br />
			   $a = array(1 => 'one', 2 =>'three');<br />
			*/</p>
<p>			//$b = array_values($a);<br />
			// Now $b is array(0 => 'one', 1 =>'three')<br />
			//**********************************************</p>
<p>2.preg_match 参数 U s i 作用<br />
/u 表示按unicode(utf-8)匹配（主要针对多字节比如汉字）<br />
/i 表示不区分大小写（如果表达式里面有 a， 那么 A 也是匹配对象）<br />
/s 表示将字符串视为单行来匹配</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/php/1498.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>google c/c++编程风格总结</title>
		<link>http://www.jianghuimin.com/program/cplusplus/1483.html</link>
		<comments>http://www.jianghuimin.com/program/cplusplus/1483.html#comments</comments>
		<pubDate>Tue, 27 Dec 2011 08:11:21 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[规范]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1483</guid>
		<description><![CDATA[先阐述几个概念： 　　Pascal Case ：当标识符由两个或者两个以上单词组成的时候，单词之间不加其他的符号，并且每个单词首字母都必须大写，例如PascalCase。 　　camel Case: 当标识符由两个或者两个以上单词组成的时候，单词间不加其他的符号，并且第一个单词以小写开头，其他单词以大写开头。例如camelCase。 　　Unix/Linux变量命名方法：当程序由两个或两个以上单词组成的时候，单词都以小写开头，并且以_连接。  　　下面是Google C++编程规范的一些内容： 　　一、命名 　　　　1）普通变量：linux命名规范 。例如：string table_name; 　　　　2）常量： k+PascalCase。例如 const int kDayInAWeek = 7; 　　　　3）类私有成员： linux命名规范+_。 例如：int parament_count_; 　　　　4）普通函数命名：PascalCase。例如：AddTableEntry()。 　　　　5）存储函数：linux命名方法。例如： 　　　　　　　int num_entries() const {return num_entries_}; 　　　　　　　void set_num_entries(){int num_entries}; 　　　　6)枚举：值为全大写组成的单词，单词以_分割。例如MY_ENUM_VALUE 　　　　7)类名、结构名：PascalCase 　　二、函数参数 　　　　输入参数在钱，输出参数在后。 　　三、头文件排序 　　　　C系统头文件 　　　　C++系统头文件 　　　　其他库头文件 　　　　本项目内头文件 　　四、文件注释 　　　　1、创建时间  作者 　　　　2、修改时间  修改人   修改函数列表 　　　　3、头文件中，首先生命该类的作用，对函数的用法作简单说明 　　五、其他约定 　　　　1、每行不要超过80个字符，包含长路径或者头文件保护的情况除外； 　　　　2、设定编辑器将tab转换为空格，最好为4个空格； 　　　　3、空循环体使用{}、continue，而不是一个分号； 　　　　4、不要使用匈牙利命名法。]]></description>
			<content:encoded><![CDATA[<p>先阐述几个概念：</p>
<p><strong>　　Pascal Case </strong>：当标识符由两个或者两个以上单词组成的时候，单词之间不加其他的符号，并且每个单词首字母都必须大写，例如PascalCase。</p>
<p><strong>　　camel Case</strong>: 当标识符由两个或者两个以上单词组成的时候，单词间不加其他的符号，并且第一个单词以小写开头，其他单词以大写开头。例如camelCase。</p>
<p>　　<strong>Unix/Linux变量命名方法</strong>：当程序由两个或两个以上单词组成的时候，单词都以小写开头，并且以_连接。 </p>
<p>　　下面是Google C++编程规范的一些内容：</p>
<p><strong>　　一、命名</strong></p>
<p>　　　　1）普通变量：linux命名规范 。例如：string table_name;</p>
<p>　　　　2）常量： k+PascalCase。例如 const int kDayInAWeek = 7;</p>
<p>　　　　3）类私有成员： linux命名规范+_。 例如：int parament_count_;</p>
<p>　　　　4）普通函数命名：PascalCase。例如：AddTableEntry()。</p>
<p>　　　　5）存储函数：linux命名方法。例如：</p>
<p>　　　　　　　int num_entries() const {return num_entries_};</p>
<p>　　　　　　　void set_num_entries(){int num_entries};</p>
<p>　　　　6)枚举：值为全大写组成的单词，单词以_分割。例如MY_ENUM_VALUE</p>
<p>　　　　7)类名、结构名：PascalCase</p>
<p>　<strong>　二、函数参数</strong></p>
<p>　　　　输入参数在钱，输出参数在后。</p>
<p>　<strong>　三、头文件排序</strong></p>
<p>　　　　C系统头文件</p>
<p>　　　　C++系统头文件</p>
<p>　　　　其他库头文件</p>
<p>　　　　本项目内头文件</p>
<p><strong>　　四、文件注释</strong></p>
<p>　　　　1、创建时间  作者</p>
<p>　　　　2、修改时间  修改人   修改函数列表</p>
<p>　　　　3、头文件中，首先生命该类的作用，对函数的用法作简单说明</p>
<p><strong>　　五、其他约定</strong></p>
<p>　　　　1、每行不要超过80个字符，包含长路径或者头文件保护的情况除外；</p>
<p>　　　　2、设定编辑器将tab转换为空格，最好为4个空格；</p>
<p>　　　　3、空循环体使用{}、continue，而不是一个分号；</p>
<p>　　　　4、不要使用匈牙利命名法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/cplusplus/1483.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>zxing二维码条码扫描横屏landscape转竖屏portrait</title>
		<link>http://www.jianghuimin.com/program/java/1476.html</link>
		<comments>http://www.jianghuimin.com/program/java/1476.html#comments</comments>
		<pubDate>Thu, 22 Dec 2011 08:21:38 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[andoird]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[zxing]]></category>
		<category><![CDATA[二维码]]></category>
		<category><![CDATA[横屏]]></category>
		<category><![CDATA[竖屏]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1476</guid>
		<description><![CDATA[zxing包默认是横屏扫描一维条码，用户体验上不是很方便需要换手翻转手机。 这两天查了查相关资料，解决方法如下： 1.在DecodeHandler.java中，修改decode方法 PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height); 为 byte[] rotatedData = new byte[data.length]; for (int y = 0; y &#60; height; y++) { for (int x = 0; x &#60; width; x++) rotatedData[x * height + height - y - 1] = data[x + y * width]; } int tmp = width; // [...]]]></description>
			<content:encoded><![CDATA[<p>zxing包默认是横屏扫描一维条码，用户体验上不是很方便需要换手翻转手机。</p>
<p>这两天查了查相关资料，解决方法如下：<br />
<span id="more-1476"></span><br />
<strong>1.在DecodeHandler.java中，修改decode方法</strong><br />
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);<br />
为<br />
byte[] rotatedData = new byte[data.length];<br />
for (int y = 0; y &lt; height; y++) {<br />
for (int x = 0; x &lt; width; x++)<br />
rotatedData[x * height + height - y - 1] = data[x + y * width];<br />
}<br />
int tmp = width; // Here we are swapping, that's the difference to #11<br />
width = height;<br />
height = tmp;</p>
<p>PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);</p>
<p><strong>2.在CameraManager.java中，注释代码：</strong><br />
// rect.left = rect.left * cameraResolution.x / screenResolution.x;<br />
// rect.right = rect.right * cameraResolution.x / screenResolution.x;<br />
// rect.top = rect.top * cameraResolution.y / screenResolution.y;<br />
// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;<br />
修改为<br />
rect.left = rect.left * cameraResolution.y / screenResolution.x;<br />
rect.right = rect.right * cameraResolution.y / screenResolution.x;<br />
rect.top = rect.top * cameraResolution.x / screenResolution.y;<br />
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;</p>
<p><strong>3.在CameraConfigurationManager.java中，在setDesiredCameraParameters方法中添加一句</strong><br />
camera.setDisplayOrientation(90);</p>
<p><strong>4.在AndroidManifest.xml中，把Activity的属性android:screenOrientation="landscape"</strong><br />
改为<br />
android:screenOrientation="portrait"</p>
<p>编译运行即可！</p>
<p><strong>5.修改取景框大小</strong><br />
在CameraManager.java中，把getFramingRect()方法中</p>
<p>//framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);<br />
为<br />
framingRect = new Rect(0, topOffset, leftOffset+leftOffset + width, topOffset + height);</p>
<p>参考：</p>
<p>http://code.google.com/p/zxing/issues/detail?id=178#c46</p>
<p>http://rayln.iteye.com/blog/1221006</p>
<p>http://apps.hi.baidu.com/share/detail/48397442</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/java/1476.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ThinkPHP表单令牌验证功能,表单令牌错误</title>
		<link>http://www.jianghuimin.com/program/php/1457.html</link>
		<comments>http://www.jianghuimin.com/program/php/1457.html#comments</comments>
		<pubDate>Mon, 28 Nov 2011 14:52:30 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[令牌验证]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1457</guid>
		<description><![CDATA[用thinkphp编写的带有form表单的页面，如果你打开两次同一个表单，以第一次找开的提交信息，他就会提示你“表单令牌错误”的信息！ 解决办法： 官方文档上的很详细了！ ThinkPHP新版内置了表单令牌验证功能，可以有效防止表单的远程提交等安全防护。 表单令牌验证相关的配置参数有： 'TOKEN_ON'=&#62;true,  // 是否开启令牌验证 'TOKEN_NAME'=&#62;'__hash__',    // 令牌验证的表单隐藏字段名称 'TOKEN_TYPE'=&#62;'md5',  //令牌哈希验证规则 默认为MD5 如果开启表单令牌验证功能，系统会自动在带有表单的模板文件里面自动生成以TOKEN_NAME为名称的隐藏域，其值则是TOKEN_TYPE方式生成的哈希字符串，用于实现表单的自动令牌验证。 自动生成的隐藏域位于表单Form结束标志之前，如果希望自己控制隐藏域的位置，可以手动在表单页面添加{__TOKEN__} 标识，系统会在输出模板的时候自动替换。如果在开启表单令牌验证的情况下，个别表单不需要使用令牌验证功能，可以在表单页面添加{__NOTOKEN__}，则系统会忽略当前表单的令牌验证。 如果页面中存在多个表单，建议添加{__TOKEN__}标识，并确保只有一个表单需要令牌验证。 模型类在创建数据对象的同时会自动进行表单令牌验证操作，如果你没有使用create方法创建数据对象的话，则需要手动调用模型的autoCheckToken方法进行表单令牌验证。如果返回false，则表示表单令牌验证错误。例如： $User = M("User"); // 实例化User对象 // 手动进行令牌验证 if (!$User-&#62;autoCheckToken($_POST)){ // 令牌验证错误 } &#160; 下面看一下它是怎么生成的，如果你开启了表单令牌。 /core/model.class.php // 自动表单令牌验证     public function autoCheckToken($data) {         $name   = C('TOKEN_NAME');         if(isset($_SESSION[$name])) {             // 当前需要令牌验证             if(empty($data[$name]) &#124;&#124; $_SESSION[$name] != $data[$name]) {                 // 非法提交                 return false;             }             // [...]]]></description>
			<content:encoded><![CDATA[<p>用thinkphp编写的带有form表单的页面，如果你打开两次同一个表单，以第一次找开的提交信息，他就会提示你“表单令牌错误”的信息！</p>
<p>解决办法：<br />
<span id="more-1457"></span><br />
官方文档上的很详细了！</p>
<p>ThinkPHP新版内置了表单令牌验证功能，可以有效防止表单的远程提交等安全防护。</p>
<p>表单令牌验证相关的配置参数有：</p>
<p>'TOKEN_ON'=&gt;true,  // 是否开启令牌验证</p>
<p>'TOKEN_NAME'=&gt;'__hash__',    // 令牌验证的表单隐藏字段名称</p>
<p>'TOKEN_TYPE'=&gt;'md5',  //令牌哈希验证规则 默认为MD5</p>
<p>如果开启表单令牌验证功能，系统会自动在带有表单的模板文件里面自动生成以TOKEN_NAME为名称的隐藏域，其值则是TOKEN_TYPE方式生成的哈希字符串，用于实现表单的自动令牌验证。</p>
<p>自动生成的隐藏域位于表单Form结束标志之前，如果希望自己控制隐藏域的位置，可以手动在表单页面添加{__TOKEN__} 标识，系统会在输出模板的时候自动替换。如果在开启表单令牌验证的情况下，个别表单不需要使用令牌验证功能，可以在表单页面添加{__NOTOKEN__}，则系统会忽略当前表单的令牌验证。</p>
<p><strong>如果页面中存在多个表单，建议添加{__TOKEN__}标识，并确保只有一个表单需要令牌验证。</strong></p>
<p>模型类在创建数据对象的同时会自动进行表单令牌验证操作，如果你没有使用create方法创建数据对象的话，则需要手动调用模型的autoCheckToken方法进行表单令牌验证。如果返回false，则表示表单令牌验证错误。例如：</p>
<p>$User = M("User"); // 实例化User对象</p>
<p>// 手动进行令牌验证</p>
<p>if (!$User-&gt;autoCheckToken($_POST)){</p>
<p>// 令牌验证错误</p>
<p>}</p>
<p>&nbsp;</p>
<p>下面看一下它是怎么生成的，如果你开启了表单令牌。</p>
<p>/core/model.class.php</p>
<p>// 自动表单令牌验证<br />
    public function autoCheckToken($data) {<br />
        $name   = C('TOKEN_NAME');<br />
        if(isset($_SESSION[$name])) {<br />
            // 当前需要令牌验证<br />
            if(empty($data[$name]) || $_SESSION[$name] != $data[$name]) {<br />
                // 非法提交<br />
                return false;<br />
            }<br />
            // 验证完成销毁session<br />
            unset($_SESSION[$name]);<br />
        }<br />
        return true;<br />
    }</p>
<p>表单令牌是由下面的代码生成的。</p>
<p>/core/view.class.php</p>
<p>/**<br />
     +----------------------------------------------------------<br />
     * 创建表单令牌隐藏域<br />
     +----------------------------------------------------------<br />
     * @access private<br />
     +----------------------------------------------------------<br />
     * @return string<br />
     +----------------------------------------------------------<br />
     */<br />
    private function buildFormToken() {<br />
        // 开启表单验证自动生成表单令牌<br />
        $tokenName   = C('TOKEN_NAME');<br />
        $tokenType = C('TOKEN_TYPE');<br />
        $tokenValue = $tokenType(microtime(TRUE));<br />
        $token   =  '&lt;input type="hidden" name="'.$tokenName.'" value="'.$tokenValue.'" /&gt;';<br />
        $_SESSION[$tokenName]  =  $tokenValue;<br />
        return $token;<br />
    }<br />
————————————————————<br />
microtime -- 返回当前 Unix 时间戳和微秒数<br />
说明mixed <strong>microtime</strong> ( [bool get_as_float] )</p>
<p><strong>microtime()</strong> 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。</p>
<p>如果调用时不带可选参数，本函数以 "msec sec" 的格式返回一个字符串，其中 sec 是自 Unix 纪元（0:00:00 January 1, 1970 GMT）起到现在的秒数，msec 是微秒部分。字符串的两部分都是以秒为单位返回的。</p>
<p>如果给出了 get_as_float 参数并且其值等价于 <strong>TRUE</strong>，<strong>microtime()</strong> 将返回一个浮点数。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/php/1457.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP如何处理jquery post过来的$(&#039;#form&#039;).serialize()数据</title>
		<link>http://www.jianghuimin.com/program/php/1453.html</link>
		<comments>http://www.jianghuimin.com/program/php/1453.html#comments</comments>
		<pubDate>Mon, 28 Nov 2011 13:20:56 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[serialize]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1453</guid>
		<description><![CDATA[如果你使用jquery的form表单中serialize提交数据到后台，例如：$('#form').serialize()。在php处理端你不用任何处理，跟普通的from提交一样，使用$_GET[‘varname’]或$_POST[‘varname’]就能取到数据。 &#160; jquery里form的serialize实际是只是把表单中的数据组装成"varname=val&#38;var2=val2"这种样子，看到这个你应该知道PHP端不需要处理了吧。]]></description>
			<content:encoded><![CDATA[<p>如果你使用jquery的form表单中serialize提交数据到后台，例如：$('#form').serialize()。在php处理端你不用任何处理，跟普通的from提交一样，使用$_GET[‘varname’]或$_POST[‘varname’]就能取到数据。</p>
<p>&nbsp;</p>
<p>jquery里form的serialize实际是只是把表单中的数据组装成"varname=val&amp;var2=val2"这种样子，看到这个你应该知道PHP端不需要处理了吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/php/1453.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP获取操作系统和浏览器信息</title>
		<link>http://www.jianghuimin.com/program/php/1437.html</link>
		<comments>http://www.jianghuimin.com/program/php/1437.html#comments</comments>
		<pubDate>Sat, 26 Nov 2011 02:23:09 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1437</guid>
		<description><![CDATA[ //以下代码实现从客户端获取IP，操作系统，浏览器的信息 class clientGetObj //类 {  function getBrowse() //取浏览器版本函数  {   global $_SERVER;   if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 8.0"))   return "Internet Explorer 8.0";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 7.0"))   return "Internet Explorer 7.0";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 6.0"))   return "Internet Explorer 6.0";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/3"))   return "Firefox 3";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/2"))   return "Firefox 2";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome"))   return "Google Chrome";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"Safari"))   return "Safari";   else if(strpos($_SERVER["HTTP_USER_AGENT"],"Opera"))   return "Opera";   else [...]]]></description>
			<content:encoded><![CDATA[<pre class="”brush:[php]&quot;"> //以下代码实现从客户端获取IP，操作系统，浏览器的信息
class clientGetObj //类
{
 function getBrowse() //取浏览器版本函数
 {
  global $_SERVER;

  if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 8.0"))
  return "Internet Explorer 8.0";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 7.0"))
  return "Internet Explorer 7.0";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 6.0"))
  return "Internet Explorer 6.0";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/3"))
  return "Firefox 3";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/2"))
  return "Firefox 2";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome"))
  return "Google Chrome";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"Safari"))
  return "Safari";
  else if(strpos($_SERVER["HTTP_USER_AGENT"],"Opera"))
  return "Opera";
  else return "未知";

 }
 function getIP () //取IP函数
 {
  global $_SERVER;
  if (getenv('HTTP_CLIENT_IP')) {
   $ip = getenv('HTTP_CLIENT_IP');
  } else if (getenv('HTTP_X_FORWARDED_FOR')) {
   $ip = getenv('HTTP_X_FORWARDED_FOR');
  } else if (getenv('REMOTE_ADDR')) {
   $ip = getenv('REMOTE_ADDR');
  } else {
   $ip = $_SERVER['REMOTE_ADDR'];
  }
  return $ip;
 }

 function getOS () //取操作系统类型函数
 {
  global $_SERVER;
  $agent = $_SERVER['HTTP_USER_AGENT'];
  $os = false;
  if (eregi('win', $agent) &amp;&amp; strpos($agent, '95')){
   $os = 'Windows 95';
  }
  else if (eregi('win 9x', $agent) &amp;&amp; strpos($agent, '4.90')){
   $os = 'Windows ME';
  }
  else if (eregi('win', $agent) &amp;&amp; ereg('98', $agent)){
   $os = 'Windows 98';
  }
  else if (eregi('win', $agent) &amp;&amp; eregi('nt 5.1', $agent)){
   $os = 'Windows XP';
  }
  else if (eregi('win', $agent) &amp;&amp; eregi('nt 5', $agent)){
   $os = 'Windows 2000';
  }
  else if (eregi('win', $agent) &amp;&amp; eregi('nt', $agent)){
   $os = 'Windows NT';
  }
  else if (eregi('win', $agent) &amp;&amp; ereg('32', $agent)){
   $os = 'Windows 32';
  }
  else if (eregi('linux', $agent)){
   $os = 'Linux';
  }
  else if (eregi('unix', $agent)){
   $os = 'Unix';
  }
  else if (eregi('sun', $agent) &amp;&amp; eregi('os', $agent)){
   $os = 'SunOS';
  }
  else if (eregi('ibm', $agent) &amp;&amp; eregi('os', $agent)){
   $os = 'IBM OS/2';
  }
  else if (eregi('Mac', $agent) &amp;&amp; eregi('PC', $agent)){
   $os = 'Macintosh';
  }
  else if (eregi('PowerPC', $agent)){
   $os = 'PowerPC';
  }
  else if (eregi('AIX', $agent)){
   $os = 'AIX';
  }
  else if (eregi('HPUX', $agent)){
   $os = 'HPUX';
  }
  else if (eregi('NetBSD', $agent)){
   $os = 'NetBSD';
  }
  else if (eregi('BSD', $agent)){
   $os = 'BSD';
  }
  else if (ereg('OSF1', $agent)){
   $os = 'OSF1';
  }
  else if (ereg('IRIX', $agent)){
   $os = 'IRIX';
  }
  else if (eregi('FreeBSD', $agent)){
   $os = 'FreeBSD';
  }
  else if (eregi('teleport', $agent)){
   $os = 'teleport';
  }
  else if (eregi('flashget', $agent)){
   $os = 'flashget';
  }
  else if (eregi('webzip', $agent)){
   $os = 'webzip';
  }
  else if (eregi('offline', $agent)){
   $os = 'offline';
  }
  else {
   $os = 'Unknown';
  }
  return $os;
 }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/php/1437.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php 输出汉字png GD显示中文</title>
		<link>http://www.jianghuimin.com/program/php/1427.html</link>
		<comments>http://www.jianghuimin.com/program/php/1427.html#comments</comments>
		<pubDate>Sat, 26 Nov 2011 02:10:20 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[GD]]></category>
		<category><![CDATA[PNG]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1427</guid>
		<description><![CDATA[php输出图片可以适用GD组件来进行。 输出英文字母使用 imagestring — 水平地画一行字符串。 &#60;?php // 建立一幅 100X30 的图像 $im = imagecreate(100, 30); // 白色背景和蓝色文本 $bg = imagecolorallocate($im, 255, 255, 255); $textcolor = imagecolorallocate($im, 0, 0, 255); // 把字符串写在图像左上角 imagestring($im, 5, 0, 0, "Hello world! ", $textcolor); // 输出图像 header("Content-type: image/png"); imagepng($im); ?&#62; 输出中文的时候就不行了，下面的代码就只能输出英文。 &#60;?php // 建立一幅 100X30 的图像 $im = imagecreate(100, 30); // [...]]]></description>
			<content:encoded><![CDATA[<p>php输出图片可以适用GD组件来进行。</p>
<p>输出英文字母使用 imagestring — 水平地画一行字符串。</p>
<p>&lt;?php<br />
// 建立一幅 100X30 的图像<br />
$im = imagecreate(100, 30);</p>
<p>// 白色背景和蓝色文本<br />
$bg = imagecolorallocate($im, 255, 255, 255);<br />
$textcolor = imagecolorallocate($im, 0, 0, 255);</p>
<p>// 把字符串写在图像左上角<br />
imagestring($im, 5, 0, 0, "Hello world! ", $textcolor);</p>
<p>// 输出图像<br />
header("Content-type: image/png");<br />
imagepng($im);<br />
?&gt;</p>
<p>输出中文的时候就不行了，下面的代码就只能输出英文。</p>
<p>&lt;?php<br />
// 建立一幅 100X30 的图像<br />
$im = imagecreate(100, 30);</p>
<p>// 白色背景和蓝色文本<br />
$bg = imagecolorallocate($im, 255, 255, 255);<br />
$textcolor = imagecolorallocate($im, 0, 0, 255);</p>
<p>// 把字符串写在图像左上角<br />
imagestring($im, 5, 0, 0, "Hello world! 你好", $textcolor);</p>
<p>// 输出图像<br />
header("Content-type: image/png");<br />
imagepng($im);<br />
?&gt;</p>
<p>&nbsp;</p>
<p>翻了下PHP手册，有时候手册是很强大的，就好比闲来无事翻字典，你会多认识好多字一样。</p>
<p>imagettftext — 用 TrueType 字体向图像写入文本，可以先导入中文字体在输出。</p>
<p>&lt;?php<br />
// Set the content-type<br />
header("Content-type: image/png");</p>
<p>// Create the image<br />
$im = imagecreatetruecolor(400, 30);</p>
<p>// Create some colors<br />
$white = imagecolorallocate($im, 255, 255, 255);<br />
$grey = imagecolorallocate($im, 128, 128, 128);<br />
$black = imagecolorallocate($im, 0, 0, 0);<br />
imagefilledrectangle($im, 0, 0, 399, 29, $white);</p>
<p>// The text to draw<br />
$text = 'Testing...测试';<br />
// Replace path by your own font path<br />
$font = 'yh.ttf';</p>
<p>// Add some shadow to the text<br />
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);</p>
<p>// Add the text<br />
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);</p>
<p>// Using imagepng() results in clearer text compared with imagejpeg()<br />
imagepng($im);<br />
imagedestroy($im);<br />
?&gt;</p>
<p>效果</p>
<p><a href="http://www.jianghuimin.com/wp-content/uploads/2011/11/QQ截图20111126101231.jpg"><img class="alignnone size-full wp-image-1428" title="QQ截图20111126101231" src="http://www.jianghuimin.com/wp-content/uploads/2011/11/QQ截图20111126101231.jpg" alt="" width="241" height="57" /></a></p>
<p>&nbsp;</p>
<p>但要保证php文件是以utf8格式保存的，不然会输出如下乱码,</p>
<p>本函数同时需要 GD 库和  FreeType 库。</p>
<p><a href="http://www.jianghuimin.com/wp-content/uploads/2011/11/QQ截图20111126101452.jpg"><img class="alignnone size-full wp-image-1432" title="QQ截图20111126101452" src="http://www.jianghuimin.com/wp-content/uploads/2011/11/QQ截图20111126101452.jpg" alt="" width="202" height="63" /></a></p>
<p>原因应该是内部进行了utf8和gbk转码工作，等有机会我再细分析下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/php/1427.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>yahoo finance  API f参数对照表</title>
		<link>http://www.jianghuimin.com/program/php/1414.html</link>
		<comments>http://www.jianghuimin.com/program/php/1414.html#comments</comments>
		<pubDate>Fri, 25 Nov 2011 05:00:36 +0000</pubDate>
		<dc:creator>mood</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.jianghuimin.com/?p=1414</guid>
		<description><![CDATA[1、通过API获取实时数据 请求地址 http://finance.yahoo.com/d/quotes.csv?s=&#60;股票名称&#62;&#38;f=&#60;数据列选项&#62; 参数 s – 表示股票名称，多个股票之间使用英文加号分隔，如”XOM+BBDb.TO+JNJ+MSFT”，罗列了四个公司的股票：XOM, BBDb.TO, JNJ, MSFT。 f – 表示返回数据列，如”snd1l1yr”。更详细的参见下表 例如 汇率API http://download.finance.yahoo.com/d/quotes.html?s=USDCNY=X&#38;f=sl1d1t1ba&#38;e=.html 2、通过API获取历史数据 请求地址 http://ichart.yahoo.com/table.csv?s=&#60;string&#62;&#38;a=&#60;int&#62;&#38;b=&#60;int&#62;&#38;c=&#60;int&#62;&#38;d=&#60;int&#62;&#38;e=&#60;int&#62;&#38;f=&#60;int&#62;&#38;g=d&#38;ignore=.csv 参数 s – 股票名称 a – 起始时间，月 b – 起始时间，日 c – 起始时间，年 d – 结束时间，月 e – 结束时间，日 f – 结束时间，年 g – 时间周期。Example: g=w, 表示周期是’周’。d-&#62;’日’(day), w-&#62;’周’(week)，m-&#62;’月’(mouth)，v-&#62;’dividends only’ 一定注意月份参数，其值比真实数据-1。如需要9月数据，则写为08。 3、通过API获取深沪股票数据 雅虎的API是国际性的，支持查询国内沪深股市的数据，但代码稍微变动一下，如浦发银行的代号是：600000.SS。规则是：上海市场末尾加.ss，深圳市场末尾加.sz a Ask a2 Average [...]]]></description>
			<content:encoded><![CDATA[<p>1、通过API获取实时数据</p>
<p>请求地址</p>
<blockquote><p>http://finance.yahoo.com/d/quotes.csv?s=&lt;股票名称&gt;&amp;f=&lt;数据列选项&gt;</p></blockquote>
<p>参数</p>
<ul class="noindent">
<li>s – 表示股票名称，多个股票之间使用英文加号分隔，如”XOM+BBDb.TO+JNJ+MSFT”，罗列了四个公司的股票：XOM, BBDb.TO, JNJ, MSFT。</li>
<li>f – 表示返回数据列，如”snd1l1yr”。更详细的参见下表</li>
</ul>
<p>例如 汇率API</p>
<p><a title="汇率API" href="http://download.finance.yahoo.com/d/quotes.html?s=USDCNY=X&amp;f=sl1d1t1ba&amp;e=.html" target="_blank">http://download.finance.yahoo.com/d/quotes.html?s=USDCNY=X&amp;f=sl1d1t1ba&amp;e=.html</a></p>
<p>2、通过API获取历史数据</p>
<p>请求地址</p>
<blockquote><p>http://ichart.yahoo.com/table.csv?s=&lt;string&gt;&amp;a=&lt;int&gt;&amp;b=&lt;int&gt;&amp;c=&lt;int&gt;&amp;d=&lt;int&gt;&amp;e=&lt;int&gt;&amp;f=&lt;int&gt;&amp;g=d&amp;ignore=.csv</p></blockquote>
<p>参数</p>
<ul class="noindent">
<li>s – 股票名称</li>
<li>a – 起始时间，月</li>
<li>b – 起始时间，日</li>
<li>c – 起始时间，年</li>
<li>d – 结束时间，月</li>
<li>e – 结束时间，日</li>
<li>f – 结束时间，年</li>
<li>g – 时间周期。Example: g=w, 表示周期是’周’。d-&gt;’日’(day), w-&gt;’周’(week)，m-&gt;’月’(mouth)，v-&gt;’dividends only’</li>
</ul>
<p>一定注意月份参数，其值比真实数据-1。如需要9月数据，则写为08。</p>
<p>3、通过API获取深沪股票数据</p>
<p>雅虎的API是国际性的，支持查询国内沪深股市的数据，但代码稍微变动一下，如浦发银行的代号是：600000.SS。规则是：上海市场末尾加.ss，深圳市场末尾加.sz</p>
<table border="1">
<tbody>
<tr>
<td><strong>a</strong></td>
<td><span style="font-family: times;">Ask</span></td>
<td><span style="font-family: courier;"><strong>a2</strong></span></td>
<td><span style="font-family: times;">Average Daily Volume</span></td>
<td><span style="font-family: courier;"><strong>a5</strong></span></td>
<td><span style="font-family: times;">Ask Size</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>b</strong></span></td>
<td><span style="font-family: times;">Bid</span></td>
<td><span style="font-family: courier;"><strong>b2</strong></span></td>
<td><span style="font-family: times;">Ask (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>b3</strong></span></td>
<td><span style="font-family: times;">Bid (Real-time)</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>b4</strong></span></td>
<td><span style="font-family: times;">Book Value</span></td>
<td><span style="font-family: courier;"><strong>b6</strong></span></td>
<td><span style="font-family: times;">Bid Size</span></td>
<td><span style="font-family: courier;"><strong>c</strong></span></td>
<td><span style="font-family: times;">Change &amp; Percent Change</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>c1</strong></span></td>
<td><span style="font-family: times;">Change</span></td>
<td><span style="font-family: courier;"><strong>c3</strong></span></td>
<td><span style="font-family: times;">Commission</span></td>
<td><span style="font-family: courier;"><strong>c6</strong></span></td>
<td><span style="font-family: times;">Change (Real-time)</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>c8</strong></span></td>
<td><span style="font-family: times;">After Hours Change (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>d</strong></span></td>
<td><span style="font-family: times;">Dividend/Share</span></td>
<td><span style="font-family: courier;"><strong>d1</strong></span></td>
<td><span style="font-family: times;">Last Trade Date</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>d2</strong></span></td>
<td><span style="font-family: times;">Trade Date</span></td>
<td><span style="font-family: courier;"><strong>e</strong></span></td>
<td><span style="font-family: times;">Earnings/Share</span></td>
<td><span style="font-family: courier;"><strong>e1</strong></span></td>
<td><span style="font-family: times;">Error Indication (returned for symbol changed / invalid)</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>e7</strong></span></td>
<td><span style="font-family: times;">EPS Estimate Current Year</span></td>
<td><span style="font-family: courier;"><strong>e8</strong></span></td>
<td><span style="font-family: times;">EPS Estimate Next Year</span></td>
<td><span style="font-family: courier;"><strong>e9</strong></span></td>
<td><span style="font-family: times;">EPS Estimate Next Quarter</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>f6</strong></span></td>
<td><span style="font-family: times;">Float Shares</span></td>
<td><span style="font-family: courier;"><strong>g</strong></span></td>
<td><span style="font-family: times;">Day’s Low</span></td>
<td><span style="font-family: courier;"><strong>h</strong></span></td>
<td><span style="font-family: times;">Day’s High</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>j</strong></span></td>
<td><span style="font-family: times;">52-week Low</span></td>
<td><span style="font-family: courier;"><strong>k</strong></span></td>
<td><span style="font-family: times;">52-week High</span></td>
<td><span style="font-family: courier;"><strong>g1</strong></span></td>
<td><span style="font-family: times;">Holdings Gain Percent</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>g3</strong></span></td>
<td><span style="font-family: times;">Annualized Gain</span></td>
<td><span style="font-family: courier;"><strong>g4</strong></span></td>
<td><span style="font-family: times;">Holdings Gain</span></td>
<td><span style="font-family: courier;"><strong>g5</strong></span></td>
<td><span style="font-family: times;">Holdings Gain Percent (Real-time)</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>g6</strong></span></td>
<td><span style="font-family: times;">Holdings Gain (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>i</strong></span></td>
<td><span style="font-family: times;">More Info</span></td>
<td><span style="font-family: courier;"><strong>i5</strong></span></td>
<td><span style="font-family: times;">Order Book (Real-time)</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>j1</strong></span></td>
<td><span style="font-family: times;">Market Capitalization</span></td>
<td><span style="font-family: courier;"><strong>j3</strong></span></td>
<td><span style="font-family: times;">Market Cap (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>j4</strong></span></td>
<td><span style="font-family: times;">EBITDA</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>j5</strong></span></td>
<td><span style="font-family: times;">Change From 52-week Low</span></td>
<td><span style="font-family: courier;"><strong>j6</strong></span></td>
<td><span style="font-family: times;">Percent Change From 52-week Low</span></td>
<td><span style="font-family: courier;"><strong>k1</strong></span></td>
<td><span style="font-family: times;">Last Trade (Real-time) With Time</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>k2</strong></span></td>
<td><span style="font-family: times;">Change Percent (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>k3</strong></span></td>
<td><span style="font-family: times;">Last Trade Size</span></td>
<td><span style="font-family: courier;"><strong>k4</strong></span></td>
<td><span style="font-family: times;">Change From 52-week High</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>k5</strong></span></td>
<td><span style="font-family: times;">Percebt Change From 52-week High</span></td>
<td><span style="font-family: courier;"><strong>l</strong></span></td>
<td><span style="font-family: times;">Last Trade (With Time)</span></td>
<td><span style="font-family: courier;"><strong>l1</strong></span></td>
<td><span style="font-family: times;">Last Trade (Price Only)</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>l2</strong></span></td>
<td><span style="font-family: times;">High Limit</span></td>
<td><span style="font-family: courier;"><strong>l3</strong></span></td>
<td><span style="font-family: times;">Low Limit</span></td>
<td><span style="font-family: courier;"><strong>m</strong></span></td>
<td><span style="font-family: times;">Day’s Range</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>m2</strong></span></td>
<td><span style="font-family: times;">Day’s Range (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>m3</strong></span></td>
<td><span style="font-family: times;">50-day Moving Average</span></td>
<td><span style="font-family: courier;"><strong>m4</strong></span></td>
<td><span style="font-family: times;">200-day Moving Average</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>m5</strong></span></td>
<td><span style="font-family: times;">Change From 200-day Moving Average</span></td>
<td><span style="font-family: courier;"><strong>m6</strong></span></td>
<td><span style="font-family: times;">Percent Change From 200-day Moving Average</span></td>
<td><span style="font-family: courier;"><strong>m7</strong></span></td>
<td><span style="font-family: times;">Change From 50-day Moving Average</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>m8</strong></span></td>
<td><span style="font-family: times;">Percent Change From 50-day Moving Average</span></td>
<td><span style="font-family: courier;"><strong>n</strong></span></td>
<td><span style="font-family: times;">Name</span></td>
<td><span style="font-family: courier;"><strong>n4</strong></span></td>
<td><span style="font-family: times;">Notes</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>o</strong></span></td>
<td><span style="font-family: times;">Open</span></td>
<td><span style="font-family: courier;"><strong>p</strong></span></td>
<td><span style="font-family: times;">Previous Close</span></td>
<td><span style="font-family: courier;"><strong>p1</strong></span></td>
<td><span style="font-family: times;">Price Paid</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>p2</strong></span></td>
<td><span style="font-family: times;">Change in Percent</span></td>
<td><span style="font-family: courier;"><strong>p5</strong></span></td>
<td><span style="font-family: times;">Price/Sales</span></td>
<td><span style="font-family: courier;"><strong>p6</strong></span></td>
<td><span style="font-family: times;">Price/Book</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>q</strong></span></td>
<td><span style="font-family: times;">Ex-Dividend Date</span></td>
<td><span style="font-family: courier;"><strong>r</strong></span></td>
<td><span style="font-family: times;">P/E Ratio</span></td>
<td><span style="font-family: courier;"><strong>r1</strong></span></td>
<td><span style="font-family: times;">Dividend Pay Date</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>r2</strong></span></td>
<td><span style="font-family: times;">P/E Ratio (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>r5</strong></span></td>
<td><span style="font-family: times;">PEG Ratio</span></td>
<td><span style="font-family: courier;"><strong>r6</strong></span></td>
<td><span style="font-family: times;">Price/EPS Estimate Current Year</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>r7</strong></span></td>
<td><span style="font-family: times;">Price/EPS Estimate Next Year</span></td>
<td><span style="font-family: courier;"><strong>s</strong></span></td>
<td><span style="font-family: times;">Symbol</span></td>
<td><span style="font-family: courier;"><strong>s1</strong></span></td>
<td><span style="font-family: times;">Shares Owned</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>s7</strong></span></td>
<td><span style="font-family: times;">Short Ratio</span></td>
<td><span style="font-family: courier;"><strong>t1</strong></span></td>
<td><span style="font-family: times;">Last Trade Time</span></td>
<td><span style="font-family: courier;"><strong>t6</strong></span></td>
<td><span style="font-family: times;">Trade Links</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>t7</strong></span></td>
<td><span style="font-family: times;">Ticker Trend</span></td>
<td><span style="font-family: courier;"><strong>t8</strong></span></td>
<td><span style="font-family: times;">1 yr Target Price</span></td>
<td><span style="font-family: courier;"><strong>v</strong></span></td>
<td><span style="font-family: times;">Volume</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>v1</strong></span></td>
<td><span style="font-family: times;">Holdings Value</span></td>
<td><span style="font-family: courier;"><strong>v7</strong></span></td>
<td><span style="font-family: times;">Holdings Value (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>w</strong></span></td>
<td><span style="font-family: times;">52-week Range</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>w1</strong></span></td>
<td><span style="font-family: times;">Day’s Value Change</span></td>
<td><span style="font-family: courier;"><strong>w4</strong></span></td>
<td><span style="font-family: times;">Day’s Value Change (Real-time)</span></td>
<td><span style="font-family: courier;"><strong>x</strong></span></td>
<td><span style="font-family: times;">Stock Exchange</span></td>
</tr>
<tr>
<td><span style="font-family: courier;"><strong>y</strong></span></td>
<td><span style="font-family: times;">Dividend Yield</span></td>
<td></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.jianghuimin.com/program/php/1414.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

