<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="http://paperen.com/rss" rel="self" type="application/rss+xml" /><title><![CDATA[ paperenblog]]></title><link><![CDATA[ http://paperen.com/]]></link><description><![CDATA[ 這是paperen的博客，對了，本站不完全支持IE6、7（並非歧視）]]></description><item><title><![CDATA[ 2026年3月6日]]></title><link><![CDATA[ http://paperen.com/post/2026-03-06]]></link><guid isPermaLink="false"><![CDATA[ 126]]></guid><pubDate><![CDATA[ 2026-03-07 16:30]]></pubDate><description><![CDATA[ <p>今天是2026年3月6日，距离上次写文章已过去1590天，已过去4年，4年好像又很快好像又很久，像水穿过手指缝隙一个不经意就过去。这次再次执笔写文并没有什么实在的目的，就是想趁着深更半夜写点什么，也许1590此时此刻对我来说是一个命运代码注定我今晚需要回头来写下这篇随笔。</p><br />
<br />
<p>这些年发生的事是不少的，新冠的3年、外婆去世、新居搬迁、阿根廷世界杯夺冠、人来人往，一旦把回忆开关打开那各种记忆片段像视频开10倍速翻江倒海扑面而来，低头一转眼就又拉回到现在，说来奇怪我对于过去并没有很清晰的记忆，仅仅有些大概，相对于有几个朋友他们总是能挖出过去什么时间什么地点跟谁做了什么，我觉得他们简直是超人般的存在，或者在他们看来我简直是金鱼般只有三秒的记忆，也正因这样，以至于在跟他们针锋相对讨论后，我总结出原因是在于自己是发展观而他们是历史观，当然这只是个开玩笑。</p><br />
<br />
<p>在聊到时间就不经意想要总结，总结走过的路，取得的成绩，就是总结自己经过时间冲蚀后跟4年前的我会有什么不同，这算不算是职业病的一种表现？敲打青轴键盘的啪啪声停顿许久，还在努力地思考究竟有什么不同？是真有不同吗？其实为什么非要有不同？物理年龄增加了4岁，心理年龄我觉得还是个小孩，这么描述下来算有点不认老的意思。花开花谢，一年四季，世界还是那个世界，我应该还是那个我不也很正常吗？肯定的一点是我不再跟自己过不去，我更加本我，很难说这是褒义还是贬义，应该也许可以用佛系来形容，我也不能说自己看透了许多，最后真心说自己有什么变化是很难的，也许问跟我打交道的人更合适不过。</p><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ Dcat-admin登录增加验证码（保姆级教程）]]></title><link><![CDATA[ http://paperen.com/post/dcat-admin-login-captcha-code]]></link><guid isPermaLink="false"><![CDATA[ 124]]></guid><pubDate><![CDATA[ 2021-10-28 11:11]]></pubDate><description><![CDATA[ <p>写在前面<br />
paperen这里使用的dcat-admin版本小于2.0，故不能直接使用<code>dcat-login-captcha</code>这个第三包实现<br />
对于2.0以上建议直接用<code>guanguans/dcat-login-captcha</code></p><br />
<br />
<p><a href="https://www.jianshu.com/p/1994a2659a7e" title="dcat-login-captcha - dcat admin 登录验证码扩展">dcat-login-captcha - dcat admin 登录验证码扩展</a></p><br />
<br />
<p>由于工作原因需要给dcat-admin登录页面增加一个验证码，一开始百度找了一些解决方案</p><br />
<br />
<p><a href="https://paperen.com/file/216" class="post-image thumbnail"><img src="https://paperen.com/file/216" alt="https://paperen.com/file/216" /></a></p><br />
<br />
<p><a href="https://learnku.com/articles/54206" title="记在dcat-admin中，登陆页面加验证码操作">记在dcat-admin中，登陆页面加验证码操作</a><br />
<a href="https://learnku.com/articles/23704" title="Laravel - 验证码">Laravel - 验证码</a></p><br />
<br />
<p>两个参考资料paperen都试了一下，最终基本按第一个方案实现出来，但其中踩过一些坑（花了有4、5个小时才弄出来）所以借此机会记录一下<br />
PS：这个真的是保姆级教程</p><br />
<br />
<h2>大致思路</h2><br />
<br />
<ul><br />
<li>通过路由重写原本的登录页面与登录验证入口——修改routes.php、完善AuthController</li><br />
<li>增加一个生成验证码的接口——需要给这个接口开放权限验证</li><br />
<li>验证码保存在session中，登录判断增加验证码对比<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 对于APP无法捉到接口请求解决办法]]></title><link><![CDATA[ http://paperen.com/post/uncatch-request-solution]]></link><guid isPermaLink="false"><![CDATA[ 123]]></guid><pubDate><![CDATA[ 2020-10-22 16:57]]></pubDate><description><![CDATA[ <p>工作需要分析某个APP的请求并爬取其图片数据，之前有用过<code>Fiddler</code>与<code>anyproxy</code>代理捉包，无论怎样一直没看到有请求接口的记录（只有请求图片的请求），很是奇怪，所以之前爬取的思路是通过模拟器+appium来弄的，效率甚是慢而且容易中断</p><br />
<br />
<p>今天再有空回来复盘一下，自己将模拟器的网络断掉清掉APP的缓存，再次打开app发现数据都没了，很确定其是走的接口拉取数据的，但是为什么捉不到其请求记录，我猜是因为APP不走代理发起接口请求，防止被捉包</p><br />
<br />
<p>paperen在网上遨游了一下，找到这篇文章 <a href="https://blog.csdn.net/weixin_30394333/article/details/99968748" title="部分APP无法代理抓包的原因及解决方法（flutter 应用抓包）">部分APP无法代理抓包的原因及解决方法（flutter 应用抓包）</a>，基本上是符合现在的情况了</p><br />
<br />
<p>解决方案：drony+代理</p><br />
<br />
<p><a href="https://files.cnblogs.com/files/lulianqi/Drony_102.apk">drony下载</a></p><br />
<br />
<p>配置参考下图<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ docker宿主无法访问容器端口]]></title><link><![CDATA[ http://paperen.com/post/docker-net-settings]]></link><guid isPermaLink="false"><![CDATA[ 122]]></guid><pubDate><![CDATA[ 2020-05-28 00:07]]></pubDate><description><![CDATA[ <p><a href="https://paperen.com/file/210" class="post-image thumbnail"><img src="https://paperen.com/file/210" alt="https://paperen.com/file/210" /></a></p><br />
<br />
<p>在VM中创建了一个centos7.2虚拟机并跑起docker搞个lnmp镜像玩一玩，一开始用的-p将宿主机端口映射一下（由于本来宿主机就跑着apache占用了80端口）</p><br />
<br />
<p>命令如下：</p><br />
<br />
<pre><br />
 docker run -dit -p 90:80 -v /home/web/docker/www:/www --privileged=true --name=lnmp 2233466866/lnmp<br />
</pre><br />
<br />
<p>跑倒是跑起来了，但奇怪的是打开浏览器访问虚拟机的IP+映射的端口（这里是90），却无法访问到nginx</p><br />
<br />
<p>于是就各种排查，netstat看过，防火墙通通都关了，在容器里面curl自身localhost是ok的，但奇怪的是在宿主机curl自身加映射好的端口号一点反映都没有</p><br />
<br />
<pre><br />
 [root@localhost ~]# curl http://localhost:90<br />
 curl: (56) Recv failure: Connection reset by peer<br />
</pre><br />
<br />
<p>然后也各种查资料<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ mkdocs+git打造自更新文档中心]]></title><link><![CDATA[ http://paperen.com/post/mkdocs]]></link><guid isPermaLink="false"><![CDATA[ 121]]></guid><pubDate><![CDATA[ 2020-03-08 09:40]]></pubDate><description><![CDATA[ <p>写在前面，如果您是有搭建私有文档平台的打算那么这篇文章是提供了一种方案，但如果仅仅用于内部分享或简单的短暂文档那paperen安利给你<a href="https://docs.qq.com" title="腾讯文档">腾讯文档</a>或<a href="https://www.showdoc.cc/" title="showdoc">showdoc</a></p><br />
<br />
<p>废话不多说，马上进入主题</p><br />
<br />
<p>目的：搭建一个对可使用个人域名，维护简单而且自动更新的文档站点</p><br />
<br />
<p>用到的组件/技术</p><br />
<br />
<ul><br />
<li>mkdocs</li><br />
<li>git hook</li><br />
<li>apache/nginx等（nginx会更合适）</li><br />
</ul><br />
<br />
<p>关于mkdocs（Markdown 项目文档工具）<a href="https://markdown-docs-zh.readthedocs.io/zh_CN/latest/" title="详细介绍">详细介绍</a><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 手工制作的polygon框架]]></title><link><![CDATA[ http://paperen.com/post/polygon-framework]]></link><guid isPermaLink="false"><![CDATA[ 120]]></guid><pubDate><![CDATA[ 2020-03-06 22:09]]></pubDate><description><![CDATA[ <p>这个小框架是paperen3年前就写了，但说来惭愧一直闭源同时模型层糟糕，最近抽空将模型层丰富与抽象了接近可用程度才敢拿出来开源，暂且给个0.0.1版本...</p><br />
<br />
<p>代码确实是一般般，但作为平时快速搭建与开发接口来说也还勉强够用，如各位大佬发现有什么可以改进的话或bug随时吐槽</p><br />
<br />
<p><a href="https://paperen.com/file/208" class="post-image thumbnail"><img src="https://paperen.com/file/208" alt="https://paperen.com/file/208" /></a></p><br />
<br />
<p>git地址：<a href="https://github.com/paperen/polygon">https://github.com/paperen/polygon</a></p><br />
<br />
<p>下面为polygon的README</p><br />
<br />
<h2>polygon框架</h2><br />
<br />
<ul><br />
<li>编写始于插件化/模块化思想</li><br />
<li>适合快速编写简单的接口</li><br />
<li>半自动转换中英语言</li><br />
</ul><br />
<br />
<h2>如何开始</h2><br />
<br />
<ol><br />
<li>git clone到本地后</li><br />
<li>composer update</li><br />
<li>修改config/config.php(按实际情况调整数据库信息，区分develop/test/production三种环境配置，关于环境常量参见index.php中的ENV)</li><br />
<li>浏览器访问 本地地址+/api/index</li><br />
<li>clone下来自带存在两个模块<code>admin</code>与<code>api</code>，<code>admin</code>是后台（只有一个登录页，没写什么逻辑，不是重点）仅提示也可以做成后台或前台等，重点是<code>api</code></li><br />
</ol><br />
<br />
<ul><br />
<li>/api/index - API模块</li><br />
<li>/admin/login - admin模块</li><br />
</ul><br />
<br />
<p>具体指向哪个控制器方法需要对照分别模块中路由映射</p><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 小程序直播文档尝鲜]]></title><link><![CDATA[ http://paperen.com/post/wxapp-broadcast]]></link><guid isPermaLink="false"><![CDATA[ 119]]></guid><pubDate><![CDATA[ 2020-03-02 12:01]]></pubDate><description><![CDATA[ <p>扒了份小程序直播文档尝鲜</p><br />
<br />
<h2>运营手册</h2><br />
<br />
<p><a href="https://res.wx.qq.com/mmbizwxampnodelogicsvr_node/dist/images/help_0f7865.pdf" title="小程序直播运营操作手册">小程序直播运营操作手册</a></p><br />
<br />
<h2>接入指南</h2><br />
<br />
<p><a href="https://paperen.com/file/206" class="post-image thumbnail"><img src="https://paperen.com/file/206" alt="https://paperen.com/file/206" /></a></p><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ centos下redmine部署/迁移]]></title><link><![CDATA[ http://paperen.com/post/centos-redmine]]></link><guid isPermaLink="false"><![CDATA[ 118]]></guid><pubDate><![CDATA[ 2020-03-02 12:52]]></pubDate><description><![CDATA[ <p>20年一开头就进入艰难模式，业务不得已只能服务器删减降低成本，redmine也需要转移到另外一台服务器上</p><br />
<br />
<p>思路很清晰，paperen稍微到原有的服务器上看了一下，了解一下数据的位置，数据主要包括两个地方：</p><br />
<br />
<ul><br />
<li>mysql</li><br />
<li>redmine目录下的files（整个）</li><br />
</ul><br />
<br />
<p>因为是迁移所以就直接按照原有软件版本进行安装就好，如果你是新搭建的话留意一下下面这个版本对应</p><br />
<br />
<table><br />
<thead><br />
<tr><br />
  <th align="left">redmine版本</th><br />
  <th align="left">ruby版本</th><br />
  <th align="left">rails版本</th><br />
</tr><br />
</thead><br />
<tbody><br />
<tr><br />
  <td align="left">4.0</td><br />
  <td align="left">ruby 2.21, 2.3, 2.4, 2.5, 2.6</td><br />
  <td align="left">5.2</td><br />
</tr><br />
<tr><br />
  <td align="left">3.3</td><br />
  <td align="left">ruby 1.9.33, 2.0.02, 2.1, 2.21, 2.3</td><br />
  <td align="left">4.2</td><br />
</tr><br />
<tr><br />
  <td align="left">3.0</td><br />
  <td align="left">ruby 1.9.3, 2.0.01, 2.1, 2.2</td><br />
  <td align="left">4.2</td><br />
</tr><br />
<tr><br />
  <td align="left">2.6</td><br />
  <td align="left">ruby 1.9.2, 1.9.3, 2.0.01, 2.1</td><br />
  <td align="left">3.2</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p>官方安装版本对照说明可以访问这里查看<a href="https://www.redmine.org/projects/redmine/wiki/RedmineInstall" title="redmine安装说明">redmine安装说明</a><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ hive return code 1 from org.apache.hadoop.hive.ql.]]></title><link><![CDATA[ http://paperen.com/post/hive-return-code-1]]></link><guid isPermaLink="false"><![CDATA[ 117]]></guid><pubDate><![CDATA[ 2019-12-21 23:07]]></pubDate><description><![CDATA[ <p>调整了一个hive表的结构，跑清洗数据脚本时遇到hive报错</p><br />
<br />
<pre>return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask<br />
</pre><br />
<br />
<p>莫名其妙，然后查阅了百度该问题，都比较复杂（看不懂...），沉下心来排查一下，定位到运行到这行时出现问题</p><br />
<br />
<pre>hive -e "use data;truncate table shellda_pvuv;insert into shellda_pvuv select '$SDATE','$HOUR',count(*) as pv,count(distinct devid) as uv,channel,version from shellda_temp_result group by channel,version;"<br />
</pre><br />
<br />
<p>然后我按分号来单条测试，很是奇怪，竟然问题出现在<code>truncate table</code>这里...如图，百思不得其解 <a href="http://paperen.com/file/205" class="post-image thumbnail"><img src="http://paperen.com/file/205" alt="http://paperen.com/file/205" /></a></p><br />
<br />
<p>该不会因为表为空的所以truncate就报错，不会这么无语，试着去掉truncate，竟然OK了！</p><br />
<br />
<h4>所以解决方案就是去掉truncate....</h4><br />
<br />
<p>是这样的，这里的truncate是为了保证清空上次清洗的临时数据影响，其实脚本后面也会在hdfs中rm掉相关临时数据（<code>hadoop fs -rm -r 文件绝对路径</code>），所以这里的truncate可要可不要，而现在定位是由于truncate导致出现这个无语问题，所以只能将其去掉</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ ELK架构实现实时数据报表]]></title><link><![CDATA[ http://paperen.com/post/realtime-elk]]></link><guid isPermaLink="false"><![CDATA[ 116]]></guid><pubDate><![CDATA[ 2018-11-30 17:30]]></pubDate><description><![CDATA[ <p>最近在做某个项目时客户要求实现广告实时数据报表，paperen也是第一次面对这个需求，由于本来广告就有使用nginx做监播（展示与点击日志），所以查阅了一些资料后决定使用比较轻量的ELK来实现这个需求，先放出平台实时报表的截图</p><br />
<br />
<p><a href="http://paperen.com/file/203" class="post-image thumbnail"><img src="http://paperen.com/file/203" alt="http://paperen.com/file/203" /></a></p><br />
<br />
<p>ELK是三个开源软件的缩写，分别表示:Elasticsearch，Logstash，Kibana，都是elsatic下的产品<a href="https://www.elastic.co/products">https://www.elastic.co/products</a></p><br />
<br />
<p>并没有太复杂的东西，简单来说filebeat相当于是一个拉取日志数据，将数据拉到logstash，而logstash中可以配置一些过滤器对数据进行预处理或过滤，最后存到es中<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 区块链知识分享]]></title><link><![CDATA[ http://paperen.com/post/etherum-note]]></link><guid isPermaLink="false"><![CDATA[ 115]]></guid><pubDate><![CDATA[ 2018-04-26 18:44]]></pubDate><description><![CDATA[ <p>最近公司新方向涉及到区块链，在paperen研究了一段时间后，抽空写点关于这块的一些总结，一方面有助于自己温故旧概念另一方面也作为一个笔记</p><br />
<br />
<p>关于这个分享大概会按照以下提纲进行</p><br />
<br />
<ul><br />
<li>区块链概念</li><br />
<li>区块链相关名词解释</li><br />
<li>比特币交易图解</li><br />
<li>以太坊</li><br />
<li>以太坊开发例子</li><br />
<li>参考资料</li><br />
</ul><br />
<br />
<h1>区块链概念</h1><br />
<br />
<p>如果一开始觉得这个概念有点难理解那么咱们先从一个带调侃色彩的对话开始</p><br />
<br />
<blockquote><br />
  <p>问：什么是区块链？答：世界上最慢的分布式数据库</p><br />
</blockquote><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 管道+cronolog做日志切分]]></title><link><![CDATA[ http://paperen.com/post/pipe-cronolog-nginx]]></link><guid isPermaLink="false"><![CDATA[ 113]]></guid><pubDate><![CDATA[ 2018-04-03 17:31]]></pubDate><description><![CDATA[ <p>若业务中涉及到需要记录日志的同时又需要满足日志按时切分功能的话，推荐使用管道pipe+cronolog，而落日志的媒介使用nginx或apache甚至自己写服务来实现也是可以的，paperen推荐nginx</p><br />
<br />
<p><a href="http://paperen.com/file/201" class="post-image thumbnail"><img src="http://paperen.com/file/201" alt="http://paperen.com/file/201" /></a></p><br />
<br />
<p>本文按以下节奏进行：</p><br />
<br />
<ul><br />
<li><a href="#pipe" title="认识管道（pipe）">认识管道（pipe）</a></li><br />
<li><a href="#cronolog">安装与使用cronolog</a></li><br />
<li><a href="#nginx">结合nginx实现日志切分</a><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ php7 nginx 编译配置（centos）]]></title><link><![CDATA[ http://paperen.com/post/php7-nginx-centos]]></link><guid isPermaLink="false"><![CDATA[ 112]]></guid><pubDate><![CDATA[ 2016-12-01 14:01]]></pubDate><description><![CDATA[ <p>将自己编译与配置过程记录一下，方便以后参考更希望能对其他人有帮助，该笔记仅仅适用于配置，没包含性能调优</p><br />
<br />
<p>centos安装的过程就忽略了，自己都是在VM里面折腾，稍微提一下，如果ifconfig命令都提示不存在，需要 <code>yum install net-tools</code> 即可（centos最小化安装会出现这种情况），之后就可以使用xshell等工具ssh来操作</p><br />
<br />
<h2>准备安装包</h2><br />
<br />
<ul><br />
<li><a href="http://php.net/downloads.php" title="PHP7">http://php.net/downloads.php</a></li><br />
<li><a href="http://nginx.org/en/download.html" title="nginx">http://nginx.org/en/download.html</a></li><br />
</ul><br />
<br />
<p>由于涉及到要上传到centos，所以也安装一下lrzsz比较方便 <code>yum install lrzsz</code></p><br />
<br />
<pre>mkdir /home/package<br />
 cd /home/package<br />
 rz （选择刚下载的PHP7与nginx包）<br />
 ls<br />
</pre><br />
<br />
<h2>建立www用户与组</h2><br />
<br />
<p><code>useradd -s /sbin/nologin -U www</code></p><br />
<br />
<p>-U 参数的是会同时建立与用户名一样的用户组<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ Codeigniter扩展-支持分库分表]]></title><link><![CDATA[ http://paperen.com/post/ci-distribution]]></link><guid isPermaLink="false"><![CDATA[ 110]]></guid><pubDate><![CDATA[ 2016-06-03 00:30]]></pubDate><description><![CDATA[ <h1>针对CI模型的分库分表扩展</h1><br />
<br />
<p>就CI在对于一些分库分表这块并没有支持而做的扩展</p><br />
<br />
<p>涉及以下文件</p><br />
<br />
<ul><br />
<li>application/libraries/MY_Profiler.php （仅仅为了支持在调试模式的SQL日志输出而重写了_compile_queries方法）</li><br />
<li>application/core/MY_Model.php</li><br />
</ul><br />
<br />
<h2><a href="http://paperen.com/file/198" class="post-image thumbnail"><img src="http://paperen.com/file/198" alt="http://paperen.com/file/198" /></a></h2><br />
<br />
<h2>使用情景描述</h2><br />
<br />
<p>在一些大型项目中可以会遇到DB将某些会出现大量数据的表拆分到多个表甚至是多个数据库中多个表</p><br />
<br />
<p>比如：用户数据</p><br />
<br />
<p>在单库单表的情况下只使用user表存放数据</p><br />
<br />
<p>uid——username——email——password</p><br />
<br />
<p>但随着数据量增加后续会采取分表存放数据比如创建多个表，user0,user1,user2,user3，而同时有一个主表user_index记录用户的id与username，user_index作为用户的一个索引</p><br />
<br />
<p>uid——username<br />
 1——paperen<br />
 2——paperen3<br />
 3——paperen4</p><br />
<br />
<p>关于这三个用户的详细信息是分散到不同表存储的，如何知道是哪个表，则使用求余的方法<br />
公式为：uid%4<br />
通用公式为：id%(分表总数)</p><br />
<br />
<p>那对于paperen4这个用户他的详细数据是放在3%4=3，也就是user3表里面<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 继续关于并发操作数据库问题的研究]]></title><link><![CDATA[ http://paperen.com/post/concurrency]]></link><guid isPermaLink="false"><![CDATA[ 109]]></guid><pubDate><![CDATA[ 2016-04-20 16:53]]></pubDate><description><![CDATA[ <p>就很久之前自己写过的一篇关于mysql锁表的文章，<a href="http://paperen.com/post/lock-table" title="http://paperen.com/post/lock-table">http://paperen.com/post/lock-table</a>，在目前来看实现上并不存在太大的问题，而当情况放在高并发的情形下那么该解决方案会变得不那么可行，原因是对数据库update操作实在频繁而且高并发情况下大量操作需要等待某个解锁后才能执行</p><br />
<br />
<p>就接着之前那篇文章说的情况</p><br />
<br />
<p><strong>商店现在某商品只有1件库存，然后A与B在网上进行下订，A与B几乎同时（或许也就差几毫秒，A比B快那么一点点）进行</strong></p><br />
<br />
<p>在这种应用情景下，我们先建立一个数据表 product，注意到使用了innoDB引擎</p><br />
<br />
<pre>CREATE TABLE `product` (<br />
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,<br />
  `num` mediumint(8) DEFAULT '0',<br />
  `goods` varchar(60) CHARACTER SET latin1 DEFAULT NULL,<br />
  PRIMARY KEY (`id`)<br />
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;<br />
<br />
INSERT INTO `product` VALUES ('1', '1', 'test');<br />
</pre><br />
<br />
<p>下面为基本php代码</p><br />
<br />
<pre>&lt;?php<br />
<br />
$dbhost = '127.0.0.1';<br />
$dbname = 'test';<br />
$dbpwd = '';<br />
$dbuser = 'root';<br />
<br />
try {<br />
<br />
 $conn = mysqli_connect($dbhost, $dbuser, $dbpwd);<br />
 if ( !$conn ) throw new Exception('db error');<br />
 mysqli_select_db($conn, $dbname);<br />
 mysqli_query($conn,'set names UTF8');<br />
<br />
 $id = 1;<br />
 <br />
 $sql = "select * from product where id='{$id}'";<br />
 $query = mysqli_query($conn, $sql);<br />
 $data = mysqli_fetch_array($query, MYSQLI_ASSOC);<br />
 <br />
 if ( $data['num'] <= 0 ) throw new Exception('product sold out');<br />
 <br />
 sleep(1);<br />
 $sql = "update product set num=num-1 where id='{$id}'";<br />
 mysqli_query($conn, $sql);<br />
 echo 'ok';<br />
 <br />
} catch( Exception $e ) {<br />
 echo $e->getMessage();<br />
}<br />
</pre><br />
<br />
<p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ paperenblog增加redis支持]]></title><link><![CDATA[ http://paperen.com/post/redis-extention]]></link><guid isPermaLink="false"><![CDATA[ 108]]></guid><pubDate><![CDATA[ 2016-04-11 20:35]]></pubDate><description><![CDATA[ <p><a href="http://paperen.com/file/190" class="post-image thumbnail"><img src="http://paperen.com/file/190" alt="http://paperen.com/file/190" /></a></p><br />
<br />
<p>最近尝试了redis，那么就顺便也为自己这套博客代码扩展上redis的支持当练手</p><br />
<br />
<p>关于codeigniter redis的扩展自己先是找了git，用的是这个<a href="https://github.com/joelcox/codeigniter-redis" title="https://github.com/joelcox/codeigniter-redis">https://github.com/joelcox/codeigniter-redis</a></p><br />
<br />
<p>而paperenblog安装时默认这个redis配置是关闭的，安装后可以到后台开启上 <a href="http://paperen.com/file/189" class="post-image thumbnail"><img src="http://paperen.com/file/189" alt="http://paperen.com/file/189" /></a></p><br />
<br />
<p>同时请根据自己实际情况修改配置目录中的redis.php</p><br />
<br />
<blockquote><br />
  <p>application/config/redis.php</p><br />
</blockquote><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 扒站小能手]]></title><link><![CDATA[ http://paperen.com/post/website-clone]]></link><guid isPermaLink="false"><![CDATA[ 107]]></guid><pubDate><![CDATA[ 2016-03-29 20:53]]></pubDate><description><![CDATA[ <p>憋了好几年终于能稍微憋出点小玩意发布一下，希望有人能看到甚至能用上</p><br />
<br />
<p>自己用py写了一个扒站的工具，具体不多说，直接放出github地址</p><br />
<br />
<p><a href="https://github.com/paperen/website-clone" title="website-clone">https://github.com/paperen/website-clone</a></p><br />
<br />
<h4>扒站小能手</h4><br />
<br />
<p><strong>说明</strong></p><br />
<br />
<ul><br />
<li>-h or --help 说明</li><br />
<li>-u or --url 站点网址(site url)</li><br />
<li>-d or --dir [可选]保存本地目录，默认为站点域名(which directory to save files[op tion])</li><br />
</ul><br />
<br />
<p><strong>例子(example)</strong></p><br />
<br />
<blockquote><br />
  <p>py clone.py -u paperen.com</p><br />
  <br />
  <p>clone -u paperen.com -d test (windows下)</p><br />
</blockquote><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 当已成事实]]></title><link><![CDATA[ http://paperen.com/post/something-become-true]]></link><guid isPermaLink="false"><![CDATA[ 105]]></guid><pubDate><![CDATA[ 2013-10-08 00:00]]></pubDate><description><![CDATA[ <p><a href="http://paperen.com/file/182" class="post-image thumbnail"><img src="http://paperen.com/file/182" alt="http://paperen.com/file/182" /></a></p><br />
<br />
<p>已有124天没发表过博客，表面是没有什么技术博客分享，事实是自己堕落了，自认为使用堕落这个词也不为过。</p><br />
<br />
<p>看着秋天来临，夏天的炎热也就快结尾，我不知道整个夏天自己有什么收获，也不知道秋天我该期待得到什么收获，表面是叫随意，事实是叫随波逐流。纵使我明白很多东西需要自己去争取但是就没努力过，等待只是让机会离你而去，想到这些，秋天更会让自己难过。</p><br />
<br />
<p>今天是国庆长假最后一天，自己过得并不愉快，跟老妈翻了脸，4号就回深圳。想起早些年的我放假总是期待着回家到现在都害怕回家，这个转变让自己也感到惊讶，也许表面上是厌倦谈论结婚女友的事情，事实上自己想逃避。看着微博微信某些朋友的“欠自己的旅行”图片，突然觉得自己也想来一次独自旅行，抛下所有烦恼，但烦恼终归要面对，除非你人间蒸发再也不回来了。<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 想到一个自动更新多个奴隶版本库的解决方案]]></title><link><![CDATA[ http://paperen.com/post/solution-for-svn-update-multi-slave]]></link><guid isPermaLink="false"><![CDATA[ 103]]></guid><pubDate><![CDATA[ 2013-06-04 23:37]]></pubDate><description><![CDATA[ <p><br />
 首先声明一下，paperen这里这种方案只是自己想出来的并不是完美的，也许已经有许多前辈已经遇到与我一样的需求并且已经有一套完善的项目管理办法，有知道的麻烦也给我提一下，paperen确实没google出来…<br />
</p><br />
<p><br />
 而目前就paperen这个解决办法简单来说就是通过svn的钩子来实现 也需要一些脚本的支持（这里还是用了php）<br />
</p><br />
<p><br />
 首先还是先举例，比如SVN服务器上有一个项目版本叫test，我在工作机上checkout下来了，然后又在测试服务器1上checkout一遍，又在测试服务器2上checkout一遍，那么到目前为止test这个项目已经有三个版本，我的工作机上、测试机1上、测试机2上，然后本地的版本某个文件修改了一段代码后提交，很明显其他两个测试机上的代码版本都不会产生变化，因为没有update，那么我得一台台远程过去svn update一遍，我很懒，我不想手动去更新版本，so…<br />
</p><br />
<p><br />
 于是乎paperen就想能否让svn服务器具有一些推送的动作，让测试机上的版本自动update，就像下图所示这样的一个机制<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/178" class="post-image thumbnail"><img src="http://paperen.com/file/178" alt="" /></a> <br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 一个模仿vi操作的jquery插件]]></title><link><![CDATA[ http://paperen.com/post/js-vim]]></link><guid isPermaLink="false"><![CDATA[ 102]]></guid><pubDate><![CDATA[ 2013-05-31 19:13]]></pubDate><description><![CDATA[ <p><br />
 github上的地址为 <a href="https://github.com/paperen/js-vim" target="_blank">https://github.com/paperen/js-vim</a> <br />
</p><br />
<p><br />
 实例地址为 <a href="http://paperen.com/demo/js-vim/" target="_blank">http://paperen.com/demo/js-vim/</a><span id="__kindeditor_bookmark_start_5__" style="display:none;"></span> <br />
</p><br />
<p><br />
 通过javascript在网页中重现vi的操作方式(基于jquery)<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/176" class="post-image thumbnail"><img src="http://paperen.com/file/176" alt="" /></a> <br />
</p><br />
<p><br />
 <br /><br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/177" class="post-image thumbnail"><img src="http://paperen.com/file/177" alt="" /></a> <br />
</p><br />
<h2><br />
 如何使用<br />
</h2><br />
<ol><br />
 <li><br />
  <p><br />
   引入 <code>core.js</code> <br />
  </p><br />
<pre class="prettyprint lang-js">&lt;script type="text/javascript" src="vim/core.js"&gt;&lt;/script&gt;</pre><br />
 </li><br />
 <li><br />
  <p><br />
   在想要实现vi操作的页面中加入<br />
  </p><br />
<pre class="prettyprint lang-js">&lt;script&gt;<br />
$(document).ready(function(){<br />
 $(this).vim();<br />
});<br />
&lt;/script&gt;<br />
</pre><br />
 </li><br />
</ol><br />
<h2><br />
 现有支持的命令<br />
</h2><br />
<ul><br />
 <li><br />
  r : 重新载入当前页面<br />
 </li><br />
 <li><br />
  j : 向下滚动<br />
 </li><br />
 <li><br />
  k : 向上滚动<br />
 </li><br />
 <li><br />
  d : 向下滚动半页<br />
 </li><br />
 <li><br />
  u : 向上滚动半页<br />
 </li><br />
 <li><br />
  gg : 滚动到页面顶部<br />
 </li><br />
 <li><br />
  G : 滚动到页面底部<br />
 </li><br />
 <li><br />
  H : 后退<br />
 </li><br />
 <li><br />
  L : 前进<br />
 </li><br />
 <li><br />
  f : 打开当前页面上某个链接<br />
 </li><br />
 <li><br />
  F : 在新标签页中打开当前页面上某个链接<br />
 </li><br />
</ul><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ RTXServer web接口清单]]></title><link><![CDATA[ http://paperen.com/post/RTXServer-web-api]]></link><guid isPermaLink="false"><![CDATA[ 101]]></guid><pubDate><![CDATA[ 2013-05-27 18:49]]></pubDate><description><![CDATA[ <p><br />
 109天没发表博客，破了记录，至从换了公司后就没有机会使用CI，重要的原因是自己懒惰了，下班后的时间几乎都在玩吉他，所以一直没有找到可以分享的技术点<br />
</p><br />
<p><br />
 不过在这109天里可以肯定的事情是：我变了<br />
</p><br />
<p><br />
 在新公司接触得最多的是oa与RTX，而RTX其实也是很多玩法，这里就先将前几天趁空闲的时间整理下来的RTX可以通过web方式调用的接口列一下<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/174" class="post-image thumbnail"><img src="http://paperen.com/file/174" alt="" /></a> <br />
</p><br />
<p><br />
 值得提醒的是这些接口都需要设置访问权限不然访问时会提醒“IP受限制”<br />
</p><br />
<blockquote><br />
 RTX Server强加了SDK访问安性,因此通过http方式访问cgi文件需要在SDKProperty.xml添加远程访问机器的IP地址，如下图所示，允许192.168.10.100通过http方式访问cgi文件<br />
</blockquote><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ markdown编辑器(PHP)]]></title><link><![CDATA[ http://paperen.com/post/markdowneditor]]></link><guid isPermaLink="false"><![CDATA[ 100]]></guid><pubDate><![CDATA[ 2013-02-06 18:59]]></pubDate><description><![CDATA[ <p><br />
 自从接触了markdown就迷上了它，就希望连word文档都可以使用markdown来编写。看一两遍<a href="http://wowubuntu.com/markdown/">markdown的语法说明（中文版）</a>基本就能上手了，简单快捷<br />
</p><br />
<p><br />
 paperen想将自己博客的编辑器也改造成markdown的，于是乎利用工作休息与空闲的时间在git上找了个php markdown解析引擎，然后再补充一下代码就完成了一个简单的markdown editor<br />
</p><br />
<p><br />
 演示地址 <a href="http://paperen.com/demo/markdowneditor/">http://paperen.com/demo/markdowneditor/</a> <br />
</p><br />
<p><br />
 git地址 <a href="https://github.com/paperen/markdowneditor">https://github.com/paperen/markdowneditor</a> <br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/173" class="post-image thumbnail"><img src="http://paperen.com/file/173" alt="" /></a> <br />
</p><br />
<h1><br />
 markdowneditor<br />
</h1><br />
<p><br />
 一个简单的markdown编辑器<br />
</p><br />
<p><br />
 @author <a href="http://paperen.com" title="paperen">paperen</a> <br />
</p><br />
<p><br />
 @url <a href="http://paperen.com/post/markdowneditor" title="markdowneditor">http://paperen.com/post/markdowneditor/</a> <br />
</p><br />
<h2><br />
 关于markdown<br />
</h2><br />
<blockquote><br />
 <p><br />
  Markdown 的目标是实现「易读易写」。<br />
  可读性，无论如何，都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布，并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响，包括 Setext、atx、Textile、reStructuredText、Grutatext 和 EtText，而最大灵感来源其实是纯文本电子邮件的格式。<br />
  总之， Markdown 的语法全由一些符号所组成，这些符号经过精挑细选，其作用一目了然。比如：在文字两旁加上星号，看起来就像<em>强调</em>。Markdown 的列表看起来，嗯，就是列表。Markdown 的区块引用看起来就真的像是引用一段文字，就像你曾在电子邮件中见过的那样。<br />
 </p><br />
</blockquote><br />
<p><br />
 以上摘自<a href="http://wowubuntu.com/markdown/#philosophy" title="markdown宗旨">http://wowubuntu.com/markdown/#philosophy</a> <br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 2012年总结]]></title><link><![CDATA[ http://paperen.com/post/2012-summary]]></link><guid isPermaLink="false"><![CDATA[ 99]]></guid><pubDate><![CDATA[ 2013-01-12 17:23]]></pubDate><description><![CDATA[ <p><br />
 <a href="http://paperen.com/file/172" class="post-image thumbnail"><img src="http://paperen.com/file/172" alt="" /></a> <br />
</p><br />
<p><br />
 PS：图片来自啪啪的Gordon<br />
</p><br />
<p><br />
 2013年都过去12天了才回过头来写2012年的总结<br />
</p><br />
<p><br />
 关于2012年可以用一句话就概括完毕，大部分是一如既往但最后却打破常规<br />
</p><br />
<p><br />
 世界/事情总是向好的方向发展，而所谓好的方向也不见得每个角度都是好的，自己在2012年中似乎也是朝着好的方向前进但是我开始对一成不变感到厌倦<br />
</p><br />
<p><br />
 也许生命的意义在于折腾，越是折腾 人越是精炼，习惯了一成不变或许也不见得是好事情<br />
</p><br />
<p><br />
 2012年12月我离开了原来的公司，告别了关照自己两年多的上司还有与自己共处的同事（包括已离职与未离职的），我希望公司日后能继续在更为老练的同事带领下有更大发展，我祝福他们，感谢他们，我希望与期盼所有的事情会越来越好~<br />
</p><br />
<p><br />
 对于新的一年我的希望是？当然我希望我能往高处前进，工作上有更大发挥自己才能的平台，收入翻倍，生活上能将目前的生活质量提高，爱情上有好对象等等，我想每个人的希望基本上都与我的一致，我们都希望自己变得更好更强<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ bootstrap-confirm 基于modal]]></title><link><![CDATA[ http://paperen.com/post/bootstrap-confirm]]></link><guid isPermaLink="false"><![CDATA[ 98]]></guid><pubDate><![CDATA[ 2012-12-26 00:37]]></pubDate><description><![CDATA[ <p><br />
 在web设计时有些操作需要给予操作者进一步提醒，我们常常会使用window.confirm();来弹出一个警告框<br />
</p><br />
<p><br />
 但是我们没法对它进行美化，它在日渐提高的审美水平下越发越觉得难看。当我们使用了bootstrap后你会发现里面有一个modal，而它实在太好看了（至少paperen是这么认为的） <a target="_blank" href="http://twitter.github.com/bootstrap/javascript.html#modals">http://twitter.github.com/bootstrap/javascript.html#modals</a> <br />
</p><br />
<p><br />
 <a target="_blank" href="http://twitter.github.com/bootstrap/javascript.html#modals"></a><a href="http://paperen.com/file/170" class="post-image thumbnail"><img src="http://paperen.com/file/170" alt="" /></a> <br />
</p><br />
<p><br />
 我们使用这个modal来实现类似window.confirm的功能，但是这倒是需要写多点代码 例如下述代码：<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ CI脚手架（当作是圣诞礼物好了）]]></title><link><![CDATA[ http://paperen.com/post/ci-scaffold]]></link><guid isPermaLink="false"><![CDATA[ 97]]></guid><pubDate><![CDATA[ 2012-12-24 12:05]]></pubDate><description><![CDATA[ <h1><br />
 <a name="ci-scaffold" class="anchor" href="#ci-scaffold"><span class="mini-icon mini-icon-link"></span></a><br />
</h1><br />
<blockquote><br />
 <p><br />
  自己设计的一个基于<a href="http://ellislab.com/codeigniter/user-guide/" title="codeigniter">codeigniter</a>的脚手架，能生成原始模型文件与模块目录，你只需要扩展与完善功能即可，减少编写重复模式的代码<br />
在CI的基础上也做了一些扩展 包括一些开源的扩展与自己编写的扩展<br />
 </p><br />
 <p><br />
  git上的项目地址 <a target="_blank" href="https://github.com/paperen/ci-scaffold">https://github.com/paperen/ci-scaffold</a> <br />
 </p><br />
</blockquote><br />
<h2><br />
 部分截图<br />
</h2><br />
<p><br />
 <strong>ci-scaffold界面</strong><br /><br />
<a href="http://paperen.com/file/166" class="post-image thumbnail"><img src="http://paperen.com/file/166" title="ci-scaffold界面" alt="ci-scaffold界面" /></a> <br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 通过hook设计出更方便的令牌]]></title><link><![CDATA[ http://paperen.com/post/create-token-via-hook]]></link><guid isPermaLink="false"><![CDATA[ 95]]></guid><pubDate><![CDATA[ 2012-12-21 02:06]]></pubDate><description><![CDATA[ <p><br />
 之前同事做每周分享时说了thinkphp的令牌，只需要在视图中写上__TOKEN__那么到时就会自动转换成一个隐藏域，顿时觉得很方便于是那时就按照这种思路在CI的基础上扩展了这种产生令牌的方式<br />
</p><br />
<p><br />
 记得之前发表过关于<a href="http://paperen.com/post/ci-hooks" target="_blank">hook</a>与<a href="http://paperen.com/post/use-token-avoid-repeated-form-submit" target="_blank">令牌</a>的两篇文章<br />
</p><br />
<p><br />
 如果你还不清楚什么是钩子的话，建议花点时间看看与写写，而令牌其实就是为了防止表单重复提交的，不知道的自己补补<br />
</p><br />
<p><br />
 要在CI的基础上实现这种扩展，paperen我首先想到的就是利用钩子，利用在视图输出前的钩子检测文本中是否有__TOKEN__关键字，有则创建一个令牌并用隐藏域替换掉<br />
</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ CI模型扩展成调用即加载（含缓存模式）]]></title><link><![CDATA[ http://paperen.com/post/ci-model-extend]]></link><guid isPermaLink="false"><![CDATA[ 94]]></guid><pubDate><![CDATA[ 2012-12-01 16:52]]></pubDate><description><![CDATA[ <p><br />
 关于CI中的模型的标准用法是先要load然后才能使用的，基于这种调用模型的做法长久下来就让paperen觉得麻烦，一开头就得要将用到的模型手动全部load过来，当然这种算是比较苛刻的做法也是有它的理由，毕竟这就清楚这部分引用了哪些模型与减少加载多余模型的机会。<br />
</p><br />
<pre>// 加载用户模型<br />
$this-&gt;load-&gt;model('user');<br />
// 获取所有用户数据<br />
$this-&gt;user-&gt;all( $per_page, $offset );<br />
</pre><br />
<p><br />
 CI的模型文档 <a href="http://ellislab.com/codeigniter/user-guide/general/models.html" target="_blank">http://ellislab.com/codeigniter/user-guide/general/models.html</a> <br />
</p><br />
<p><br />
 在开始后续内容之前还是声明一下<br />
</p><br />
<ul><br />
 <li><br />
  基于Hex的HMVC <a href="https://github.com/CodeIgniter/HMVC" target="_blank">https://github.com/CodeIgniter/HMVC</a> <br />
 </li><br />
 <li><br />
  会降低些少性能<br />
 </li><br />
 <li><br />
  不是最好的代码 不排除有bug的可能<br />
 </li><br />
</ul><br />
<h5><br />
 调用即加载<br />
</h5><br />
<p><br />
 paperen想象中要达到的目的就是<br />
</p><br />
<pre>// YY一下要实现的调用写法<br />
$this-&gt;model_user_all( $per_page, $offset );<br />
</pre><br />
<p><br />
 我们不需要再先load，调用的时候就会自动加载，格式必须是model_{模型名称}_{方法}( 参数1, 参数2, ... )<br />
</p><br />
<p><br />
 如果你觉得这样不适合自己使用就不用往下看了<br />
</p><br />
<h5><br />
 附带查询缓存的概念<br />
</h5><br />
<pre>// YY一下要实现的调用写法<br />
$this-&gt;model_cache( 'model_user_all', $per_page, $offset );<br />
</pre><br />
<p><br />
 之前也有一篇关于查询缓存的文章 <a href="http://paperen.com/post/ci-querycache-extend" target="_blank">http://paperen.com/post/ci-querycache-extend</a> <br />
</p><br />
<p><br />
 其实就是避免不同模块执行了相同的SQL语句，模块之间的数据完成是可以公用的，而这个querycache就是桥梁，也算是一种解决办法吧，不过在这次扩展中querycache将成为其中的组件，对于我们来说它完全是透明的<br />
</p><br />
<p><br />
 <strong>强调一下 对插入与更新、删除的动作不要使用查询缓存</strong> paperen在代码中并没有限制这个也就是意味着你可以使用model_cache来完成update、insert、delete等操作，但是这有什么意义呢。。。<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 一个基于Hex-HMVC的模型扩展]]></title><link><![CDATA[ http://paperen.com/post/hex-HMVC-models-extends]]></link><guid isPermaLink="false"><![CDATA[ 93]]></guid><pubDate><![CDATA[ 2012-10-31 01:43]]></pubDate><description><![CDATA[ <h3><br />
 为什么要进行这个扩展？<br />
</h3><br />
<p><br />
 在使用hex提供的HMVC扩展方案以来在模型方面一直有疑问，怎衡量模型放在相应modules/models下还是放app目录/models下？比如模块1中要调用user模型的get_all方法获取所有用户数据 模块2也要获取这些数据 那么若模块1,2的模型中都创建一个user模型实现各自的get_all方法会不会显得没有重用的味道？<br />
</p><br />
<p><br />
 通过在微博上询问<a href="http://weibo.com/hexhex" target="_blank">@hex</a> hex的评论启发了我，他说“感觉还需要有个模型继承的功能吧” 没错继承<br />
</p><br />
<p><br />
 于是paperen我尝试按照这个概念去在hex的HMVC基础上扩展这个功能，从而达到这个继承的模式<br />
</p><br />
<h3><br />
 涉及文件<br />
</h3><br />
<p><br />
 就一个MY_Loader.php<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于hook一些研究（CI）]]></title><link><![CDATA[ http://paperen.com/post/ci-hooks]]></link><guid isPermaLink="false"><![CDATA[ 91]]></guid><pubDate><![CDATA[ 2012-08-08 18:58]]></pubDate><description><![CDATA[ <p><br />
 近来因为布置了每个人了解一个框架，paperen依旧选择CI（从这方面也可以看出我很专一…）作为进一步研究，所以paperen又再次看了它的核心代码，而看到hooks的实现时不禁有感而发，感叹之前自己试着在CI的基础上设计一个hook的做法实在太SB。<br />
</p><br />
<p><br />
 paperen并不想放什么概念的跟大家分享，而是从自己博客开始。<br />
</p><br />
<p><br />
 你看到博客的右边栏，在进入某篇文章详细时是会多出这个附带图片的栏目，就是将该文章中所有的附带图片在此用缩略图形式展现，方便浏览者点击查看。这个地方就是应用了钩子，或许说到这里你还是很模糊，但下面就会进行更多解析。<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/160" class="post-image thumbnail"><img src="http://paperen.com/file/160" alt="" /></a> <br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ paperenblog补充说明]]></title><link><![CDATA[ http://paperen.com/post/paperenblog-additional]]></link><guid isPermaLink="false"><![CDATA[ 90]]></guid><pubDate><![CDATA[ 2016-03-30 15:03]]></pubDate><description><![CDATA[ <p>在这里我将告诉大家一些paperenblog不足与可能对大家有帮助的地方</p><br />
<br />
<p>首先，很重要的一点就是paperenblog是基于codeigniter框架的，所以它必须继承CI的优缺点，同时它也是遵从CI自身规范的，还有我使用了hex提供的HMVC扩展方案 <a href="https://github.com/CodeIgniter/HMVC" target="_blank">https://github.com/CodeIgniter/HMVC</a></p><br />
<br />
<h3>关闭调试模式</h3><br />
<br />
<p><a href="http://paperen.com/file/158" class="post-image thumbnail"><img src="http://paperen.com/file/158" alt="" /></a></p><br />
<br />
<p>想去掉调试信息的话，可以修改根目录下的index.php的21行</p><br />
<br />
<p><a href="http://paperen.com/file/159" class="post-image thumbnail"><img src="http://paperen.com/file/159" alt="" /></a></p><br />
<br />
<p>将常量ENVIRONMENT改为不是development就行了，其实这个常量也是CI里面定义的，我也是顺着CI去的而已，关于环境这个常量你继续往下看就会看到，CI定义的有三种：development、testing、production，而只有是development时我才会将调试信息展示。</p><br />
<br />
<h3>关于安全</h3><br />
<br />
<p>大部分安全措施都已经由CI帮我们完成，包括注入攻击与XSS。针对代码上的攻击我希望paperenblog已经做得很好，但是不代表绝对的安全。</p><br />
<br />
<p>而这里还要提及一点提高站点安全的方法</p><br />
<br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ paperenblog發佈]]></title><link><![CDATA[ http://paperen.com/post/paperenblog-sourcecode]]></link><guid isPermaLink="false"><![CDATA[ 89]]></guid><pubDate><![CDATA[ 2012-07-28 15:31]]></pubDate><description><![CDATA[ <p><br />
 終於算是可以光明正大地發佈自己的博客源碼了，雖然之前一直都有在git，但是都是功能沒完善的版本，而現在正式進行官方發佈paperenblog~~<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/148" class="post-image thumbnail"><img src="http://paperen.com/file/148" alt="" /></a> <br />
</p><br />
<h3><br />
 安装说明<br />
</h3><br />
<p><br />
 1 将压缩包解压，将相应文件复制到您的www目录下<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/149" class="post-image thumbnail"><img src="http://paperen.com/file/149" alt="" /></a> <br />
</p><br />
<p><br />
 2 根据自己的情况去修改.htaccess文件第3行RewriteRule<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/150" class="post-image thumbnail"><img src="http://paperen.com/file/150" alt="" /></a> <br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 一个用户引导的js插件(基于jquery)]]></title><link><![CDATA[ http://paperen.com/post/user-guide-jquery-plugin]]></link><guid isPermaLink="false"><![CDATA[ 87]]></guid><pubDate><![CDATA[ 2012-07-06 13:06]]></pubDate><description><![CDATA[ <p><br />
 有时候我们上线的网站可以要对第一次使用的用户进行一个引导，当然我们必须要建立帮助中心，也要附带一些图文说明指引用户进一步操作，而有时候也会使用一些更让人舒服的指引方法，使用一个偏暗遮罩将页面的元素挡住，然后将设定好的操作步骤一步一步加亮强调，从而引导用户去操作并附带一些说明文字与图片，这种方式不会影响太多用户体验，很简洁地引导了用户如何使用应用。<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/146" class="post-image thumbnail"><img src="http://paperen.com/file/146" alt="" /></a> <br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 尼玛，早知svn有hook的功能就那个那个]]></title><link><![CDATA[ http://paperen.com/post/holly-shit]]></link><guid isPermaLink="false"><![CDATA[ 86]]></guid><pubDate><![CDATA[ 2012-06-30 11:44]]></pubDate><description><![CDATA[ <p><br />
 原来svn可以利用hook进行一些猥琐的动作，比如paperen之前这个<a href="http://paperen.com/post/svn-sync-tool" target="_blank">文件版本同步小工具</a>这种小玩意就可以免了，当paperen发觉到这个事实后不禁内牛满面……<br />
</p><br />
<p><br />
 下面来隐约地说下这个hook怎实现客户端提交后让服务端的版本自动更新，简直简单到不能在简单……<br />
</p><br />
<p><br />
 <a href="http://paperen.com/file/145" class="post-image thumbnail"><img src="http://paperen.com/file/145" alt="" /></a> <br />
</p><br />
<p><br />
 条件在此就不提了（对了，先声明一下这是在windows条件下的），主要是你要到版本库（比如paperen本地测试时用的是ci-paperen，就是你使用svn create后的目录中的那个hook），进入hook目录中，这里就是放置hook的地方，而对于我们实现这个功能只需要用到post-commit这个钩子，你可以打开post-commit.tmpl看它的说明，所有钩子都有这么一个tmpl文件，里面都有说明。<br />
</p><br />
<p><br />
 确保你已经将subversion的bin目录加到环境变量，就是你可以通过命令行进行svn的操作，比如你进入命令行，直接敲上svn试试，看是否支持这个命令，然后使用<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ Ci使用HMVC时增加查询缓存]]></title><link><![CDATA[ http://paperen.com/post/ci-querycache-extend]]></link><guid isPermaLink="false"><![CDATA[ 85]]></guid><pubDate><![CDATA[ 2012-06-15 17:40]]></pubDate><description><![CDATA[ <p><br />
 如果你有扩展过CI的HMVC（<a href="https://github.com/CodeIgniter/HMVC" target="_blank">hex提供的方案</a>），你可能会在实际使用的过程中越来越理解HMVC，但也可能会越来越搞不清楚什么是HMVC，正如paperen一样…有时候特别觉得模块这个词实在是抽象，到底什么才能定义为模块，到底概念并不是最重要，重要的是你用起来是否合理，是否有效，是否能更好减少耦合。<br />
</p><br />
<p><br />
 在paperen使用hex提供的这个hmvc方案过程中，确实也遇到了一些bug，不过目前的已经得到修复，关于hmvc我觉得重要一点是模块之间数据不能共用，而导致一个页面有可能执行了多条一样的SQL，想体现一下这种现象，也很简单。<br />
</p><br />
<p><br />
 这是原始调用模型的写法<br />
</p><br />
<pre class="prettyprint lang-php">$this-&gt;load-&gt;model('userlog_model');<br />
print_r( $this-&gt;userlog_model-&gt;all() );</pre><br />
<p><br />
 调用了userlog_model中的all方法，是什么不要紧，反正你知道这里就是送出一条SQL就够了<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 久违的博客]]></title><link><![CDATA[ http://paperen.com/post/久违的博客]]></link><guid isPermaLink="false"><![CDATA[ 84]]></guid><pubDate><![CDATA[ 2012-05-20 23:38]]></pubDate><description><![CDATA[ <p><br />
 这是出发去的前一晚，今天抽点空将弄得半调子的后台代码传到空间上就勉强地来发一篇博客了。对，这确实是一篇久违的博客。<br />
</p><br />
<p><br />
 我此时的心情也不能说是兴奋，作为工作后第一次旅游，哦，不，应该是说初中之后的第一次旅游，我确实不知道应该怀着什么的心情去享受这次旅行，向公司请了5天假，但是感觉总是怪怪的，好像是做错了什么事情似的，这是不是有点不负责任， 我为公司带来的价值是不是值得公司为我开5天的假，老是觉得自己做得还不够，远远不够，或许我的确缺乏足够的自信。但什么是自信，我也不知道…<br />
</p><br />
]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 文件版本同步小工具]]></title><link><![CDATA[ http://paperen.com/post/svn-sync-tool]]></link><guid isPermaLink="false"><![CDATA[ 83]]></guid><pubDate><![CDATA[ 2012-03-04 17:41]]></pubDate><description><![CDATA[ <p>用了半天的时间完善与整理了上周回家写得半调子的代码，paperen倒是不清楚subversion是否支持这个功能，但是既然自己都写了就放上来吧，用的是python写的，所以也就是半调子水平。</p><p>弄这个东西的来源是因为在公司那个项目，因为要给客户看到我们那个项目的原型，所以我们在内网找了一台机子作为服务器，然后设置一下路由的转发，将公司的域名挂上去，那么客户访问指定的域名+端口号就会转发到我们内网那台机子上了，而那台机子并不是我用的开发机子，而每次原型有什么更新我都得过去那台机子上用svn&nbsp;update一下，将那台机子上的demo版本更新到最新，为了保证客户看到的demo与我们目前完善的demo是一致的。</p><p>所以嘛，你看我们每次有完善什么都得去那台机子上用鼠标操作一下，虽然不到几分钟，但是paperen也嫌麻烦，于是paperen将那台机子开启允许远程，于是自己就不要过去机子面前操作了，在自己机子上远程过去操作svn，然后就关闭远程，那比亲自走过去爽多了，但是……paperen还是觉得麻烦（不得不承认我很懒……）</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 用户动作记录器]]></title><link><![CDATA[ http://paperen.com/post/user-action-logger]]></link><guid isPermaLink="false"><![CDATA[ 82]]></guid><pubDate><![CDATA[ 2012-02-19 16:52]]></pubDate><description><![CDATA[ <p>当我们设计的站点应用对安全有一定要求的话，就可能会涉及到需要记录使用者的操作记录，比如什么时候登录什么时候做了些什么之类的，你也可以称之为用户操作足迹。</p><p>具体来说要实现的最终要得到的数据是如下的：</p><pre>吴给力在 2012-02-18 01：14：13 上了厕所<br />吴给力在 2012-02-18 01：17：23 回到床上<br />吴给力在 2012-02-18 02：26：43 接起电话<br />吴给力在 2012-02-18 02：27：11 放下电话</pre><p>就针对上面这个描述来说的话，我们可以有两种解决办法：在吴给力身上装一个记录器，凡是与其身体有接触的东西都会被记录下来同时记录触发的时间；在所有东西上放置记录器，每当触摸人是吴给力时就会连同时间记录下来，理论上两种都是可行的办法，既然这样那就写写试试吧。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 同步登陆]]></title><link><![CDATA[ http://paperen.com/post/sync-login]]></link><guid isPermaLink="false"><![CDATA[ 81]]></guid><pubDate><![CDATA[ 2012-01-04 21:14]]></pubDate><description><![CDATA[ <p><a href="http://paperen.com/file/94" class="post-image thumbnail"><img src="http://paperen.com/file/94" alt="20120104211336" title="上传于2012-01-04"></a></p><p>这不是什么新的技术，所以如果你已经知道如何实现可以忽略此博文了。</p><p>关于同步登陆的需求，大网站可能有几个子网站或者是子系统，不能设计成每次进入其他子网站就登陆一次，而应该是在子站点登陆了就可以漫游于其他子站点，当然用户帐号与密码也应当保持一致。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 年总结Summary]]></title><link><![CDATA[ http://paperen.com/post/2011-year-summary]]></link><guid isPermaLink="false"><![CDATA[ 80]]></guid><pubDate><![CDATA[ 2011-12-31 02:06]]></pubDate><description><![CDATA[ <p>一年又是那么一下子结束掉，还觉得自己好像是毕业没多久。2011这个数字对于我来说也算有点意义，因为是从大学混到社会的一年。我只知道在这一年中自己某些人生观、对待某些事情的看法上确实有了变化，但无法告诉你那是什么，似乎这样的话很无解，但确实是这样的。</p><p>我通常不会将自己的生活描述得太过于好，但也不会描述得太过于差，当偶尔在TM上有大学朋友问我过得如何时，我通常是使用“我过得不错（很好）”来回答，我想这是一个很好的消息，无论是对他还是对自己，或许这也是乐观的表现，但老实来说没有什么理由说自己过得不好，做到自己感兴趣工作的同时还赚到钱，能租到自己可以接受的房子，而且在深圳还有亲戚关照，还有什么不好。</p><p>有时候在微博上或者是在与别人交流中总是能了解到一些关于价值观与人生观，但自己并不会很轻易就接受那些所谓的观点，或许我是变得保守了，我不知道这算不算是成熟，我只是想问问有多少人觉得自己是个很无趣的人。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于控制器与模型间的一些想法]]></title><link><![CDATA[ http://paperen.com/post/some-idea-about-controller-and-model]]></link><guid isPermaLink="false"><![CDATA[ 79]]></guid><pubDate><![CDATA[ 2011-11-22 21:19]]></pubDate><description><![CDATA[ <p>用CI也有一段时间了，感觉paperen我也挺喜欢CI的，因为觉得上手真的很容易也很方便，暂时还不会考虑其他框架。不过通过这段时间的使用，加上同事比较多疑问（也算是好事吧），自己也有点对CI中控制器与模型部分使用产生些少疑问，特别是模型，因为之前的开发就带来一些比较混乱的状况，老实说之前写的代码比较糟糕。</p><p><a href="http://paperen.com/file/93" class="post-image thumbnail"><img src="http://paperen.com/file/93" alt="20111122011355" title="上传于2011-11-22"></a></p><p>很多疑问都是产生在控制器与模型之间的，疑问最严重的是模型的重用性（况且可以这么说吧），平平君与奇奇君本来是分开一人负责一块功能的，但是免不了要涉及一些公用的模型，这就导致了一些不能避免的问题，平平君要与奇奇君协商某个公用的模型方法，但是别扭的是前者可能额外附件一些条件，比如要查询state为3的记录而后者则又会附加其他限制条件，而且paperen不太同意在控制器中对模型进行控制（或者下面的例子展示后你就明白什么意思），结果要写一个能符合两者需求的模型方法，在这个模型方法中写了比较复杂的逻辑，本来比较简单的模型突然看到一段复杂的逻辑，这个真的是我不想要的，paperen提议的是即使你查询的条件不同的话就可以考虑分出来单独作为一个方法了，而不要花太多时间在万能的模型方法，因为那可能会增加了模型的复杂度或者增加了控制器与模型的耦合度。说了这么多还不如看个例子吧。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 解决表单重复提交]]></title><link><![CDATA[ http://paperen.com/post/use-token-avoid-repeated-form-submit]]></link><guid isPermaLink="false"><![CDATA[ 77]]></guid><pubDate><![CDATA[ 2011-10-22 16:31]]></pubDate><description><![CDATA[ <p>这应该是个很长久的问题……长久得在网上一搜大把解决方案，就是关于如何防止表单重复提交的问题，而paperen这里也就再来解析一下解决的方法与原理，毕竟也是一个实用的技<br />
<br />
术。如果您已经知道如何解决的话那么这篇文章可能不适合你的口味，paperen这里也打算从基础开始讨论，所以希望一步看到解决方案的您也可能不太适合，所以请注意。So~开始吧<br />
<br />
~</p><p>paperen想您一定知道表单是什么吧，form元素就是表单，一般网页需要输入的地方必定使用了表单元素，也很常见，一般的代码如下：</p><pre>&lt;form <br />
<br />
method="post"&gt;<br />&lt;p&gt;<br />    &lt;label for="test"&gt;随便输入点什么&lt;/label&gt;<br />    &lt;input type="text" name="data" id="test" /&gt;<br />&lt;/p&gt;<br />&lt;p&gt;<br />    &lt;input type="submit" value="提交" name="submit" /&gt;<br />&lt;/p&gt;<br />&lt;/ul&gt;<br />&lt;/form&gt;</pre><p>重点其实是form与input元素，p元素只是paperen私自加上去的，对后续的说明没有任何影响，其实很简单，所谓input就是输入了，你可以完全将input<br />
<br />
元素理解为是用作用户输入，只是某些属性的（type）不能作为输入而已（这里就是submit），而form元素你完全可以将它理解为是一个袋子，将所有用户输入数据到装在它里面之后用<br />
<br />
来提交回服务端处理，但对于form元素值得注意的是method属性，一般来说有get与post两种方法，其实不要想得太复杂（因为深入的不需要太理解，对于后续的内容没有太多关系，如<br />
<br />
有兴趣不妨可以使用浏览器的调试工具查看请求头部信息与发送信息，例如firebug），表现出来就是，使用get提交表单的话所有的input元素的值将会在地址栏处出现，而post则不会，<br />
<br />
例如使用get提交此表单后的浏览器地址栏</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于产品与设计的一点思考]]></title><link><![CDATA[ http://paperen.com/post/some-idea-about-design-and-product]]></link><guid isPermaLink="false"><![CDATA[ 75]]></guid><pubDate><![CDATA[ 2011-09-15 21:16]]></pubDate><description><![CDATA[ <p><a href="http://paperen.com/file/90" class="post-image thumbnail"><img src="http://paperen.com/file/90" alt="20110915211528" title="上传于2011-09-15"></a></p><p>最近从迷茫中又坚持了下来，而且还获得了其他一些与技术无关的体会，当然这些体会并不是突然冒出来的，或者也跟这1年的工作有关吧。paperen首先抛出自己的观点吧，“一件好的产品必须而且一定是从源设计中继承并得以延伸的”，无论您认同或者反对，或者中立也好，paperen会在下面用自己的体会去描述自己这个观点。so，这是一篇议论文……</p><p>在生活中会不会有这些情景，“我很想弄一个小玩意，能用来这样那样，是啊！很cool啊！”，在想象中确实很吸引很完美，但一旦将其置于实现中就没有下文了，而这种情况paperen认为是很正常的，每个人都爱幻想，而且应该保持幻想，至于能不能实现是其次，因为如果没有这些幻想与这些概念就根本不会有实例的出现，但这里paperen想强调的是，如果连自己（设计思想来源者）都没法做到吸引自己去动手去认为值得实现，那么可能证明了两件事：1.你只是个空幻想家，2.你想象的玩意仍不够吸引。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ {生活:工作}]]></title><link><![CDATA[ http://paperen.com/post/i-feel-tire]]></link><guid isPermaLink="false"><![CDATA[ 74]]></guid><pubDate><![CDATA[ 2011-09-01 20:39]]></pubDate><description><![CDATA[ <p>若不是opera的快速拨号里面有自己博客的一张图片，paperen我都不会想到该来写点东西。最近一下了班就什么都不想做，感觉真的很累，也渐渐地失去了激情~~或者自己早已经预料会有这么一天的到来，但还是觉得来得有点早，还以为能坚持下去，但是发觉越来越难~~</p><p>也或许出来社会就是这样，在生命结束的那一刻才会有一种成就感才能对自己的一生做出评价，而之前的日子就像在长跑，可能是每天每夜地在同一个地方绕圈也可能是不断向前迈进。但很多时候我们也会感觉到迷茫，消极，看到成功的人如何如何，很多时候会觉得对那种长跑感到厌倦。大家老是说“成功没有捷径，惟有勤奋而已”，虽然感觉这是一句勉励自己的话，但有时候却觉得这是一句傻子才会说的话。人有时候也总是会表现出消极的一面，却不总是一件坏事。</p><p>paperen你是在自我安慰吗？是的，我是在自我修复这种疲倦，但这种方法越来越不奏效。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 后知后觉的Mysql锁表应用]]></title><link><![CDATA[ http://paperen.com/post/lock-table]]></link><guid isPermaLink="false"><![CDATA[ 73]]></guid><pubDate><![CDATA[ 2011-07-16 17:48]]></pubDate><description><![CDATA[ <p>在看CI（codeigniter）database那一节的手册发现其自带了事务的处理，之后又不知不觉地查了一些资料，在某个地方看到有个例子，具体描述类似如下：商店现在某商品只有1件库存，然后A与B在网上进行下订，A与B几乎同时（或许也就差几毫秒，A比B快那么一点点）进行。</p><p>很明显是只有A才能成功下单的，B则会收到库存不足的提示，但是作为放置在服务端的那个页面（或者称为脚本程序）我们得怎样去处理这个问题呢？或者我先放出一段代码吧。</p><pre>$sql = "select number from goods where id=1";<br />$number = intval( $db-&gt;result( $db-&gt;query( $sql ), 0 ) );<br />if ( $number &gt; 0 ) {<br />	sleep( 2 );<br />	$sql = "update goods set number=number-1 where id = 1";<br />	if ( $db-&gt;query( $sql ) ) {<br />		echo 'Ok!Here you are!';<br />	} else {<br />		echo 'Sorry!Something go wrong!Try it again.';<br />	}<br />} else {<br />	echo 'No more!you are so late!';<br />}</pre><p>这部分代码除了缺少一定注释外都写得没错，当然$db是一个操作数据库的类，我只是将大部分方法封装了，这里的逻辑也是很明显了。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 经常会遇到的css兼容性问题]]></title><link><![CDATA[ http://paperen.com/post/css-compatibility-solution]]></link><guid isPermaLink="false"><![CDATA[ 72]]></guid><pubDate><![CDATA[ 2011-07-10 20:17]]></pubDate><description><![CDATA[ <p>弄过网页布局的同学都应该知道一件事情——在火狐、chrome、opera这些浏览器弄得好好的页面到了IE6中却让你无语。是的，那也就是浏览器的css兼容性问题，在IE6下有些事情就出了一些令人意想不到的bug~~所以在写css的时候推荐使用多个浏览器同时调试，才能保证兼容性问题一个接一个地被解决。</p><p><a href="http://paperen.com/file/80" class="post-image thumbnail"><img src="http://paperen.com/file/80" alt="20110710191930" title="上传于2011-07-10"></a></p><p>而这篇文章就是总结一下一些paperen经常遇到的css兼容性问题以及解决方法。直接切入主题吧。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ js碰撞游戏一枚]]></title><link><![CDATA[ http://paperen.com/post/js-collision-game]]></link><guid isPermaLink="false"><![CDATA[ 71]]></guid><pubDate><![CDATA[ 2011-05-21 15:49]]></pubDate><description><![CDATA[ <p>一直都觉得javascript可以玩得很cool。所以终于尝试了使用js来写了一个小游戏，界面上其实也没什么特色~~普普通通吧，paperen将这个游戏取名为（untouchable）不可触及，游戏规则其实很简单，不要让那个按钮与那些飞来飞去的小球发生碰撞，看你能熬到多少秒。</p><p><a href="http://paperen.com/file/78" class="post-image thumbnail"><img src="http://paperen.com/file/78" alt="20110521142514" title="上传于2011-05-21"></a></p><p>&nbsp;untouchable游戏地址<br />
&nbsp;<a href="http://paperen.com/demo/collision/" target="_blank">http://paperen.com/demo/collision/</a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ Just For Fun]]></title><link><![CDATA[ http://paperen.com/post/just-for-fun]]></link><guid isPermaLink="false"><![CDATA[ 70]]></guid><pubDate><![CDATA[ 2011-04-21 21:19]]></pubDate><description><![CDATA[ <p>话说很久很久以前有个人，他的名字叫paperen，他一直想弄一个聊天工具……而又在同时他不知不觉间步入了WEB的领域，但他依然想弄个聊天工具……于是直到这篇Just For Fun的面世……</p><p>一个很囧的引子……其实呢，paperen我在毕业之前就弄了一个，那时打算将它作为毕设的，但结果用了那时在诺网期间那个IP屏蔽的东西作为自己的毕设~~这次再弄了一个，纯属是弄着玩而已，不过也花了些少功夫，代码架构上就一般般，并没有太多面向对象的味道，其实一开始是想发表一个关于在线的东东，结果弄着弄着就加上了聊天对话的东西……下面放出DEMO与RAR包的地址（如果你想做得更好，paperen可以说我这个还远远不够~~但这并不影响你去实现你想实现的更cool的东西）：</p><p>DEMO <a href="http://paperen.com/demo/just-for-fun/">paperen.com/demo/just-for-fun/</a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 不要忽略了前端的性能]]></title><link><![CDATA[ http://paperen.com/post/dont-forget-FrontEnd-performance]]></link><guid isPermaLink="false"><![CDATA[ 68]]></guid><pubDate><![CDATA[ 2011-03-27 20:23]]></pubDate><description><![CDATA[ <p>将《高性能网站建设指南》读完了，感觉很好，这本书值得大家一读。让paperen对前端性能优化有了更多了解。<a href="http://stevesouders.com/" target="_blank">steve souders</a> 将所有法则都描述得很彻底，很简洁。书中一些观点更是让paperen深刻“只有10%-20%的最终用户响应时间花在了下载HTML文档上，其余的80%-90%时间花在了下载页面中的所有组件上”，“如果将后端响应时间缩短一半，整体响应时间只能减少5%-10%，如果关注前端性能，同样是将其响应时间减少一半，则整体响应时间可以减少40%-45%”，总结得真的很到位，更重要的是你在阅读过程中会通过例子自己体会到作者这些观点。</p><p>光看封面都挺有意思的，留意那只狗的比例。</p><p><a href="http://paperen.com/file/100" class="post-image thumbnail"><img src="http://paperen.com/file/100" alt="20110327151826" title="上传于2012-04-15"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 还是JS图片gallery]]></title><link><![CDATA[ http://paperen.com/post/js-pic-gallery]]></link><guid isPermaLink="false"><![CDATA[ 67]]></guid><pubDate><![CDATA[ 2011-03-26 21:09]]></pubDate><description><![CDATA[ <p>看到标题你都明白这次又是说啥了，还是JS图片展览的效果，but，这次同时附上<a href="http://www.psytopic.com/mag/" target="_blank"> psytopic.com</a> 里面的那个gallery（准确点来说是盗窃回来的），paperen弄来他们的js，css，同时搜索了关于lightory这个信息，准确点来说是个开发者（根据css文件开头的备注找到了这个线索），paperen当然也不确定是不是这个lightory（t.sina.com.cn/lightory），但可以肯定而且令我惊讶的是微博这位又是一个90后的杰出开发者（又让paperen觉得中国的IT未来一片光明，我们需要的只是创新而已），访问了<a href="http://lightory.net/" target="_blank"> 他的blog</a> 与摆摆书架（<a href="http://bookfor.us/" target="_blank">http://bookfor.us/</a>）paperen喜欢这样的UI，摆摆书架的玩法大家也可以了解下，挺有意思的。</p><p>多余的东西就到此为止了，说得有点多了……好吧，一开始就来个DEMO给大家看看（psytopic.com的那个）。</p><p><a href="http://paperen.com/file/136" class="post-image thumbnail"><img src="http://paperen.com/file/136" alt="20110326212041" title="上传于2011-03-26"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 加密的GET参数]]></title><link><![CDATA[ http://paperen.com/post/get-encode]]></link><guid isPermaLink="false"><![CDATA[ 66]]></guid><pubDate><![CDATA[ 2011-02-23 19:41]]></pubDate><description><![CDATA[ <p>WEB驱动事件与交互的最基本的方法就是通过GET参数，我想你懂paperen说的是什么意思的。</p><p>www.example.com/news/?id=234</p><p>www.example.com/goods.php?id=2</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于Mysql的两个实用技术]]></title><link><![CDATA[ http://paperen.com/post/mysql-advanced]]></link><guid isPermaLink="false"><![CDATA[ 65]]></guid><pubDate><![CDATA[ 2011-02-11 17:38]]></pubDate><description><![CDATA[ <p>paperen对mysql的接触是从玩php开始的，paperen并没有学过SQL，但是自学了一些，对于mysql其实也不是专研得太深，而最近又重新看一遍《PHP和MySql Web开发 第4版》才有发现mysql中有些东西paperen到现在还没有玩过~~所以现在paperen再亲自测试一下并拿出来跟大家分享一下，其实大家有这本书的话不妨自己翻开，再看看12，13章的内容，当然如果你是已经了解并玩得很熟了那么可以忽略了。</p><p>大概总结了下，这两章介绍了一些玩法有：mysql prepared，pear mdb2，权限分配，sql优化分析，备份与恢复数据库，主从同步数据库，innodb事务与外键，存储过程。都是一些很实用的技巧，而这里paperen只具体说说主从同步数据库与存储过程，其他技巧自己去查查资料吧。</p><p>主从同步数据库，这个概念应该很好理解，其实就是集群数据库的概念，在客户端看上去数据库只有一个，但是实质上不止一个，可能是多个数据库在维持，实质上说这个技巧是为了保证web平台的稳定而使用的，paperen觉得这个技巧并不是用来防止数据出错（数据出错站在mysql的层面来看是根本没法避免的，只能靠备份来预防）是为了提高可靠性。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ [转载] 网页的栅格系统设计]]></title><link><![CDATA[ http://paperen.com/post/grid_systems]]></link><guid isPermaLink="false"><![CDATA[ 64]]></guid><pubDate><![CDATA[ 2011-01-25 10:22]]></pubDate><description><![CDATA[ <p>先声明一下，这篇文章转载至TaobaoUED博客，还是一篇很旧的文章，但旧不要紧paperen觉得值得分享所以就转载了。原文url <a href="http://ued.taobao.com/blog/2008/09/17/grid_systems/" target="_blank">http://ued.taobao.com/blog/2008/09/17/grid_systems/</a> &nbsp;或者你还没有了解过栅格这个名词，但不要紧通过这篇文章你就能了解到栅格在web设计上的应用，好文章值得转，好技能值得你拥有，so，paperen决定转载这篇文章，第一次转载（paperen连图片也截下来了）。</p><p><a href="http://paperen.com/file/125" class="post-image thumbnail"><img src="http://paperen.com/file/125" alt="20110125094921" title="上传于2011-01-25"></a></p><p>栅格系统的形成<br /></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ IDE中你最喜爱的字体是哪个]]></title><link><![CDATA[ http://paperen.com/post/font-of-IDE]]></link><guid isPermaLink="false"><![CDATA[ 63]]></guid><pubDate><![CDATA[ 2011-01-21 09:46]]></pubDate><description><![CDATA[ <p>理论上说这是一篇提高我们写代码时的幸福感的文章，you know~paperen也对这个捣腾了许久，好的IDE是会让你写起代码来更加顺手，而当你找到了你喜爱的IDE后是否有想过将代码的字体也改得更好看更舒服一点，那敲起代码来就更舒服了，对眼睛也更好一点，you know有一句话是没错的“代码如诗”……</p><p>当然啦，这个话题是无关任何语言平台的，关乎的只是代码的外表美，嗯~确实比较肤浅……you see，paperen目前习惯使用的IDE是netbean+dreamweaver，前者写php代码后者写css与js，一直都习惯这样做的了，paperen很喜欢netbean但是代码的字体总不是那么好看……相对于dreamweaver而言，在dreamweaver中如果你的文件编码是utf8的话它默认使用的字体是Courier New的，如果你的编码是gbk/gb2312的话那么默认的字体就是宋体，但是paperen倒是觉得宋体下的英文难看了。</p><p>下面先放出一个paperen测试过程中试用的字体，你可以在里面选择你觉得顺眼的对比对比。paperen目前的首选字体是Courier New 15号的，而dw中也是Courier New 12pt，感觉雅黑怎不太好看呢，有点失望，难道是paperen的雅黑字体是盗版的……</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于smtp发送邮件一些东东]]></title><link><![CDATA[ http://paperen.com/post/mail-via-php]]></link><guid isPermaLink="false"><![CDATA[ 61]]></guid><pubDate><![CDATA[ 2011-01-15 13:37]]></pubDate><description><![CDATA[ <p>最近paperen公司的那个搞了一年的东西也差不多可以拿出来了，至少在数据上可靠了点，界面上就……程序上就更……关于丢失密码的处理会有涉及到给会员的注册邮箱发送邮件功能，其实就是运用了SMTP这个服务。</p><p>正如对PHP函数有了解的人都应该知道PHP中有一个mail函数，直接调用它理论上就可以发送邮件了</p><div class="methodsynopsis dc-description"><span class="type">bool</span> <span class="methodname"><strong>mail</span> ( <span class="methodparam"><span class="type">string</span> <tt class="parameter">$to</tt></span> , <span class="methodparam"><span class="type">string</span> <tt class="parameter">$subject</tt></span> , <span class="methodparam"><span class="type">string</span> <tt class="parameter">$message</tt></span> [, <span class="methodparam"><span class="type">string</span> <tt class="parameter">$additional_headers</tt></span> [, <span class="methodparam"><span class="type">string</span> <tt class="parameter">$additional_parameters</strong></tt> <br />
]] )</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">你能从手册中获得更多例子，这个函数确实是太方便了，以至于paperen一开始也会对它感到神奇，因为实在是搞不清为什么一个函数就能发送一封邮件，直观上看来貌似这个函数能直接跟邮局联系。但实质上它要起作用需要服务器的支持，简单来说你的服务器需要有SMTP 服务。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">很幸运公司的服务器有这个服务，但也很不幸运直接调用mail函数来发邮件的结果并不能让自己满意。当然paperen也找了不少网上提供的发送邮件代码，结果都不是很满意的，有些邮箱能收到有些邮箱收不到，而且绝大部分都是一些主流的邮箱，例如163，126等</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">所以paperen觉得还是有必要自己搞清楚一下这个原理，其实真的没那么神秘。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">或者你开始你需要对smtp有一个基本的了解，paperen貌似以前大学的时候就学过这个，但书上学得确实没有实践中学的劲。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">或者你可以看看以下链接的内容</div><div class="methodsynopsis dc-description"><a href="http://baike.baidu.com/view/5450.htm" target="_blank">http://baike.baidu.com/view/5450.htm</a></div><div class="methodsynopsis dc-description"><a href="http://www.cnblogs.com/scottckt/archive/2007/07/17/820591.html" target="_blank">http://www.cnblogs.com/scottckt/archive/2007/07/17/820591.html</a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">然后动动手试试在"黑屏"下发一封邮件玩玩。下图为telent localhost 25后的界面，可以使用help参数查看命令。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description"><a href="http://paperen.com/file/114" class="post-image thumbnail"><img src="http://paperen.com/file/114" alt="20110113210420" title="上传于2011-01-13"></a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">如果有一台服务器而且有smtp服务的话不妨可以试试，paperen公司里面就有一台对外的服务器可以玩，oy~~不过如果没有服务器也不要紧，你可以使用第三方的smtp服务的，参见下面的例子（使用163的）<br /></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">在cmd下输入 telnet smtp.163.com 25</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description"><a href="http://paperen.com/file/115" class="post-image thumbnail"><img src="http://paperen.com/file/115" alt="20110113210644" title="上传于2011-01-13"></a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">就能登陆到163的smtp服务了，不过首先要使用helo命令打个招呼先</div><div class="methodsynopsis dc-description"><br /></div><pre>220 163.com Anti-spam GT for Coremail System (163com[20101010])<br />helo paperen<br />250 OK<br />auth login<br />334 dXNlcm5hbWU6<br />//你帐号的base64码<br />334 UGFzc3dvcmQ6<br />//你帐号密码的base64码<br />235 Authentication successful<br />mail from:<paperen@163.com><br />250 Mail OK<br />rcpt to:<paperen@gmail.com><br />250 Mail OK<br />data<br />354 End data with <CR><LF>.<CR><LF><br />mime-version:1.0<br />from:paperen<paperen@163.com><br />to:paperen<paperen@gmail.com><br />subject:test<br />content-type:text/html; charset="utf-8"<br />//这里要空两行,1行<br />//2行<br />hello world!<br />.<br />250 Mail OK queued as smtp4,DtGowLCbrgVa+y5N1C9xAA--.11142S2 1294924769<br /></pre><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description"><a href="http://paperen.com/file/116" class="post-image thumbnail"><img src="http://paperen.com/file/116" alt="20110113212115" title="上传于2011-01-13"></a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">其中334两行分别要填写您在163的帐号与密码，而且要用base64码，这个也很容易嘛，可以用php中的base64_encode函数帮你或者用在线工具 <a href="http://tool.114la.com/base64.html" tartget="_blank">http://tool.114la.com/base64.html</a> &nbsp;复制后在黑屏里面右击粘贴就可以了，也不用自己照着输入。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">后面其实也就没什么了，mail from你懂的，rcpt to也就是要发给谁。不过要注意一下在data后，也就是在写邮件内容前空两行。然后到gmail看看吧。<br /></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description"><a href="http://paperen.com/file/117" class="post-image thumbnail"><img src="http://paperen.com/file/117" alt="20110114091637" title="上传于2011-01-14"></a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">这就使用命令行模式下成功发送了一封邮件了，这就是发送邮件的原理。Of course~光来点英文的信件也没神马意思，我们就是喜欢玩花样的，或者你觉得"发中文内容还不容易嘛，也是拷贝的功夫"，在黑屏下的确不支持中文输入法的，没错也得用拷贝的方法将中文弄到邮件内容里面去，但别高兴得太早，如果你以为就这么简单那么你就错了，结果发送过来的邮件就是一堆乱码"??????????????????"，N个口……问你死未……</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">其实发中文的关键也在于要对内容进行一下base64加密，并在邮件头加上一个声明</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">Content-Transfer-Encoding: base64</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">那么发送的内容就ok了，不过至于邮件的标题嘛，详见下面，因为标题处有些少复杂，需要加上一些字符来标识。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">所谓懒惰是动力是对的，想象一下如果我们都是在命令行下发送邮件的话……发一封邮件少则需要15分钟，多则半个小时……这真的让人崩溃了，就连paperen自己面对着这个黑屏状态敲着无数遍重复的命令也快要崩溃了（还不能输错，paperen不知道如何删除之前的输入……只能覆盖而且覆盖后的命令会乱码的，你试试看就明白），就写一个程序让它帮我们发送邮件好了。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">下面开始来更爽的，就是搞一个发邮件的php程序。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">或者在开始之前你需要了解关于socket的知识 &nbsp;<a href="http://baike.baidu.com/view/13870.htm" target="_blank">http://baike.baidu.com/view/13870.htm</a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">简单来说socket就是ip+端口号的意思，你需要跟其他机子交流你需要链接到正确的端口号上并且该端口号应该有进程在接收与处理数据，或者大概就是这个意思吧~~而正如在命令行下操作发送邮件，我们首先要做的就是要连上smtp服务器，然后再输送命令与数据，所以我们第一步是要连接到服务器smtp服务监听的端口上，163的就是25。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">php内置关于socket操作的函数也够全面的了，自己可以在手册中输入socket看看。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">对于连上163的smtp，首先使用的是fsockopen（<span class="dc-title">Open Internet or Unix domain socket connection</span>）打开一个socket连接，fsockopen返回的是一个资源类型的数据，换言之可以使用fgets来获取在socket上传输的数据。</div><div class="methodsynopsis dc-description"><br /></div><pre>$smtp_server = 'smtp.163.com';<br />$smtp_port = '25';<br />$fp = fsockopen( $smtp_server , $smtp_port );<br />echo fgets( $fp );<div class="methodsynopsis dc-description">//220 163.com Anti-spam GT for Coremail System (163com[20101010])<br />fclose( $fp );<br /></div><div class="methodsynopsis dc-description"><br /></pre><div class="methodsynopsis dc-description">既然可以这样搞，故下面的代码就明了，注意的是可能需要判断一下服务端返回的状态，是否错误，是否可以继续。不过在这个例子中paperen就不写这么严谨了，毕竟最后会分享一个摘自uchome的利用socket发送邮件的函数。</div><pre><br /><div class="methodsynopsis dc-description">$username = '***';//您邮箱的帐号，@前面的<br />$password = '***';//密码<br /><br />$from = 'paperen@163.com';//寄信人邮箱<br />$to = 'paperen@gmail.com';//收件人邮箱<br />$smtp_server = 'smtp.163.com';//smtp服务器<br />$smtp_port = '25';//端口<br />$message = "Hello paperen,i use php send a mail to you,very cool yet?";//邮件内容<br />$subject = "Test Only";//邮件标题<br /><br />set_time_limit(0);<br /><br />$fp = fsockopen( $smtp_server , $smtp_port );<br />if( substr( fgets( $fp ), 0, 3 ) != '220' ) exit('connect error');<br /><br />//hello<br />fputs($fp, "helo 163\r\n");<br />if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('helo error');<br /><br />//auth login<br />fputs($fp, "auth login\r\n");<br />if( substr( fgets( $fp ), 0, 3 ) != '334' ) exit('user error');<br />fputs($fp, base64_encode( $username ) . "\r\n" );<br />if( substr( fgets( $fp ), 0, 3 ) != '334' ) exit('pwd error');<br />fputs($fp, base64_encode( $password ) . "\r\n" );<br /><br />//auth success<br />if( substr( fgets( $fp ), 0, 3 ) != '235' ) exit('auth failed');<br /><br />//mail from<br />fputs($fp, "mail from:&lt;{$from}&gt;\r\n" );<br />if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('mail from error');<br /><br />//rcpt to<br />fputs($fp, "rcpt to:&lt;{$to}&gt;\r\n" );<br />if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('rcpt to error');<br /><br />//data<br />fputs($fp, "data\r\n" );<br />if( substr( fgets( $fp ), 0, 3 ) != '354' ) exit('data error');<br /><br />//header<br />$headers = "mime-version: 1.0\r\n";<br />$headers .= "from: paperen&lt;{$from}&gt;\r\n";<br />$headers .= "to: paperen&lt;{$to}&gt;\r\n";<br />$headers .= "subject: {$subject}\r\n";<br />$headers .= "content-type: text/html; charset=utf-8\r\n";<br /><br />fputs($fp, "{$headers}\r\n\r\n" );<br />fputs($fp, "$message\r\n");<br />fputs($fp, ".\r\n");<br /><br />if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('sendmail failed');<br />echo 'OK';<br /><br />fclose( $fp );<br /></pre><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description"><a href="http://paperen.com/file/118" class="post-image thumbnail"><img src="http://paperen.com/file/118" alt="20110114205835" title="上传于2011-01-14"></a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">就是这么简单就可以用php帮你搞掂，是不是很cool~</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">下面附带自己在uchome摘出来的一个sendmail函数，具体配置需要自己根据自己需求修改才可以发送，paperen测试过gmail，163，126，sina，hotmail，qq均可以收到邮件。</div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">关于中文标题与内容乱码的问题自己参照sendmail这个函数中看吧，看完你就明白了，主要是43行到53行的代码要看看。</div><div class="methodsynopsis dc-description"><br /></div><pre>$email_subject = '=?' . $mail['charset'] . '?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$mail['sitename'].'] '.$subject)).'?=';<br />$email_message = chunk_split(base64_encode(str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $message))))));<br /><br />$headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: ". $mail['sitename'] ."{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/html; charset=" . $mail['charset'] . "{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";<br /></pre><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">下载地址 <a href="http://paperen.com/demo/mail/sendmail_uchome.rar" target="_blank">这里</a></div><div class="methodsynopsis dc-description"><br /></div><div class="methodsynopsis dc-description">呼·~~好不容易才写完一篇，希望对使用php发送邮件或者想玩玩底层发邮件的你有点帮助吧</div></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 多少]]></title><link><![CDATA[ http://paperen.com/post/howmuch]]></link><guid isPermaLink="false"><![CDATA[ 60]]></guid><pubDate><![CDATA[ 2010-12-23 08:56]]></pubDate><description><![CDATA[ <p>“用多少天用多少年的跌跌撞撞才找到終點”，越成長就越喜歡陳奕迅的歌，發覺每首歌都好好聽。沖涼時唱一個，等公交時哼一段，睡覺前聽一首~~</p><p>不知道不覺得又一年了，時間就是這麼快，畢業已經半年了，還是不時地想念宿舍的弟兄們，paperen想他們大概也變了，跟大學的朋友交流也越來越少了，偶爾在綫上聊幾句，一開始還有給部分人發短信報告一下自己的生活，電話一開始也有打過，但是漸漸的就少了，paperen不知道能不能用越來越陌生來形容，但是在paperen認為不至於陌生，因為再碰到他們的時候可能不如大學的那樣青春了那樣單純了，但是在paperen腦中他們還是我在大學認識的他們，而paperen還是他們在大學認識的paperen……</p><p>冬至到底是什麼一個節日，聖誕節，元旦，paperen對節日沒什麼感覺，只對放假敏感…聖誕節夜晚的街上應該挺美的，假的聖誕樹，繽紛的燈泡，但對於paperen來說也就是一轉眼過去的東西。晚上回蝸搭的差不多都是末班車，一直喜歡坐在最後的位置，靠著窗，有時後會對著車窗發呆有時候會在做手指操…而看著外面不斷後退的街道與途人，還是能清晰地告訴我“這裡是深圳，這個是繁華的城市”。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 稍微高级一点的SQL注入]]></title><link><![CDATA[ http://paperen.com/post/sqlinjection-again]]></link><guid isPermaLink="false"><![CDATA[ 59]]></guid><pubDate><![CDATA[ 2010-12-10 10:24]]></pubDate><description><![CDATA[ <p>正如之前paperen的 <a href="http://paperen.com/archive/did-you-handle-the-datas" target="_blank">你是这样处理来自$_GET的数据吗</a> 里面说的，还有很久之前的 <a href="http://paperen.com/archive/sql-inject/" target="_blank">小心sql注入漏洞</a> ，都是涉及到SQL注入的一些东西，其实您如果对SQL注入有兴趣的话不妨点击paperen友情链接中的习科论坛去那看看，里面很多帖子都是有关入侵的，而paperen在这个组织不知不觉间也都快4年了。废话也就不多说了，直接入话题。</p><p>还记得在“你是这样处理来自$_GET的数据吗 ”里面写到的那个SQL，</p><pre>$sql = 'select * from goods where id='.$id;</pre><p>不对传入来的数据进行任何过滤甚至不用单引号抱起来会导致的问题在那篇文章中已经说的比较明确了，如果您能猜到数据库其他表的话还能查到其他表的内容，而这次paperen想说一些使用这个漏洞更高级的一个技巧。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 最近碰到的一些WEB安全问题]]></title><link><![CDATA[ http://paperen.com/post/about-safe-of-theweb]]></link><guid isPermaLink="false"><![CDATA[ 58]]></guid><pubDate><![CDATA[ 2010-12-09 20:24]]></pubDate><description><![CDATA[ <p>近来paperen总想写点东西但又写不出来，每月一篇还真"月经"似的……最近对公司的WEB项目进行一些安全测试，又提及到一些WEB安全的问题，改了那个烂摊子差不多半年了才终于来到了安全测试的份上，阿叔用了不少软件来检测这个web项目，结果正如paperen想象中一样，N多漏洞提示。之前的代码写得确实不太严谨呢，对一些参数就明显没有过滤，这样导致的问题会比较严重，比如一个叫Cross Site Scripting的漏洞(就是一个能注入javascript的漏洞无论在URL还是提交的表单里面注入)，严重的是SQL Inject漏洞(sql注入是在参数中构造特殊的字符串从而爆出数据库重要信息或者能执行一些危险的操作)，除了程序本身导致的漏洞外还有一些服务器配置的漏洞也需要修复，但是60%的漏洞主要是由程序导致的，这确实是程序员要明白的，一个好的web程序不应该只是从可运行性上去分析，重视质量你会得到更多。<br /></p><p>阿叔使用了好几个测试工具，其实测试出来的结果基本都是差不多的，以下的漏洞主要是使用一个叫iiscan(亿思公司的)的来扫描站点得到的漏洞报告，还是蛮不错的。</p><p>在此说下碰到的几个漏洞。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ GooMa[纯属恶搞]]]></title><link><![CDATA[ http://paperen.com/post/gooma-orz]]></link><guid isPermaLink="false"><![CDATA[ 57]]></guid><pubDate><![CDATA[ 2010-11-10 09:10]]></pubDate><description><![CDATA[ <p>前几天paperen跟一位也是从事php行业的朋友聊天，之后他向paperen展示了他做的一个物质系统，那数据确实蛮多的，远程过去看他玩了会，paperen就看中了那个搜索提示功能，咦！当输入中文的时候也可以有提示哇~~从而又想起前前几天一位从事java的朋友问paperen一个中文索引的问题，咦！当时不就是想到一个如何对姓名排序的问题，就像paperen部索爱W550C的电话簿中输入L会找到李，梁的姓，当时看到那个搜索提示觉得很神奇(虽然google的时候也经常是有了……但是你总不能给google发个邮件问问你首页那个搜索提示是咋整的捏吧)，paperen一直是以为用数据库来做这个功能，但是那位朋友说了一个神奇的功能“中文转拼音”。wow~~这次赚了，所以就有了这个“姑妈”啦。</p><p>中文转拼音的源代码去google一下就大把，这里随便放个链接，<a href="http://code.google.com/p/sukulaqiuplugins/source/browse/trunk/php中文转拼音（用于url）/py.php?r=26" target="_blank">猛点here</a></p><p>good！总而言之，是一堆比较长的代码，看不懂就当养养眼吧。下面放出demo地址-<a href="http://paperen.com/demo/gooma/" target="_blank">猛点here</a>，压缩包地址-<a href="http://paperen.com/demo/gooma/Demo.rar">猛点here</a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ js日历控件 扒自Discuz]]></title><link><![CDATA[ http://paperen.com/post/calendar-in-discuz]]></link><guid isPermaLink="false"><![CDATA[ 56]]></guid><pubDate><![CDATA[ 2010-10-17 14:11]]></pubDate><description><![CDATA[ <p>一直一直以来就想整理出一个js控件，每次paperen要弄js日历控件就得上网找，当然jquery-ui的可以但是又觉得貌似需要的引擎有点多本身就需要jquery的框架又要引入ui的js文件还有图片与css，重要的是它那个改起来不会……而一些不兼容浏览器的控件也有（干脆就不用了不兼容不能拉出来见人的）。而今天终于有机会让paperen我扒了discuz的下来（在ie，火狐，opera下测试没问题，其他的就不知道了），并最终整合到只有一个js文件就能调用，当然也需要一些css文件的支持，不然会不好看。</p><p>DEMO地址 <a href="http://paperen.com/demo/js-calendar/" target="_blank">http://paperen.com/demo/js-calendar/</a></p><p><a href="http://paperen.com/file/75" class="post-image thumbnail"><img src="http://paperen.com/file/75" alt="20101017140222" title="上传于2010-10-17"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ uchome中提示框的调用]]></title><link><![CDATA[ http://paperen.com/post/tipbox-in-uchome]]></link><guid isPermaLink="false"><![CDATA[ 55]]></guid><pubDate><![CDATA[ 2010-10-07 11:26]]></pubDate><description><![CDATA[ <p>众所周知的事情，discuz的产品是被广泛使用的，大部分论坛都是使用discuz的，而uchome也作为discuz在sns领域的产品被广泛使用，充分扩展了论坛用户的联系，从一个论坛变为一个社区。而且关键是源代码公开的，也就是说你可以看它的代码并根据自己需要加入自己的代码与二次开发，或者二次开发discuz的产品能被作为php程序员的基本技能之一。</p><p>最近，也不能说是最近了……近一个月……paperen研究了uchome，虽然也并没有把所有功能都看完，但是整体的模式还是明白了，有MVC的味道。paperen主要看了cp.php与space.php的代码，还有它是如何处理ajax的请求的。而paperen发的这篇博文的主题就是一个很简单ajax的运用。</p><p><a href="http://paperen.com/file/73" class="post-image thumbnail"><img src="http://paperen.com/file/73" alt="20101007104820" title="上传于2010-10-07"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 你是这样处理来自$_GET的数据吗]]></title><link><![CDATA[ http://paperen.com/post/did-you-handle-the-datas]]></link><guid isPermaLink="false"><![CDATA[ 54]]></guid><pubDate><![CDATA[ 2010-09-17 20:51]]></pubDate><description><![CDATA[ <p>最近看恶心代码太多了，也写了太多垃圾代码了……真是哦弥陀佛……感觉paperen变垃圾……</p><p>唉~~不多说了，直接开始正文算了。放代码，对比一下下面两个sql变量，然后入库查询，你觉得有问题么？</p><pre>$id = isset($_GET['id']) ? $_GET['id'] : '';<br />if ($id) {<br />	$sql = 'select * from goods where id='.$id;<br />	echo $sql.'<br />';<br />	<br />	$r_1 = $db-&gt;select($sql);<br />	print_r($r_1);<br />	<br />	echo '----<br />';<br />	<br />	$sql = "select * from goods where id='$id'";<br />	echo $sql.'<br />';<br />	<br />	$r_2 = $db-&gt;select($sql);<br />	print_r($r_2);<br />	<br />	echo '----<br />';<br />}<br /></pre><p>表面上看上去都是可以的，当test.php?id=1时输出sql这个变量都是一样的，但是如果我随意改变一下这个id呢？改为test.php?id=1 or 1=1，你就会看到区别了。<br /></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 传说中的SPL]]></title><link><![CDATA[ http://paperen.com/post/legend-of-spl]]></link><guid isPermaLink="false"><![CDATA[ 53]]></guid><pubDate><![CDATA[ 2010-08-31 17:52]]></pubDate><description><![CDATA[ <p>SPL，PHP 标准库（Standard PHP Library），paperen之前在《PHP高级程序设计：模式、框架与测试》一书中就见过这个词，但是那时貌似没有认真对待它，而今天paperen再重新查阅了spl相关的资料，证实了一样东西“值得一试并值得加以融入到以前的编码模式中”。放在前面，本文并不是要详说spl中的具体东西，而是纯属个人吹水……</p><p>可能您也没怎么了解有关spl的东西，但是建议您不妨查阅一下资料，在google输入php spl您会得到一些很吸引人的标题，比如“PHP SPL，遗落的宝石”，确实值得您浏览一番滴~~</p><p>”spl从 PHP 5.0 起内置的组件和接口，并且从 PHP5.3 已逐渐的成熟“，但目前spl貌似没怎被开发使用。当然啦，在使用spl之前还是得需要一定的代码基础，因为大部分都是与类或者接口打交道的，如果您连什么叫类都不是太清楚的话，相信阅读手册会可能会有点困难，您至少需要有些少oop（Object Oriented Programming）面向对象的基础。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 换行符与header]]></title><link><![CDATA[ http://paperen.com/post/br-and-header]]></link><guid isPermaLink="false"><![CDATA[ 52]]></guid><pubDate><![CDATA[ 2010-08-13 09:08]]></pubDate><description><![CDATA[ <p>顶~~N久没发表东西了，近来paperen除了工作还是工作，paperen对于公司目前的项目管理有一大堆意见~~不过新来就不要太激进了，前段时间已经因为自己对于目前开发的那个项目首页的性能而弄了一个小会，我提的意见主管老是说好，但是结果还是没有落实，唉，算啦~~竟然他们都不理会，paperen会用代码与实例来证明给他们听的啦。</p><p>今天自己将本机中的后台代码传上本地网络的一台测试服务器上（因为他们要在局域网中测试项目），但是遇到了一个header的问题，让paperen郁闷了一会。自己用下面这个函数来重定向（有js模式的重定向与直接使用header），比如后台某些操作成功后会自动跳转之类的功能，当然也会直接跳转。</p><pre>function dheader($location, $isjs = false, $timer = 1){<br />    if(empty($location)) return '';<br />    if($isjs){<br />        $timer = $timer*1000;<br />        echo "&lt;script type='"text/javascript"'&gt;setTimeout("window.location.href='$location'", $timer);&lt;/script&gt;";<br />    }else{<br />        header("location:$location");<br />        exit();<br />    }<br />}<br /></pre><p>而结果在直接header时总出现警告。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ paperenblog源代码下载]]></title><link><![CDATA[ http://paperen.com/post/paperenblog-source]]></link><guid isPermaLink="false"><![CDATA[ 51]]></guid><pubDate><![CDATA[ 2010-07-23 08:59]]></pubDate><description><![CDATA[ <p>之前都有想过将paperen的博客开源，不过最近到了深圳空余时间就越来越少了，而今天终于提早来公司将paperen的博客发布了。</p><p>本博客是PHP的，默认数据库为mysql。因为最近paperen的在线时间实在太少了，住的地方还没办上网，所以目前没有安装程序，也就说需要手动配置一下，请大家按照以下步骤进行手动配置。</p><p>将paperenblog.rar解压后：<br /><br />1.登录到您的数据库并新建一个数据库，如果之前有数据库的话可以跳过这步（比如您现在新建了一个叫paperenblog的数据库）</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 无题]]></title><link><![CDATA[ http://paperen.com/post/untitled]]></link><guid isPermaLink="false"><![CDATA[ 50]]></guid><pubDate><![CDATA[ 2010-07-20 08:39]]></pubDate><description><![CDATA[ <p>毕业了上工作了就真的不一样，对于paperen来说好像每天都是为了工作，而生活对于paperen来说也就是花在公交车上与吃饭睡觉的时间而已，一切一切都很单调，在深圳我目前没有任何朋友。这些天在深圳的日子给paperen的感觉也真的够复杂的了，貌似离开了青岛就仿佛一下子从自己的生活中失去了半个世界，之前4年来都离不开我眼中的舍友们与学校的朋友们，paperen的大学就是这样一下子过去了。</p><p>当初6月30日离开了学校，然后7月1日离开了青岛，记得30日那天下午paperen是宿舍第一个离开的，本来觉得应该不会太激动的，但是在临离开宿舍的一刻感情爆发了……真的很不舍得大家，与paperen一起回广东的智同学还竟然为自己落泪感到惊奇~~或许确实应该惊奇~~</p><p>唉，放个排比句感叹一下~那些可以约几个朋友去踢球的日子啊~那些可以与舍友一起玩游戏的日子啊~那些可以听着高频课看课外书的日子啊~生活现在都是由自己说了算，早上7点起床然后去搭公交，8点多到公司然后就一直待到晚上的8点才回“蜗”，9点多回到“蜗”冲凉然后看会书就ZZZ了，嗯，偶尔也用手机放几首歌来唱唱那也就是唯一的娱乐方法了。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 一个图片展览的效果]]></title><link><![CDATA[ http://paperen.com/post/js-pic-exhibition]]></link><guid isPermaLink="false"><![CDATA[ 49]]></guid><pubDate><![CDATA[ 2010-07-08 01:32]]></pubDate><description><![CDATA[ <p>越来越觉得在网站开发中，前端的效果最不能忽视，包括用户体验与交互效果，当然还有CSS等等，刚看完了一本叫《Don't make me think》的书，说的是关于WEB用户体验等方面的东西，我们如何选择首页的说明文字，如何让浏览者不会在你的网站中迷失，如何让浏览者迅速了解你的网站，原来都是很有学问的~~总之也不简单，慢慢领会吧。</p><p>paperen也很久没发东西了，趁着有空，做了个图片展览的东西，还勉强过得去吧。</p><p><a href="http://paperen.com/file/53" class="post-image thumbnail"><img src="http://paperen.com/file/53" alt="20100708005248" title="上传于2010-07-08"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 新版博客的面世]]></title><link><![CDATA[ http://paperen.com/post/newblog]]></link><guid isPermaLink="false"><![CDATA[ 48]]></guid><pubDate><![CDATA[ 2010-06-17 16:16]]></pubDate><description><![CDATA[ <P>paperen终于在休闲中完成了新版博客，关于新版博客的皮肤趋向于简单型吧……paperen的美工功底也就那个水平~~~现在自己看了几眼怎又觉得以前那个皮肤貌似挺不错的~~~不过既然都做好新版的就先试用着吧，在这个版本的博客中paperen也重整了文件框架与程序的框架，应该为了以后的扩展性做了一些准备，包括皮肤的更换还有插件的引入。</p><P>对于日后可能会将旧皮肤做回来，因为paperen也为此想好了。一般来说还皮肤肯定需要更改视图文件，但是应该不会涉及到模型文件，目前使用的皮肤是blue，而当制作了新皮肤后在皮肤目录下建立一个新文件夹。</p><P>1.关于换肤功能，paperen在程序中对于视图的路径思路是这样的</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于网站打开速度那点事]]></title><link><![CDATA[ http://paperen.com/post/about-the-speed]]></link><guid isPermaLink="false"><![CDATA[ 47]]></guid><pubDate><![CDATA[ 2010-06-11 10:40]]></pubDate><description><![CDATA[ <P>最近paperen我主要是在做新的博客，当然也会与宿友们打打机，所谓好好利用剩下的大学时间嘛~~而新博客也差不多了，前台基本可以了，现在正在修理后台。而在重修程序与整改的过程中确实也会有不少收获与进步，比如站点的框架，还有站点的性能上。?</p><br />
<P>而目前对于paperen而言，网站的性能主要是体现在站点打开速度上吧，固然这里说到的提升性能也只是程序上的方法，因为paperen对于服务器的配置真的接触得很少，什么图片与站点放在不同的服务器上，这种服务器上的部署paperen我就知道得很少了。所以如果您是想了解服务器方面提升站点性能知识的话，这篇东西应该就不是您所需的了，而此文章也不包括实际代码，或者以后会加上一些例子。?</p><br />
<P>首先paperen我想问问各位对于网站速度慢有什么看法？一个打开非常慢的网站是不会受欢迎的，苛刻地形容，如果你的网站在3秒后才能打开浏览者可能在2秒的时候就会叉掉，或者在1秒的时候就会叉掉……每个浏览者都喜欢快感，你不要让他们等得太久，也不要期望他们会去等待3秒，哪怕是1秒，paperen现在的博客在宿舍的环境中（805Kbps，有几个人在玩网游，有一个人在看视频）打开首页需要5，6秒。额……paperen我也不知道会不会曾经有浏览者会因为这个而停止访问我的博客，不过5，6秒这个也确实有点慢了，所以计划在新博客中将速度提升一下或者弥补一下。我们要知道让浏览者等待一秒是什么概念，更不用说让他们再等待多一秒了。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 两个Correcting Orphans的方法]]></title><link><![CDATA[ http://paperen.com/post/two-ways-correcting-orphans]]></link><guid isPermaLink="false"><![CDATA[ 46]]></guid><pubDate><![CDATA[ 2010-05-30 01:15]]></pubDate><description><![CDATA[ <P>哇塞！看到这个题目或许就让人糊涂……连paperen自己都看不懂是什么意思，“更正孤儿”其实这是一个关于css布局的问题，例如你想做一个效果是，左边是一张小图片右边是一堆文字，就是半图半字的布局，那么这篇或许正是你需要的。?</p><br />
<P>在paperen琢磨自己新设计的皮肤时，也抽点空先尝试一下设计图中一些布局中的css技巧，而也正是有使用这个布局的地方，而在sohtanaka的博客那也找到了一篇关于这个css技巧的文章，而文章名字就是Correcting Orphans，paperen所以在这里也用了这个名字，所谓站在巨人肩膀上嘛~~?</p><br />
<P>解决方法1：sohtanaka说的?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 一个上传文件的Class]]></title><link><![CDATA[ http://paperen.com/post/upload-class]]></link><guid isPermaLink="false"><![CDATA[ 45]]></guid><pubDate><![CDATA[ 2010-05-16 23:14]]></pubDate><description><![CDATA[ <P>今天终于算是可以来更新一下paperen的网站，嗯……因为写毕设论文写累了所以就发表一篇关于上传文件类的东东吧，这个类也是自己写的，不知道对大家有没有用，如果觉得可以就拿去用吧。不过在编码上面还是没做好，自己是在utf8的页面将数据进行提交的，所以生成的文件如果保持原来的中文名字的话在文件夹中看到就是乱码的名字，如果不想出现乱码的话需要进行一下编码的转换。?</p><br />
<P><A href="http://paperen.com/demo/fileuploadclass/">代码地址?</A></p><br />
<P>随便说下这个类怎样调用吧，方法很简单?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ IP To Location]]></title><link><![CDATA[ http://paperen.com/post/ip-to-location]]></link><guid isPermaLink="false"><![CDATA[ 44]]></guid><pubDate><![CDATA[ 2010-04-18 23:07]]></pubDate><description><![CDATA[ <P>IP to location就是ip地址转为实际地址啦，近来paperen在公司的一个任务是做一个叫防同行的插件，其实就是实现网站屏蔽被某个地区ip或者城市，甚至是国家的人浏览的功能，在网页中放上一个script的调用就可以，在这个项目中paperen终于体会到大数据量的数据库是怎样一回事……嗯……多余的就不说太多了，直接说这个iptolocation算啦。(声明一下这篇文章的IP to location并不是在公司那个项目所使用的技术)?</p><br />
<P>今天为博客加上了一个接口，功能只是来获得浏览者的所在地，这个接口的实现主要难在实现ajax跨域，而数据主要是使用了www.webxml.com.cn的webservices来获得，它的接口的地址是</p><P><A href="http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=127.0.0.1">http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=127.0.0.1</A></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 岁月的童话]]></title><link><![CDATA[ http://paperen.com/post/only-yesterday]]></link><guid isPermaLink="false"><![CDATA[ 43]]></guid><pubDate><![CDATA[ 2010-04-11 01:51]]></pubDate><description><![CDATA[ <P>其实是不想起这么深奥的一个标题的，但是此时此刻在听着罗嘉良的这首歌，记得这是以前翡翠台那部叫流金岁月电视剧的主题曲，paperen我最喜欢一开始口哨这段，听着这个旋律真的让我觉得岁月在流逝，还有想起了以前那些珍贵的时刻。?</p><br />
<P>今天确实点累了，好不容易才到了周末，本来下午也开始放假的，但是还是选择在公司度过，开发部的人员都在，他们都好勤奋，或者说做技术的都是这样吧。感觉paperen的工作已经开始慢慢上轨，这周也完成了几个分任务而目前还有一个个人项目在做。而这七天来paperen貌似都在重复一个节奏，生活貌似确实是很单调，下班了回来就是对着四面墙。?</p><br />
<P>paperen我真的是很难给自己定义一个生活标准，也很难去改变什么，即使明明觉得单调但是还继续这样下去，改变自己这个动作在我的字典中好像就是不存在，无聊的时候对着镜子看着里面的那个自己，paperen我是想成为一个综合能力很强的web developer，想做很多很多好的网站，这些就是我想到的目标了，程序员能做一辈子么？写代码能写一辈子么？你是不是会这样问我，其实paperen的答案也是不知道，虽然paperen听得出如果你这样问我的意思是说程序员不能做一辈子，但是我也没说自己会当一辈子程序员嘛，paperen只是想成为一个综合能力强的网站开发者。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于MVC模式]]></title><link><![CDATA[ http://paperen.com/post/about-mvc]]></link><guid isPermaLink="false"><![CDATA[ 42]]></guid><pubDate><![CDATA[ 2010-04-04 01:34]]></pubDate><description><![CDATA[ <P>对于这个三个字母组成的这个专业名词，paperen我就不具体解析太多了，因为自己也不是十分十分的掌握。对于初学者而言或许你不用过分地从这个名词开始你的php之路，但是如果你走在php的道路上时就不可不知道这个名词了，因为这种思想对于开发网站而言是十分有利的，充分体验就是它将一个站点的分离成三个大体部分，M（模型），V（视图）和C（控制器），而正是这样使之可以使用具有不同专长的人员进行整个站点的开发，比如你是一个优秀的网页设计师，那么好简单你的工作就是去写好你的css，js还有html结构，当然他还要学一种模板语言，或者是开发小组自定义的一种模板语言，他不用理会过多关于php的东西甚至数据的组织问题。至于模型应该是算法最为之集中的地方，与数据库交互并处理数据，而这个部分就交由程序工程人员吧，而他们也不用处理任何页面表现的东西。而（C）控制器就是衔接V与M的一个桥梁吧，通过浏览者的动作去触发相应的响应进而通知相应模型获得数据之后再放入视图进行显示，那么一个页面就是如此完成了。?</p><br />
<P>当然啦，开头说了这些都只是一个很模糊的描述，paperen我也不是理解得很深刻，但是看了一下《php高级程序设计》一书还有看了一些开源的代码，也使用过qeephp这个框架就不多不少有了点了解。有这个思想是很重要的，所以在开发中就要向这方面去靠。?</p><br />
<P>对于模板语言，当然你可以使用smarty，还可以自己定义自己的一套，在paperen看的一些开源程序中就经常使用一些正则去将这些模板语言翻译成能被php解析的语言。而显然这一部分是很好理解的，如果真的还是不那么了解你可以去看看phpcms的那些视图文件。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 突然]]></title><link><![CDATA[ http://paperen.com/post/suddenly]]></link><guid isPermaLink="false"><![CDATA[ 41]]></guid><pubDate><![CDATA[ 2010-03-23 00:38]]></pubDate><description><![CDATA[ <P>话说paperen真的好久没更新博客了……这段时间好像都不想写东西了，特别是等待通知的时候心烦得很，根本就不想写东西，而今天也终于写一下吧，因为突然间就上班了，在江门一家公司做，现在还刚开始，他们用的框架是QeePHP，自己啥都不会还得从头开始上手，今天第一天上班，感觉还行吧，不是特别累，但是也是挺累……因为paperen我要看框架文档，要知道怎样用这个框架开发，还有他们也给我一个时间去完成任务，感觉这个公司的内部管理制度还是不错的。而同事们都挺好的，搞技术的都是高手，搞市场的也是高手，而且都很年轻。?</p><br />
<P>今天下午广州那家诺网公司打电话叫我明天去复试，paperen我那时确实挺矛盾的，但是当时就狠心推掉了，因为感觉现在这份工作挺不错的，虽然现在是实习时期工资也不高，但公司还是不错的，先做着看看吧。明早还是要6点起床，工作啊工作啊……?</p><br />
<P>以上内容是写在3月25日的。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ phpcms中那个操作mysql的类]]></title><link><![CDATA[ http://paperen.com/post/mysql-class-in-phpcms]]></link><guid isPermaLink="false"><![CDATA[ 40]]></guid><pubDate><![CDATA[ 2010-03-06 23:36]]></pubDate><description><![CDATA[ <P>今天早上才发表了一篇，下午paperen我趁着有空又回头去看了下个phpcms的代码，一直看到晚上，当然啦，这次再看又有了不少收获，有些地方理解更加深刻了，或许paperen说的学习php的好办法就是在动手与读代码中循环进行的。?</p><br />
<P>不说太多废话了吧，这次挖了它操作mysql的那个类过来解剖，这个类用起来还真是相当的方便啊。让我们来see see到底是怎样使用吧。不过在你看下面的东西时先声明一下单这个类的代码就有240多行。paperen我会在下面慢慢说的。?</p><br />
<P>一开始肯定要定义一系列数据库相关的常量与require这个文件过来。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ oop思想去建造网站]]></title><link><![CDATA[ http://paperen.com/post/use-oop]]></link><guid isPermaLink="false"><![CDATA[ 39]]></guid><pubDate><![CDATA[ 2010-03-06 17:02]]></pubDate><description><![CDATA[ <P>话说paperen都N久没写东西了，这段时间都是在折腾，昨天才从广州折腾回来，感觉生活有时候真是很累很累……工作都是要求你会框架，会改造一些开源东东，确实自己这方面还是不行啊，oop这种思想也不经常使用，或许是自己懒吧，当习惯了以前那种编码风格后老是照着那种模式去编，而没有再去研究一些更好的方法，例如大家推荐的oop风格与框架开发。?</p><br />
<P>昨晚看了一些书，也得到了一些启发。其实对于php中类的概念与c++中的类是差不多的，应该说几乎一样吧，不过php的class不支持多重继承，书中说你可以使用接口去弥补，不过这里多余的东西就不多说了。?</p><br />
<P>记得paperen之前那篇解析自己是怎样写php网站的文章吧，思想是很简单的，统一入口index，在index页中判断传入的参数决定给予浏览者哪个页面与应该调用哪个相应的处理文件（一般都要写写.htaccess文件来完成网址重写的功能），例如首页是index.inc.php（这里就paperen我就叫处理文件吧）在这里面可以处理一些与数据库交互的操作与运算，然后再调用需要的文件（视图文件）index.tpl。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 在网页设计中使用圆角形]]></title><link><![CDATA[ http://paperen.com/post/use-radius-in-webpage]]></link><guid isPermaLink="false"><![CDATA[ 38]]></guid><pubDate><![CDATA[ 2010-02-23 00:40]]></pubDate><description><![CDATA[ <P>新年就这样过去了，其实paperen都觉得新年好像越来越没意思，都是与亲戚们到处吃饭，自己还是喜欢吃家里的饭，而且到外面吃paperen我一定吃不饱的……最近几天聚会也很多，加上前天服务器维护所以导致今天才能写写文章。?</p><br />
<P>话说N久之前paperen我就想在网页中使用圆角形来做，看过一些css书中也有相关介绍，某些做法也是很麻烦的，对html结构很不好，而如果大家有对css3有了解的话也知道css3中已经有支持圆角形的css了，只不过不是每个浏览器都能解析，特别是ie，也就是说你还是得安安分分想其他办法去应付ie浏览器中的圆角形效果，而这里也稍微说说自己曾经与现在制造圆角形的方法。?</p><br />
<P>因为对于css3的圆角形的css代码普遍不被支持，所以paperen一般还是使用图片来制造圆角形的效果。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 年三十杂文一篇]]></title><link><![CDATA[ http://paperen.com/post/essays]]></link><guid isPermaLink="false"><![CDATA[ 37]]></guid><pubDate><![CDATA[ 2010-02-13 14:28]]></pubDate><description><![CDATA[ <P>今天差不多十一点才起床，还是冷点睡得舒服，家这边的天气确实也挺离谱的，前几天是夏天而过了一夜就成冬天，不过老实说paperen我还是喜欢冬天，不知不觉又到了新年，自己还没去找工作呢，前段时期的任务还没有完成，感觉这段时光是在真正的休息似的，专科的朋友们都已经上岗位半年了，而自己现在就要面临找工作了，看他们的工资也不低，不知不觉间又问了一句“其实读专科与读本科有什么区别呢……”，又仿佛觉得中国的教育实在不是那么的靠谱。?</p><br />
<P>当然啦，看到别人在努力为了未来奋斗的时候也会提醒自己要做些东西，不过那种感觉很怪，你看到他们有工作了，又觉得自己也应该要有份工作，因为好像大家都认为读完四年的最好而且最光荣的成就就是能找一份工资高的工作，而paperen的一些朋友甚至是老师也一直很看好我，说我一定一定要找份很好的工作，要成为怎么样……我也搞不清那是给我的支持还是压力，而妈妈前段时间也不停在拉关系，paperen我也跟她说很多次我不想靠她所谓的人际关系去获得所谓高薪而且高福利的工作，但是我也没给她表明我能找到一份什么样的工作，而paperen觉得自己也是一名死干活的，当不了干部当不了管理，或许那也是宿命，爷爷，爸爸都是那样的人，不过我一直以他们为榜样，我觉得自己就是应该当那样的人，虽然妈妈说我们是不思进取，但是我还是觉得追求自己的理想与兴趣是很令人幸福的事情。?</p><br />
<P>自己对生活的理解似乎越来越深刻，paperen我明白活着并不是去混日子，而是应该去追求什么，而生活好像真的不是一件很轻松的事情，而快乐也是要自己去追求的，而不是像小时候的那样能嬉皮笑脸。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ JQuery滑动图片]]></title><link><![CDATA[ http://paperen.com/post/jquery-pic-slide]]></link><guid isPermaLink="false"><![CDATA[ 36]]></guid><pubDate><![CDATA[ 2010-02-12 00:15]]></pubDate><description><![CDATA[ <P>paperen以前弄的那个图片转换太失败了，有看代码的会发现是更换了img的src值来改变图片，而html代码中也只有一张图片（&lt;IMG src="i.jpg" ?="" /&gt;），而这样的缺点就是要等待图片完全下载完才能切换出来，明显的表现是在网速不理想下点击切换按钮时不能马上转换图片而是要等待一定时间。所以paperen我觉得还是要在html中先所有图片都放出来然后用css隐藏一部分图片来制造这种效果是最理想的，其实这个方法也不是我想出来的，你随便找个有js滑动图片的网站看源代码都是将所有图片事先放出来的，因为这样会先下载图片，即使你只能看到一张图片。</p><br />
<P><A href="http://paperen.com/demo/imageslider/">http://paperen.com/demo/imageslider/</A></p><br />
<P>1.HTML结构<br /></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 近来关于css的不正常思想]]></title><link><![CDATA[ http://paperen.com/post/some-crazy-about-css]]></link><guid isPermaLink="false"><![CDATA[ 35]]></guid><pubDate><![CDATA[ 2010-02-07 22:26]]></pubDate><description><![CDATA[ <P>paperen最近在设计某人的砂场销售系统页面的时候，突然在对css的命名有了点想法，比如对某个元素你可以使用id或者class来对它的css进行编写。前者的区别与后者的区别是明显的，同一个页面中id号是唯一的，也就是说不能有两个或以上的id名字在同一个页面出现，而class则相反，你可以在一个页面中使用同一个class对不同元素进行美化，而且可以套用多个class。类似下面这样写。?</p><PRE>#useid{font-size:12px;}<br />.useclass{border:1px #CCCCCC solid;}<br />.bigfont{font-size:14px;}<br />&lt;/style&gt;<br />&lt;div id="useid"&gt;记住ID号唯一&lt;/div&gt;<br />&lt;div class="useclass"&gt;而使用class则不同&lt;/div&gt;<br />&lt;div class="useclass bigfont"&gt;而使用class则不同&lt;/div&gt;<br /></PRE><P>这些是写css的基本准则了，可能大家对多个class一起套用的方法用得不多吧，paperen我也是在学做WordPress的模板时发现可以这样用的（可能是以前看书不够仔细吧……）?</p><br />
<P>那么如果要写写paperen右边的边栏的css应该怎样写呢？?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 很早之前偷的图片转换效果js]]></title><link><![CDATA[ http://paperen.com/post/stealing-js-picshow]]></link><guid isPermaLink="false"><![CDATA[ 34]]></guid><pubDate><![CDATA[ 2010-02-02 01:16]]></pubDate><description><![CDATA[ <P>这个今天刚记起所以就放出来分享一下，是很前一段时间paperen为了帮小王所以扒下来的，还没看它的js代码，其实paperen不是很经常偷别人的东西啦，就是偶尔有时候为了帮忙或者实在觉得效果不错就下手咯……那也是理所当然的事情嘛，大家说是吧？?</p><br />
<P>不多说demo地址在这里 <A href="http://paperen.com/demo/picrun/">http://paperen.com/demo/picrun/</A></p><br />
<P>自己看看吧，喜欢的话拿去吧（查看源代码，拿css文件与js文件就行啦，paperen我已经将css文件做缩减了，不过js文件还没整理好，大家将就吧……有谁整理好的也可以发我一个）</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 我是怎样编写网站代码的]]></title><link><![CDATA[ http://paperen.com/post/how-to-code]]></link><guid isPermaLink="false"><![CDATA[ 33]]></guid><pubDate><![CDATA[ 2010-02-02 00:40]]></pubDate><description><![CDATA[ <P>又是一个以自己为钻研目标的话题，可能你会有更好的办法（例如使用框架开发）欢迎交流，而我这里也只是与大家分享一下自己的做法。?</p><br />
<P>初期：庞大而独立的风格。?</p><br />
<P>记得那时paperen我从asp过来php的时候，都是将一大堆的php代码写在一个文件中，夹杂着html与php代码，而且每个文件的独立性很强，它们彼此间缺少分享精神，它们都是很自私，除了那个连接数据库的文件外，因为那时我就是在每个文件头部require("db.php");这样做的，而且还没分块来实现，就是说整个页面的html都是复制过去另一个页面里面，变的可能只是php代码与一些模块内容。</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ paperen的近况]]></title><link><![CDATA[ http://paperen.com/post/paperen-recent]]></link><guid isPermaLink="false"><![CDATA[ 32]]></guid><pubDate><![CDATA[ 2010-01-30 14:27]]></pubDate><description><![CDATA[ <P>貌似好几天都没更新博客了，paperen在忙帮吴同学弄他们家公司的一个管理系统啊，说容易也不容易，说困难也不困难，而且吴同学的要求也是很高的。感觉paperen现在使用ajax有点泛滥了，不过自己确实喜欢使用它，不用每次操作都要提交数据导致刷新页面，不过各人有各人爱好吧，使用ajax反而增加了js文件的大小，还有需要注重js函数的重用性，paperen认为一个出色的程序员也是一个很懒的人才对的。?</p><br />
<P>昨晚换了个博客主图片，paperen自己画的啊，感觉还行吧，好像花了差不多两个小时吧，本身还打算上色的，不过都已经凌晨1点了……还是算了吧，但爸爸没睡呢，还在厅的台式电脑前……好像还在玩那个幻幻球游戏（我传给我细佬玩的）。这张新的图片就算是这几天一个比较大的更新吧。?</p><br />
<P>看到自己的博客慢慢地被搜索引擎收录了，而且今天自己在搜索“paperen博客”时也看到一些网站把自己的某些文章抄去了，看来自己的某些文章还是有人认同滴，但是他们为什么不告诉我一声呢……</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 实现购物车功能]]></title><link><![CDATA[ http://paperen.com/post/cart]]></link><guid isPermaLink="false"><![CDATA[ 31]]></guid><pubDate><![CDATA[ 2010-01-26 18:39]]></pubDate><description><![CDATA[ <P>原来懒吧的空间也支持php的，那行啦，干脆用php写算了，asp我都不会了……写几行就有错而且用惯了php后用asp特不顺手，php对变量的定义太宽松，回到asp里面却觉得不习惯。昨天晚上试弄了一下个购物车功能，这里也写出来分享一下吧，顺便也更新一下博客……?</p><br />
<P>例子地址<A href="http://paperen.com/demo/cart/ ">http://paperen.com/demo/cart/?</A></p><br />
<P>购物车的实现说到底就是在使用一些超级变量，你可以使用cookie或者session来做你的购物车，就是存储你的临时购物记录，当然你还可以使用数据库进行记录，方法就三种，自己随便挑一种适合自己使用的就可以了，而paperen这里使用了cookie进行记录。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 关于打造自己的WP主题]]></title><link><![CDATA[ http://paperen.com/post/about-make-my-wp-theme]]></link><guid isPermaLink="false"><![CDATA[ 30]]></guid><pubDate><![CDATA[ 2010-01-24 00:41]]></pubDate><description><![CDATA[ <P>相信在大多数blogger中甚至在大多数喜欢网上冲浪的人眼中，WordPress这个名词就从没有陌生过，虽然paperen我没做过统计但是在10个博客中至少有6个是用WordPress打造的，不是我夸张是实际如此。power by wordpress，即使你在他网页中看不到这段话但是在地址栏加上wp-login.php，也就会看到WordPress的登录入口。</p><br />
<P><a href="http://paperen.com/file/32" class="post-image thumbnail"><img src="http://paperen.com/file/32" alt="201001241264263309" title="上传于2010-01-24"></a></p><br />
<P>其实paperen不是特别推荐php新手直接就从WordPress开始你的php之路，因为一开始接触wp（WordPress的简称），你需要从创作主题开始慢慢上手，而创作主题的过程中其实你接触到的php的核心代码是很少的，一般你只是在用wp已经封装好的函数，创作一些文件，paperen我今天才算弄了一个比较像样的主题，但是总觉得不是我渴望那种方式，怎我还是觉得自己从头到尾写完一个网站比较有feel点，不过对快速开发网站而言，WordPress的优势实在是很明显，本身的功能对于打造博客而言已经是很足够了，但是你还可以改造成一些cms网站，企业网站。其实说到底paperen似乎是说自己没有将wp玩熟了。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 那些令人感动的生命]]></title><link><![CDATA[ http://paperen.com/post/some-moving]]></link><guid isPermaLink="false"><![CDATA[ 29]]></guid><pubDate><![CDATA[ 2010-01-21 13:40]]></pubDate><description><![CDATA[ <P>在你觉得生活没劲时或许应该看看这些了，那些顽强而且令人感动的生命，paperen我看完后都留了一摊泪水，绝对不是夸张?</p><br />
<P><A href="http://v.youku.com/v_show/id_XMzY5Mjk5OTY=.html">http://v.youku.com/v_show/id_XMzY5Mjk5OTY=.html</A></p></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 返回顶部的js]]></title><link><![CDATA[ http://paperen.com/post/backtop-js]]></link><guid isPermaLink="false"><![CDATA[ 28]]></guid><pubDate><![CDATA[ 2010-01-20 17:41]]></pubDate><description><![CDATA[ <P>为博客换了些装备与添加上一些功能，灵感来自于昨天paperen我看的那些博客，都是基于WordPress开发的了，当然paperen我也不会错过扒人家的东西来看看这个好机会（其实同大家偷瓜偷菜不一个样），配合opera浏览器的开发者工具去挖就真是很方便了（大家如果用过就明白了）?</p><br />
<P><a href="http://paperen.com/file/31" class="post-image thumbnail"><img src="http://paperen.com/file/31" alt="201001201263978222" title="上传于2010-01-20"></a>?</p><br />
<P>话说paperen看中了那个滑回顶部的小功能，找了它的js文件，弄过来就亲自测试起来了，现在paperen的博客都添加上这个功能了（至于赞与踩那个功能paperen我可没抄别人的东西啊）?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 两个好用而且免费的php报表工具]]></title><link><![CDATA[ http://paperen.com/post/two-open-chart-tools]]></link><guid isPermaLink="false"><![CDATA[ 27]]></guid><pubDate><![CDATA[ 2010-01-18 12:55]]></pubDate><description><![CDATA[ <P>话说吴同学有任务给我做，昨天还打电话给我说需要搞几个功能，一个是报表一个是打印，昨天都研究了打印那个控件半天，结果证实了某些功能需要购买才能使，也不能怪人家，都不容易嘛，哪有像外国人那么大方的（貌似是吧……）就找了这两个报表工具而言（都是free的--免费），当然你也可以买，paperen我也不知道付费与不付费有啥不同，没仔细看他们的网站。（还有事先声明paperen我没给他们买广告……）?</p><br />
<P><A href="http://down.52z.com/xl/FusionChartsFree.rar">http://down.52z.com/xl/FusionChartsFree.rar</A> FusionChartsFree下载?</p><br />
<P>至于open-flash-chart的下载自己到官网上找找就有，paperen我忘了记地址了……?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ google要离开中国]]></title><link><![CDATA[ http://paperen.com/post/google-leave]]></link><guid isPermaLink="false"><![CDATA[ 26]]></guid><pubDate><![CDATA[ 2010-01-16 22:11]]></pubDate><description><![CDATA[ <P>听说谷歌要离开中国，确实是一个不少的新闻，但是好像目前还没有算是正式退出中国市场，在网上看了些资料，原因不少，但是总的原因好像是在中国站不住脚的说，争不过百度，投入不少但是利润却不多，paperen我虽然对网络营销也不是很懂，但是谷歌难道真的就这样退出啊？google来到中国才几年，就想一下子占用中国网络较重的地位显然不太实际，而其还有百度这个强劲对手，paperen个人认为，google还是应该留着，毕竟中国还是有市场的。?</p><br />
<P>对于百度与谷歌两大搜索引擎的使用嘛，paperen我挺喜欢google的，百度确实是国产的，你说应该支持国产的，貌似是应该支持，但是paperen我还是喜欢用google多点，你总不能因为这个来鄙视我吧……现在的思想这么开放，是吧？google的api功能挺不错的啊，他某些方面确实比百度做得要好，不知道各位有没有用过google的其他功能，而且google来踩paperen网站的次数也是不少的，而百度就……目前还没收录的说……可能是paperen我的SEO（搜索引擎优化）没做好吧，从这一点上我是顶google的，大家不要怪我自私嘛，是吧？?</p><br />
<P>总之嘛，我觉得google应该不会走吧，不知道你怎么想的，还有大家平时用不用google搜索东西的啊？paperen觉得应该也不多，宿舍八个人就我一个用google搜索的，哎，确实看到google在中国的地位了……?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 小心sql注入漏洞]]></title><link><![CDATA[ http://paperen.com/post/sql-inject]]></link><guid isPermaLink="false"><![CDATA[ 25]]></guid><pubDate><![CDATA[ 2010-01-11 18:11]]></pubDate><description><![CDATA[ <P>今天早上学院开了个会，说了些关于毕业实习与设计的安排之类的还有说明天有个企业来招聘，让有兴趣的人回去登录他们公司的网站看看。paperen我当然是没有这个兴趣的啦，但是宿舍的小华同学就有点兴趣，回来就上了他们的网站。但是……?</p><br />
<P>paperen我也瞅了几眼，网站不咋的啊，asp的，也不知道为啥突然想也去踩踩，看看有没有存在sql注入漏洞，登上他们的网站，看了几个页面，去到公司新闻那，有一条新闻url是xwzx_content.asp?id=456（很正常的传值，根据id值去查数据库并显示相应的数据，也很合理），但是……?</p><br />
<P>paperen我将参数改为xwzx_content.asp?id=456 and 1=1试了试，发现与id=456显示是一样的。（并不能证明是否存在漏洞）?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ ajax load实例]]></title><link><![CDATA[ http://paperen.com/post/ajax-load]]></link><guid isPermaLink="false"><![CDATA[ 24]]></guid><pubDate><![CDATA[ 2010-01-11 15:46]]></pubDate><description><![CDATA[ <P>前些日子看到某个网站的前端效果比较不错所以去挖了他的js下来看，发现用了ajax的load事件去实现一些很不错的功能，例如下面iplaysoft网站中这部分的功能。?</p><br />
<P><a href="http://paperen.com/file/17" class="post-image thumbnail"><img src="http://paperen.com/file/17" alt="201001111263171749" title="上传于2010-01-11"></a>?</p><br />
<P>你也可以先看看我做的一个小DEMO <A href="http://paperen.com/demo/ajax-load/">http://paperen.com/demo/ajax-load/</A></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 好酷的Widget]]></title><link><![CDATA[ http://paperen.com/post/cool-widget]]></link><guid isPermaLink="false"><![CDATA[ 23]]></guid><pubDate><![CDATA[ 2010-01-08 22:05]]></pubDate><description><![CDATA[ <P>paperen昨天研究了一天的widget并且将答辩论文都准备好了，当然论文写的就是widget这个小东西，不知道大家有没有听过widget，翻译过来的意思就是微件，还是贴上比较权威的解析吧，“widget是一小块可以在任意一个基于HTML的Web页面上执行的代码，它的表现形式可能是视频，地图，新闻，小游戏等等。它的根本思想来源于代码复用，通常情况下，Widget的代码形式包含了DHTML,JavaScript以及Adobe Flash。”?</p><br />
<P>可能这样说也没什么意思，还是贴一下图让大家see see。?</p><br />
<P><a href="http://paperen.com/file/11" class="post-image thumbnail"><img src="http://paperen.com/file/11" alt="201001081262957266" title="上传于2010-01-08"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ WEB正在标准化中？]]></title><link><![CDATA[ http://paperen.com/post/web-standarding]]></link><guid isPermaLink="false"><![CDATA[ 22]]></guid><pubDate><![CDATA[ 2010-01-05 21:39]]></pubDate><description><![CDATA[ <P>才看了一个网页，关于WEB标准化的思考，<a href="http://kb.operachina.com/node/20" target="_blank">http://kb.operachina.com/node/20</a>，“梦想虽然很美，但实际上到底怎么样”，这个话题也很值得web开发者的深思，貌似这个话题早就存在，但是一直一直进展都很缓慢，到底有多少个网站能符合web标准。看看上面那个链接的调查就知道。?</p><br />
<P>对于测试网站的标准化检测，你可以登录到这里并输入网址对html文档还有css文档进行检验。?</p><br />
<P>xhtml：<a href="http://validator.w3.org/" target="_blank">http://validator.w3.org/</a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 递归的使用]]></title><link><![CDATA[ http://paperen.com/post/recursive]]></link><guid isPermaLink="false"><![CDATA[ 21]]></guid><pubDate><![CDATA[ 2010-01-04 21:08]]></pubDate><description><![CDATA[ <p>最近paperen我都是在看别人的代码，phpcms，wordpress，都看得头晕眼花的，再次证实了自己那个真理--“看别人写的代码真是痛苦”，但是为了升级自己的php技能与水平，增加点经验值这也是必经之路啊。&nbsp;</p><br />
<p>不多说，前几天看到phpcms一个addslashes功能的函数，挺不错的，有了递归的方法，如果参数是一个数组的话会遍历整个数组数值，对于addslashes函数的定义就是给单引号(')，双引号(")，反斜杠(/)加上反斜杠。&nbsp;</p><pre>echo addslashes("  ' " ");//将会得到 ' " &nbsp;</pre><p>虽然递归用得不是很多，但是有时候也会派上用场，例如phpcms中那个函数。&nbsp;</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 完美的弹出层]]></title><link><![CDATA[ http://paperen.com/post/perfect-popubox]]></link><guid isPermaLink="false"><![CDATA[ 20]]></guid><pubDate><![CDATA[ 2010-01-02 18:58]]></pubDate><description><![CDATA[ <P>先来看最终效果图吧</p><br />
<P><a href="http://paperen.com/file/7" class="post-image thumbnail"><img src="http://paperen.com/file/7" alt="201001021262426657" title="上传于2010-01-02"></a>?</p><br />
<P>例子<A href="http://paperen.com/demo/pop-box/"> http://paperen.com/demo/pop-box/</A></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 邮件激活账号功能]]></title><link><![CDATA[ http://paperen.com/post/active-via-email]]></link><guid isPermaLink="false"><![CDATA[ 19]]></guid><pubDate><![CDATA[ 2009-12-31 18:17]]></pubDate><description><![CDATA[ <P><FONT face="宋体">前几天小白让我看看怎样去实现邮件激活账号的功能，对于一些大型的论坛或网站注册一般都会这样做的啦，用来防止某些人乱注册的情况，一开始paperen我就有个思路，就是在用户注册时，生成</FONT><FONT face="宋体">一个随机的数列同时放入到数据库中（自己就想到用MD5），然后调用mail函数向注册的邮箱发一封邮件</FONT><FONT face="宋体">，里面装着一个地址（如example.php?rand=f3223d2d32d&amp;id=12）刚才实现了下，看来paperen我</FONT><FONT face="宋体">的思路是可行的。下面来具体说一下是到底怎实现的吧。</FONT>?</p><br />
<P><FONT face="宋体">首先从基本开始吧，对于注册页面肯定就是一个form啦</FONT></p><P><PRE>&lt;form method="post" action="reg.php"&gt;<br /> &lt;p&gt;Name:&lt;input type="text" name="name" /&gt;&lt;/p&gt;<br /> &lt;p&gt;Email:&lt;input type="text" name="email" /&gt;&lt;/p&gt;<br /> &lt;p&gt;Password:&lt;input type="password" name="pwd" /&gt;&lt;/p&gt;<br /> &lt;p&gt;&lt;input type="submit" name="submit" value="Reg Now" /&gt;&lt;/p&gt;<br />&lt;/form&gt;<br /></PRE><P></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 怎样提高php水平？]]></title><link><![CDATA[ http://paperen.com/post/improve-php-skill]]></link><guid isPermaLink="false"><![CDATA[ 18]]></guid><pubDate><![CDATA[ 2009-12-28 11:05]]></pubDate><description><![CDATA[ <P>对于这个题目其实paperen我也一直在思考，某个时期自己也经常会迷惑，到底怎样去提高自己的水平呢？！paperen自己那时也google过，百度过，但是大致说的都是一样的，要多写代码多练，多看。其实现在的paperen也不是很强，至少连框架到底是什么东西都还不是很清楚，前些天也看了看thinkphp，但是还没有钻研彻底。?</p><br />
<P>而再前些日子paperen我也不停地看别人的代码，WordPress，phpcms，dede等等一些开源的php，但是越看越乱，感觉是没搞清他们写的思路，不过确实也领会了不少东西，至少将他们开发的模式弄懂了一些，文件基本都差不多，一般都是require一个配置全局的文件，然后定义很多常量，之后是类，函数，缓存等等。paperen我现在也是这样进行程序的编写的，因为确实是方便，虽然文件分的比较多但是思路却很清晰。?</p><br />
<P>都说用框架开发比较快，但是paperen我到目前为止还没用过框架来进行开发，不知道自己这个算不算是一个框架…这几天也帮别人写了个博客程序，不过功能没自己的强，但是感觉帮他写的后台比自己这个后台还要好看并且舒服…不过这也是件好事，证明自己的水平渐长了点。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 最近听上One Republic]]></title><link><![CDATA[ http://paperen.com/post/one-republic]]></link><guid isPermaLink="false"><![CDATA[ 17]]></guid><pubDate><![CDATA[ 2009-12-27 11:28]]></pubDate><description><![CDATA[ <P>paperen是从stop and stare这首歌开始接触上这个乐队的，stop and stare这首歌给我的感觉真的很不错，不知道怎表述，关于音乐的风格的名词paperen我了解得很少，反正就是喜欢这首歌，而且歌词也很很好，令人回味，这首歌的mtv也很好看，虽然papern还是不太能理解这首歌的意思，或者根本不需要去理解，有这个意境就已经足够了，如果大家有兴趣的话，可以自己去看看歌词，真的写的很好。?</p><br />
<P>之后开始听他们的专辑，发觉越来越来不错，每首歌的风格都很独特，而且歌词都很不错，而目前one republic就出了两张专辑，paperen我都很喜欢听。?</p><br />
<P>stop and stare的MTV <A href="http://v.youku.com/v_show/id_XMzM3MjkyNjA=.html">http://v.youku.com/v_show/id_XMzM3MjkyNjA=.html</A></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ JQuery制造简单的图片切换]]></title><link><![CDATA[ http://paperen.com/post/simple-jquery-picshow]]></link><guid isPermaLink="false"><![CDATA[ 16]]></guid><pubDate><![CDATA[ 2009-12-23 21:47]]></pubDate><description><![CDATA[ <P>Paperen对于js了解的确实不多，以前一向就是写一些简单的功能，例如检验输入非空还有地址返回的功能还有用js控制一下样式之类的，之后直接接触JQuery，用JQuery集成的效果只需要一两行的代码，但是如果不用JQuery的框架去写js代码的话可能没有一百多行都写不出来，感觉用JQuery是方便多了，但是Paperen有空的时候也还是要去认真学习一下JavaScript的，还有prototype这个框架。?</p><br />
<P>前言就说一下自己对于js的体会吧，前些时间趁自己有空用jquery做了一个切换图片的小玩意，简单到不能再简单的东西。?</p><br />
<P><A href="http://paperen.com/demo/js-change-pic/">http://paperen.com/demo/js-change-pic/</A></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 实习项目--编解码]]></title><link><![CDATA[ http://paperen.com/post/code-uncode-practice]]></link><guid isPermaLink="false"><![CDATA[ 15]]></guid><pubDate><![CDATA[ 2009-12-21 18:15]]></pubDate><description><![CDATA[ <P>paperen对于这个没有什么可说的…就是为了应付实习，又浪费了自己数据库中一个ID号…?</p><br />
<P>而对于这个程序既然老师说可以用任何语言来做我就用php来做一个吧，vc++我都忘得差不多了…老师检查的话直接给他网址就是了，用php来做这个实习项目唯一缺点就是依赖于浏览器与服务器了，在我目前的理解如果php离开了服务器似乎是不能运行，但paperen我还是觉得肯定有其他办法可以让php在别的环境编译的，只是paperen我见识少而已。?</p><br />
<P>程序地址 <A href="http://paperen.com/demo/code/">http://paperen.com/demo/code/</A></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 第三代懒吧制造中]]></title><link><![CDATA[ http://paperen.com/post/g3-urlazy]]></link><guid isPermaLink="false"><![CDATA[ 14]]></guid><pubDate><![CDATA[ 2009-12-21 09:59]]></pubDate><description><![CDATA[ <P>Paperen我在星期六将公司的任务处理完就退了，确实有点不舍得，两个小刘，两个小王，小李，小潘当然还有经理，都很好人，paperen我会想念大家的。既然自己下定走的打算了，就确实不能留在这里发展了，还是回家吧，即使不知道明天会怎样，但是paperen我还是有信心的。?</p><br />
<P>今天是星期一，又是一个星期的开始，一早上就开了一个有关我们专业实习的会，看来这个星期也闲不到哪去…昨天用了一天将懒吧首页重新设计一下，paperen我打算将懒吧重做，包括程序，数据库，还有页面，趁自己还有时间，完善懒吧也是我26岁之前的目标之一啊。?</p><br />
<P>这里先show一下新设计的logo不知道大家喜欢这个logo不？可能吴思他就不喜欢这个…?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 停顿一刻]]></title><link><![CDATA[ http://paperen.com/post/break-a-moment]]></link><guid isPermaLink="false"><![CDATA[ 13]]></guid><pubDate><![CDATA[ 2009-12-16 19:57]]></pubDate><description><![CDATA[ <P>可能是因为昨晚加班了3个小时的原因，今天一到五点半同事们都喊着下班了，我也把自己该完成的完成了。?</p><br />
<P>今天是最早下班的一次，明天再去一天就不用去了，其实paperen我目前身份还不是正式员工，就是个实习的，估计工资也没多少，还不到两个月就退了，回来考完试就等着回家吧，都快一年没回去了，有点想念家的味道了。?</p><br />
<P>而对于毕业也就是不到半年的时间了，paperen现在脑子还是空空的，虽然有想过自己开一家网络公司，为大家做很多很多好的网站，但是这个想法还不太成熟，毕竟自己的水平还没达到那个点，paperen我有时候会想“啊，不知道从清华那些很牛的学校出来的计算机毕业生的水平会比自己高多少呢？是不是他们每个人都会做网站写软件呢？”，paperen我也会安慰自己说“我只是学通信的，web方面的知识都是自学的而已，已经很不错了。”?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ json的使用]]></title><link><![CDATA[ http://paperen.com/post/use-json]]></link><guid isPermaLink="false"><![CDATA[ 8]]></guid><pubDate><![CDATA[ 2009-12-16 09:24]]></pubDate><description><![CDATA[ <P>不知道看到这个标题的大家会觉得这里的json是指什么，貌似是一个人的名字，但是这里加上使用就肯定不是指某个人啦。?</p><br />
<P>我也稍微地说一下json，JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。不知道大家有没有接触过或者用过xml来传输数据，而json的作用与xml是一样的，作为数据传送的一种格式，后起之秀。Paperen我是先用上了json的，当初是在一本叫《PHP.5.高级应用开发实践》的书中看到过json的使用，而xml自己目前还没有在实际中用过。?</p><br />
<P>对于json大家可以访问一下站点：</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 写给26岁的自己]]></title><link><![CDATA[ http://paperen.com/post/write-to-26]]></link><guid isPermaLink="false"><![CDATA[ 7]]></guid><pubDate><![CDATA[ 2009-11-14 00:00]]></pubDate><description><![CDATA[ <P><FONT face=宋体>今天上班的时候突然看到遨游状态栏显示的一条信息，“26岁的时候，他们都干了些什么”，自己不知不觉就点击去看看了，列了很多伟人们26岁时候的成就，关掉页面，自己脑子也停了下来，是不是paperen我也得要想想26岁的我应该要获得什么呢？要到达哪里呢？要成为一个怎样的人？不自觉地自己的思绪就离开了当前手上的工作……</FONT></p><br />
<P><FONT face=宋体>1.26岁的我依然要有始有终</FONT></p><br />
<P><FONT face=宋体>确实的说，自己在这家网站公司上班不到一个星期，但是这些天来自己想到了确实许多，关于工作，职业，自己还有别人的，在公司中自己现在算是一个php程序员，但是暂没有接到任何新的客户单子，我一直都在改，改前一个php程序员写的烂代码，那些连isset($_GET[′id′])都不会写的代码，那些错漏百出的代码，那些写得乱七八糟的代码，而且我很奇怪的是这样的代码这样写出来的网站客户用起来的时候就没发现，还让他手尾都不用改的情况下就溜了，我虽然不知道是什么个情况，但是我觉得做程序的怎也得有个始也要有个终，我在这里就不发泄太多了，确实的来说觉得26岁的我一定要有始有终，虽然大家只注重网站的效果，但是我们写程序的不能对不起自己更不能对不起客户。</FONT></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 接收表单数据]]></title><link><![CDATA[ http://paperen.com/post/get-the-form-data]]></link><guid isPermaLink="false"><![CDATA[ 6]]></guid><pubDate><![CDATA[ 2009-11-08 00:00]]></pubDate><description><![CDATA[ <FONT face="宋体"><br />
</FONT><P>那天paperen在工作时修改别人写的代码，在看到添加文本时使用的新浪那个编辑器时，才接触到extract这个函数，终于解决了一直以来对接收表单数据的麻烦问题，也许是我以前没充分看php的函数吧……</p><br />
<P>想想以前自己是怎样接收表单的数据的，一个表单的html结构</p><PRE>&lt;form action="test.php" method="post"&gt;<br />&lt;P&gt;&lt;label for="name"&gt;名字:&lt;/label&gt;&lt;input type="text" name="name" id="name" /&gt;&lt;/p&gt;<br />&lt;P&gt;&lt;label for="email"&gt;email:&lt;/label&gt;&lt;input type="text" name="email" id="email" /&gt;&lt;/p&gt;<br />&lt;P&gt;&lt;label for="phone"&gt;电话:&lt;/label&gt;&lt;input type="text" name="phone" id="phone" /&gt;&lt;/p&gt;<br />&lt;P&gt;&lt;label for="qq"&gt;QQ:&lt;/label&gt;&lt;input type="text" name="qq" id="qq" /&gt;&lt;/p&gt;<br />&lt;P&gt;&lt;input type="submit" name="submit" id="submit" value="提交" /&gt;&lt;/p&gt;<br />&lt;/from&gt;<br /></PRE><P>当我们一点击提交时，整个表单就会提交到 action指定的文件处理，这里会将form的数据提交到test.php页面进行处理，但你当然可以提交给本页处理，那么你可以不用写action这个属性，不过要确保这个文件也是一个php文件才行。(稍微说下method这个定义数据以什么形式发送，一般有GET与POST两种方法，这里就不具体说这两种方法的区别了，自己可以(Google)</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ Ajax实现网页聊天]]></title><link><![CDATA[ http://paperen.com/post/ajax-webicq]]></link><guid isPermaLink="false"><![CDATA[ 5]]></guid><pubDate><![CDATA[ 2009-11-06 00:00]]></pubDate><description><![CDATA[ <P>曾几何时自己想用vc++编一个局域网内的聊天工具，可惜一直没有实现……而自己也渐渐走向了网站开发这条路上来了。</p><P>我有时候也会想去在一个网页上进行在线聊天的功能，但是如果将一个页分为不同框架去弄的话，效果很不理想（因为如果要实现不停地更新聊天内容需要使某个框架不停地刷新，这样使得整个网页很不爽…），而且弄起来也不太顺手，而终于是Ajax解救了我。<br />?<br />自己实现的时候就涉及到三个文件，一个是html的，一个是php的，一个js的，当然也需要数据库的支持。</p><br />
<P>界面并没有太好地经过美化，只是用css突出以下内容与IP地址。<br /><a href="http://paperen.com/file/3" class="post-image thumbnail"><img src="http://paperen.com/file/3" alt="201001201263960839" title="上传于2010-01-20"></a></p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 面试那个小测试]]></title><link><![CDATA[ http://paperen.com/post/test-of-interview]]></link><guid isPermaLink="false"><![CDATA[ 4]]></guid><pubDate><![CDATA[ 2009-11-03 00:00]]></pubDate><description><![CDATA[ <P>第一天上班回来……累死了，头晕……?</p><br />
<P>不说苦了，越说越累……直接入正题，话说昨天的面试那个作业，后台添加上可以管理友情链接的功能，就是一个很基本而且很简单的功能，paperen我不知道若我昨天没做出来会不会应聘成功。下面说说这个功能是如何实现吧。?</p><br />
<P>要添加并管理友情链接，当然需要数据库的支持啦，不是说每添加一个友情链接就要去改页面的代码，这样维护性太差了而且也不合理。（这里的代码是自己回来后写的，当然某些部分与我在面试时写的不一样，特别是css那块）</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 第一次面试]]></title><link><![CDATA[ http://paperen.com/post/first-interview]]></link><guid isPermaLink="false"><![CDATA[ 3]]></guid><pubDate><![CDATA[ 2009-11-02 00:00]]></pubDate><description><![CDATA[ <P>第一次面试经历真的挺?的……打算三点过去的，但是谁知道在我睡午觉的时候，那个公司的经理打电话来了，我还傻傻的说我刚才在睡觉（那天真的冻傻了……），还没过去就给别人一个不好的印象……看来自己习惯没有约束太久了……?</p><br />
<P>冲冲忙忙地赶过去，连电梯都玩我，15楼按不上，没法只能在14楼下……差不多3点终于到了，经理让我坐会，自己留意一下环境，他们的办公室是一个个房间形式的，有压迫感，不太宽敞，讲真不是很喜欢这种环境，但是没法，我是来面试的而已。?</p><br />
<P>经理问了我些问题，关于自己的水平与优势，当然也苦笑一下刚才自己午觉的事情……之后就给我一个小任务，给他们网站后台添加上管理友情链接的功能，自我感觉不太难就直接上手了，不到五点就ok了，交作业后，经理就问了我学习上时间的事情，还有说了一下公司上下班的时间，明天就开始上班吧，自己不能以正常员工的身份，月薪最好只有9百多。之后我就走了，心情也不是特别的高兴，心里说：“哎！明天就不自由了……”，说实在还有些不习惯的。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ 11.2 天气 小雪，阴]]></title><link><![CDATA[ http://paperen.com/post/11.2-cold]]></link><guid isPermaLink="false"><![CDATA[ 2]]></guid><pubDate><![CDATA[ 2009-11-02 00:00]]></pubDate><description><![CDATA[ <P>今年罕见的天气，早早就让我看到了雪，一早起来外面已经飘着小小的雪花，虽然没有北京那边那么大，但也算是下雪了。?</p><br />
<P>大伙们都喊冷，一个个地添衣，自己昨晚还睡着凉席呢……大家都说我不是人了。?</p><br />
<P>真没想到今年的天气冷得这么突然，前几天还十几度，今天就突然下雪了， 看着小雪花在外面随风打转，paperen我的心情也是有点奇怪的感觉，有点感触，也有点悲伤。或许是我又想多了，觉得雪并不是很美，美的只是我们面对下雪的时候的心情吧，会让大家不知不觉地就想到了某些事某些人。?</p>]]></description><author><![CDATA[ paperen]]></author></item><item><title><![CDATA[ I am Paperen]]></title><link><![CDATA[ http://paperen.com/post/i-am-paperen]]></link><guid isPermaLink="false"><![CDATA[ 1]]></guid><pubDate><![CDATA[ 2009-10-25 17:47]]></pubDate><description><![CDATA[ <P>今天终于组建了paper的博客，因为目前整个博客的功能都是自己编的，所以安全性方面还是个未知数，如果某位仁兄发现了我这个博客哪处有BUG的话，麻烦给我发个邮件:)。?</p><br />
<P>对于paper的博客，我是不会考虑能获得什么盈利的了，肯定不会插入那些广告什么的来打乱自己网页的美观，我觉得开源真的很好，而任何东西一有商业的介入，一谈到钱就没了味道，我就是想用这样一个空间来锻炼一下自己，而重要的是可以与大家进行分享，包括自己的经验，包括自己生活上的。</p><P>“保持网络上的自己与现实的我一致性”，这句话是我在某个个人网站看到的，也是我比较赞同的一句话。虽然生活中我不太喜欢跟陌生人交流，虽然我是个内向的人，但是在这里我更愿意跟大家交流。?</p>]]></description><author><![CDATA[ paperen]]></author></item></channel></rss>