京东大峡谷一日游 (2011-06-06)

端午小长假,去了京东大峡谷
景色挺好,一路青山秀水,游客也比想象的少
湖水很绿,小溪的水很清,挺凉快的。还能看到很多蝌蚪和青蛙
景区一共有五个潭,都各自有特色
但里面的商业气息很浓,玩什么都是收费的,
还是自己走路最开心了,既然出来玩,就不选择做什么缆车索道之类的东西
要用自己双脚踏遍景区的所有地方
我们上了一个很陡峭的山路,那里不是一般人能上去的,所以上去的人很少
很多人选择了一条平坦山路,我们选择那条很陡的山路
幸运的是我们爬上去了!

网上说的坐车路线不对,第一次去找了好半天平12路,更正一下,
东直门做918快车到终点站,下车就能换乘平12路小公共直达,这才是最省钱最方便的线路

京东大峡谷 - 1

京东大峡谷 - 2

京东大峡谷 - 3
第一个湖的湖面

京东大峡谷 - 4
京东大峡谷 - 怪谭

京东大峡谷 - 5
小溪中有很多青蛙和蝌蚪

京东大峡谷 - 6
这就是那条很陡峭的山路,大概有75度,直上直下的

京东大峡谷 - 7
潭中漂流

京东大峡谷 - 8
京东大峡谷 - 铁索桥

点击查看原文阅读(568) | 评论(2) | 分类:我的日记

PHP生成PNG图片,文字换行问题,和解析XML中带有CDATA数据 (2011-05-30)

出院后我负责开发的应用马上就要上线了
开发几天遇到这样几个问题,都解决了,以后在遇到类似的问题就不会这么麻烦了
以下是我实际应用中写的几个函数,可以重复利用 :)

问题一:
图片通过GD库生成会出现文字漂白问题,或者不显示,调试浪费了我半天的时间
合成图片颜色是真问题,困扰我很久最后解决了
原来imagecreate不支持更多的色彩
imagecreatetruecolor解决了这个问题
本函数需要 GD 2.0.1 或更高版本(推荐 2.0.28 及更高版本)。
 

代码如下
  1.         /**
  2.          * @desc 创建结果图片
  3.          * @param
  4.          * @return file
  5.          */
  6.         public function create_userimg() {
  7.            
  8.                 $user_name = addslashes($this->input->get('name'));
  9.                 $user_name = urldecode($user_name);
  10.                 $user_score = (int)$this->input->get('score');
  11.                
  12.             if (preg_match("/^[x7f-xff]+$/", $user_name)) {
  13.                 $user_name_len =  mb_strlen($user_name);
  14.                     $user_name_len = ceil($user_name_len/3);
  15.                     $nickleft = 30+60*$user_name_len;
  16.                 }else{
  17.                     $user_name_len =  strlen($user_name);
  18.                    
  19.                     $nickleft = 120+13*$user_name_len;
  20.                 }                
  21.  
  22.                 $font = '.'.PATH_FONT.'/yahei.ttf';
  23.                 $font_kaiti = '.'.PATH_FONT.'/SIMLI.TTF';
  24.                 $size = 25;
  25.                
  26.                 //$bgimg = 'resource/default/images/lohas/result_bg.png';
  27.                 $bgimg = 'resource/default/images/shishang/result_show.png';
  28.                 $nick = 'resource/default/images/shishang/shishang_nick.png';
  29.                
  30.                 $im = @imagecreatetruecolor(506,432) or die("Cannot Initialize new GD image stream");
  31.         $white = imagecolorallocate( $im, 255, 255, 255 );
  32.         imagefill( $im, 0, 0, $white );
  33.             imagecopy($im, $this->Image, 0, 0, 0, 0, 506, 432);
  34.            
  35.                 $bgimg = imagecreatefrompng($bgimg);
  36.                 imagecopy($im,$bgimg,0,0,0,0,506,432);
  37.                
  38.                 $nick = imagecreatefrompng($nick);
  39.                 imagecopy($im,$nick,$nickleft,136,0,0,77,14);
  40.                
  41.                
  42.                 $green=imagecolorallocate($im,68,160,28);
  43.                 $hei=imagecolorallocate($im,0,0,0);
  44.                 $bai=imagecolorallocate($im,255,255,255);
  45.        
  46.                 if (preg_match("/^[x7f-xff]+$/", $user_name)) {
  47.                     imagettftext($im,'25',0,62,150,$hei,$font_kaiti,$user_name);
  48.                 }else{
  49.                     imagettftext($im,'21',0,62,150,$hei,$font,$user_name);
  50.                 }
  51.                
  52.                 imagettftext($im,'12',0,70,209,$green,$font,$text_1);
  53.                
  54.                 imagettftext($im,'11',0,170,238,$green,$font,$text_2);
  55.                
  56.                 imagettftext($im,'12',0,360,210,$green,$font,$score);
  57.                
  58.                 imagettftext($im,'11',0,95,237,$green,$font,$user_vs);
  59.                
  60.                 imagettftext($im,'10',0,330,340,$hei,$font,$date_text);
  61.  
  62.                
  63.        
  64.                 header("Content-type: image/png");
  65.                 imagepng($im);
  66.                 imagedestroy($im);
  67.         }


 
问题二:
PHP中文换行问题,因为文字要写在图片里,类似css的自动换行,
php对英文有wordwrap()函数支持换行,但不支持中文,下面函数解决了PHP中文换行问题

代码如下
  1. /**
  2.      * @desc GD库生成图片中文自动换行
  3.      * 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度
  4.      * */
  5.     public function autowrap($fontsize, $angle, $fontface, $string, $width) {
  6.         $content = "";
  7.  
  8.         // 将字符串拆分成一个个单字 保存到数组 letter 中
  9.         for ($i=0;$i<mb_strlen($string);$i++) {
  10.             $letter[] = mb_substr($string, $i, 1);
  11.         }
  12.        
  13.         foreach ($letter as $l) {
  14.             $teststr = $content."".$l;
  15.             $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
  16.             // 判断拼接后的字符串是否超过预设的宽度
  17.             if (($testbox[2] > $width) && ($content !== "")) {
  18.                 $content .= "n";
  19.             }
  20.             $content .= $l;
  21.         }
  22.        
  23.         $content = mb_convert_encoding($content, "html-entities","utf-8" );
  24.        
  25.         return $content;
  26.     }


问题三:
我在调用数据库接口的时候,取XML中的CDATA数据
解析XML中带有<!CDATA>问题,“  <name><![CDATA[Lois & Clark]]></name>”,
CDATA中的数据取不到值,simplexml_load_string函数解决问题
simplexml_load_string($response, SimpleXMLElement , LIBXML_NOCDATA);

代码如下
  1.  /**
  2.          * @desc CURL提交XML返回食材库XMl数据
  3.          * @param STRING XML
  4.          * @return XML
  5.          */
  6.     private function do_curl_post($xmldata){
  7.        
  8.             $url = SITE_URL.$this->shicai_interface;
  9.  
  10.             $header[] = "Content-type: text/xml";
  11.             $ch = curl_init();
  12.         curl_setopt($ch, CURLOPT_URL, $url);
  13.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  14.         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  15.         curl_setopt($ch, CURLOPT_POST, 1);
  16.         curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
  17.         $response = curl_exec($ch);
  18.         $response = simplexml_load_string($response, SimpleXMLElement , LIBXML_NOCDATA);
  19.  
  20.         if(curl_errno($ch)){
  21.             print curl_error($ch);
  22.         }
  23.         curl_close($ch);
  24.         return $response;
  25.         }


 

 

 

点击查看原文阅读(1069) | 评论(3) | 分类:PHP

出院 (2011-05-07)

前天终于从医院出来了,来博客看看
人生第一次住院 (4.13~5.4)住了半个多月
也算是经历过一次小坎坷了,今后还要吃一年的药
不过有了家人朋友和你的照顾,所以才恢复的这么快
特别谢谢你每次跋山涉水的来医院看我,平时还要工作,一定很疲惫了吧.
还给我送平时爱吃的东西,为我我剪指甲,刮胡子......照顾的太细致了
多亏了你的照顾现在我已经恢复的很好了,我今后也要好好照顾你,
这个五一也在医院里度过了,医院环境还可以,在医院里走了走
以后再也不要得病了,健康比什么都重要


北京老年医院-1

北京老年医院-2

北京老年医院-3

北京老年医院-4

北京老年医院-5  

点击查看原文阅读(698) | 评论(3) | 分类:我的日记

青龙湖烧烤 (2011-04-04)

放假前公司组织了一次游玩
去青龙湖,带上了N多烧烤的工具去那烧烤
我还烤了很多,烤比吃要有乐趣很多
回来之后腰酸腿疼的

青龙湖游玩-1

青龙湖游玩-2

青龙湖游玩-3

青龙湖游玩-4

点击查看原文阅读(714) | 评论(6) | 分类:我的日记

使用JSONP实现跨域通信 (2011-03-29)

简介

Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。

不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办?

理解同源策略限制

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。

克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据,并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用,但它是不可伸缩的。另一种方式是使用框架要素在当前 Web 页面中创建新区域,并且使用 GET 请求获取任何第三方资源。不过,获取资源后,框架中的内容会受到同源策略的限制。

克服该限制更理想方法是在 Web 页面中插入动态脚本元素,该页面源指向其他域中的服务 URL 并且在自身脚本中获取数据。脚本加载时它开始执行。该方法是可行的,因为同源策略不阻止动态脚本插入,并且将脚本看作是从提供 Web 页面的域上加载的。但如果该脚本尝试从另一个域上加载文档,就不会成功。幸运的是,通过添加 JavaScript Object Notation (JSON) 可以改进该技术。

JSON 和 JSONP

JSON 是用于在浏览器和服务器之间交换信息的轻量级数据格式(与 XML 相比)。JOSON 依赖于 JavaScript 开发人员,因为它是 JavaScript 对象的字符串表示。例如,假设有一个含两个属性的 ticker 对象:symbol 和 price。这是在 JavaScript 中定义 ticker 对象的方式:

var ticker = {symbol: 'IBM', price: 91.42};

并且这是它的 JSON 表示方式:

{symbol: 'IBM', price: 91.42}

参考资料 查找更多有关 JSON 和将其作为数据内部交换格式的信息。清单 1 定义了一个 JavaScript 函数,调用该函数时会显示 IBM 的股价。(我们没有详细介绍如何将该函数添加到 Web 页面)。


清单 1. 定义 showPrice 函数
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
                

可以将 JSON 数据作为参数传递,以调用该函数:

showPrice({symbol: 'IBM', price: 91.42}); // alerts: Symbol: IBM, Price: 91.42
                

现在准备将这两个步骤包含到 Web 页面,如清单 2 所示。


清单 2. 在 Web 页面中包含 showPrice 函数和参数
<script type="text/javascript">
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
</script>
<script type="text/javascript">showPrice({symbol: 'IBM', price: 91.42});</script>

加载页面后,应该看如图 1 所示的警告。


图 1. IBM ticker
IBM ticker

至此,本文已展示了如何将静态 JSON 数据作为参数调用 JavaScript 函数。不过,通过在函数调用中动态包装 JSON 数据可以用动态数据调用函数,这是一种动态 JavaScript 插入的技术。要查看其效果,将下面一行放入名为 ticker.js 的独立 JavaScript 文件中。

showPrice({symbol: 'IBM', price: 91.42});

现在改变 Web 页面中的脚本,使其和清单 3 一样。


清单 3. 动态 JavaScript 插入代码
<script type="text/javascript">
// This is our function to be called with JSON data
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
var url = “ticker.js”; // URL of the external script
// this shows dynamic script insertion
var script = document.createElement('script');
script.setAttribute('src', url);

// load the script
document.getElementsByTagName('head')[0].appendChild(script); 
</script>
				

在清单 3 所示的例子中,动态插入的 JavaScript 代码位于 ticker.js 文件中,它将真正的 JSON 数据作为参数调用 showPrice()函数。

前面已经提到,同源策略不阻止将动态脚本元素插入文档中。也就是说,可以动态插入来自不同域的 JavaScript,并且这些域都携带 JSON 数据。这其实是真正的 JSONP(JSON with Padding):打包在函数调用中的 JSON 数据。注意,为了完成该操作,Web 页面必须在插入时具有已经定义好的回调函数,也就是我们例子中的 showPrice()

不过,所谓的 JSONP 服务(或 Remote JSON Service)是一种带有附加功能的 Web 服务,该功能支持在特定于用户的函数调用中打包返回的 JSON 数据。这种方法依赖于接受回调函数名作为请求参数的远程服务。然后该服务生成对该函数的调用,将 JSON 数据作为参数传递,在到达客户端时将其插入 Web 页面并开始执行。


jQuery 的 JSONP 支持

从 1.2 版本开始,jQuery 拥有对 JSONP 回调的本地支持。如果指定了 JSONP 回调,就可以加载位于另一个域的 JSON 数据,回调的语法为:url?callback=?

jQuery 自动将 ? 替换为要调用的生成函数名。清单 4 显示了该代码。


清单 4. 使用 JSONP 回调
jQuery.getJSON(url+"&callback=?", function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
});

为此,jQuery 将一个全局函数附加到插入脚本时需要调用的窗口对象。另外,jQuery 也能优化非跨域调用。如果向同一个域发出请求,jQuery 就将其转化为普通 Ajax 请求。

使用 JSONP 支持的示例服务

在上一个例子中,使用了静态文件(ticker.js)将 JavaScript 动态插入到 Web 页面中。尽管返回了 JSONP 回复,但它不允许您在 URL 中定义回调函数名。这不是 JSONP 服务。因此,如何才能将其转换为真正的 JSONP 服务呢?可使用的方法很多。这里我们将分别使用 PHP 和 Java 展示两个示例。

首先,假设您的服务在所请求的 URL 中接受了一个名为 callback 的参数。(参数名不重要,但是客户和服务器必须都同意该名称)。另外假设向服务发送的请求是这样的:

http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=showPrice

在这种情况下,symbol 是表示请求 ticker symbol 的请求参数,而 callback 是 Web 应用程序的回调函数的名称。使用清单 5 所示的代码可以通过 jQuery 的 JSONP 支持调用该服务。


清单 5. 调用回调服务
jQuery.getJSON("http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=?", 
function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
});

注意,我们使用 ? 作为回调函数名,而非真实的函数名。因为 jQuery 会用生成的函数名替换 ?。所以您不用定义类似于 showPrice() 的函数。

清单 6 显示了用 PHP 实现的 JSONP 服务的一段代码。


清单 6. 用 PHP 实现的 JSONP 服务的代码片段
$jsonData = getDataAsJson($_GET['symbol']);
echo $_GET['callback'] . '(' . $jsonData . ');';
// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"});

清单 7 显示了具有同样功能的 Java™ Servlet 方法。


清单 7. 用 Java servlet 实现的 JSONP 服务
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
  throws ServletException, IOException {
	String jsonData = getDataAsJson(req.getParameter("symbol"));
	String output = req.getParameter("callback") + "(" + jsonData + ");";

	resp.setContentType("text/javascript");
          
	PrintWriter out = resp.getWriter();
	out.println(output);
	// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"});
}

那么,如果要构建 mashup 应该怎么办,是从第三方服务器收集内容,并在单一的 Web 页面中显示它们吗?答案很简单:您必须使用第三方 JSONP 服务。这种服务并不少。

现成的 JSONP 服务

知道如何使用 JSONP 之后,可以开始使用一些现成的 JSONP Web 服务来构建应用程序和 mashup。下面为接下来的开发项目做准备。(提示:您可以复制特定的 URL 并将其粘贴到浏览器的地址栏,以检查生成的 JSONP 响应)。

Digg API:来自 Digg 的头条新闻:

http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javascript
&callback=?

Geonames API:邮编的位置信息:

http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?

Flickr API:来自 Flickr 的最新猫图片:

http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any
&format=json&jsoncallback=?
                

Yahoo Local Search API:在邮编为 10504 的地区搜索比萨:

http://local.yahooapis.com/LocalSearchService/V3/localSearch?appid=YahooDemo&query=pizza
&zip=10504&results=2&output=json&callback=?


重要提示

JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。

JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。(参见 参考资料 了解更多信息)。

点击查看原文阅读(678) | 评论(0) | 分类:PHP