<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>开源小站 &#187; www</title>
	<atom:link href="http://www.litrin.net/category/www/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.litrin.net</link>
	<description>It is Cool to OpenSource</description>
	<lastBuildDate>Fri, 23 Jul 2010 02:29:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=979</generator>
		<item>
		<title>WordPress google-syntax-highlighter 插件的问题</title>
		<link>http://www.litrin.net/2010/06/12/wordpress-google-syntax-highlighter-%e6%8f%92%e4%bb%b6%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress-google-syntax-highlighter-%25e6%258f%2592%25e4%25bb%25b6%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/06/12/wordpress-google-syntax-highlighter-%e6%8f%92%e4%bb%b6%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 09:16:08 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[服务器]]></category>
		<guid isPermaLink="false">/?p=1251</guid>
		<description><![CDATA[<!-- Easy AdSense V6.64 -->
<!-- Post[count: 3] -->
<div class="ezAdsense adsense adsense-leadin" style="float:right;margin:12px;" ><script type="text/javascript"><!--
google_ad_client = "pub-9603680922905816";
/* 250x250, 创建于 10-4-29 */
google_ad_slot = "3814271827";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>小站上一直使用Google Syntax Highlighter for WordPress 插件实现代码高亮，就在上一篇文章发布之后，我发现了这个插件中存在的一个bug：windows + IE 8无法正常加亮python代码。 查阅了官方网站，发掘Google Syntax Highlighter for WordPress插件用的1.5版已经停止更新，只能使用2.0以上的版本，但2.0版本和之前的版本又存在兼容的问题，直接替换是不行的。不想每篇文章的修改&#60;pre&#62;标记，那就改插件喽。 下载最新版本的Syntax Highlighter，解压。 将原来/wp-content/plugins/google-syntax-highlighter目录下的Scripts和Styles目录清空后，分别用新版本的对应路径中的文件替换，注意大小写方式请不要变动。 修改google_syntax_highlighter.php文件，我用了minify的插件，这里就直接调用了。 &#60;?php function insert_header() {  $current_path = get_option('siteurl') .'/wp-content/plugins/' . basename(dirname(__FILE__)) .'/';  ?&#62;  &#60;link href="&#60;?php echo $current_path; ?&#62;Styles/shCore.css" type="text/css" rel="stylesheet" /&#62;  //可根据自己的需要选择不同的Styles &#60;link href="&#60;?php echo $current_path; ?&#62;Styles/shThemeEclipse.css" type="text/css" rel="stylesheet" /&#62;  &#60;?php } function insert_footer(){ $current_path = 'wp-content/plugins/' . [...]]]></description>
			<content:encoded><![CDATA[<p>小站上一直使用Google Syntax Highlighter for WordPress 插件实现代码高亮，就在上一篇文章发布之后，我发现了这个插件中存在的一个bug：windows + IE 8无法正常加亮python代码。</p>
<p>查阅了官方网站，发掘Google Syntax Highlighter for WordPress插件用的1.5版已经停止更新，只能使用2.0以上的版本，但2.0版本和之前的版本又存在兼容的问题，直接替换是不行的。不想每篇文章的修改&lt;pre&gt;标记，那就改插件喽。</p>
<p><span id="more-1251"></span></p>
<ol>
<li>下载<a rel="nofollow" target="_blank" href="http://alexgorbatchev.com/downloads/grab.php?name=sh" target="_blank">最新版本的Syntax Highlighter</a>，解压。</li>
<li>将原来/wp-content/plugins/google-syntax-highlighter目录下的Scripts和Styles目录清空后，分别用新版本的对应路径中的文件替换，注意大小写方式请不要变动。</li>
<li>修改google_syntax_highlighter.php文件，我用了minify的插件，这里就直接调用了。</li>
</ol>
<pre class="php" name='code'>&lt;?php
function insert_header() {
 $current_path = get_option('siteurl') .'/wp-content/plugins/' . basename(dirname(__FILE__)) .'/';
 ?&gt;
 &lt;link href="&lt;?php echo $current_path; ?&gt;Styles/shCore.css" type="text/css" rel="stylesheet" /&gt;
 //可根据自己的需要选择不同的Styles
 &lt;link href="&lt;?php echo $current_path; ?&gt;Styles/shThemeEclipse.css" type="text/css" rel="stylesheet" /&gt;
 &lt;?php
}
function insert_footer(){
$current_path = 'wp-content/plugins/' . basename(dirname(__FILE__)) .'/';
 ?&gt;
&lt;?php
/*
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shCore.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shLegacy.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushCSharp.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushJScript.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushJava.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushVb.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushSql.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushXml.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushDelphi.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushPython.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushRuby.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushCss.js"&gt;&lt;/script&gt;
&lt;script src="&lt;?php echo $current_path; ?&gt;Scripts/shBrushCpp.js"&gt;&lt;/script&gt;
*/
&lt;script src="/wp-content/plugins/wp-minify/min/?b=&lt;?php echo $current_path; ?&gt;Scripts&amp;f=shCore.js,shLegacy.js,shBrushPhp.js,shBrushSql.js,shBrushPython.js"&gt;&lt;/script&gt;
&lt;script&gt;
dp.SyntaxHighlighter.ClipboardSwf = '&lt;?php echo $current_path; ?&gt;Scripts/clipboard.swf';
SyntaxHighlighter.all();
dp.SyntaxHighlighter.HighlightAll('code');
&lt;/script&gt;
&lt;?php
}
add_action('wp_head','insert_header');
add_action('wp_footer','insert_footer');
?&gt;</pre>
<p>测试，通过！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/06/12/wordpress-google-syntax-highlighter-%e6%8f%92%e4%bb%b6%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GAE的数据导入问题</title>
		<link>http://www.litrin.net/2010/05/26/gae%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gae%25e7%259a%2584%25e6%2595%25b0%25e6%258d%25ae%25e5%25af%25bc%25e5%2585%25a5%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/05/26/gae%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Wed, 26 May 2010 01:58:28 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[服务器]]></category>
		<guid isPermaLink="false">/?p=1242</guid>
		<description><![CDATA[又是关于Google App Engine的问题。 根据GAE的官方文档，向GAE的存储区导入数据，导入了数次均出现问题，翻来覆去的无法成功。 CVS结构示例：1300428,浙江省嘉兴市,联通130卡 （一个手机号码的对应归属地列表） configfile: from google.appengine.ext import db from google.appengine.tools.bulkloader  import Loader class MobilePhone(db.Model):   Number = db.StringProperty()   Area = db.StringProperty()   BrandType = db.StringProperty() class MPLoader(Loader):   def __init__(self):     Loader.__init__(self, 'MobilePhone',                     [('Number', unicode),                      ('Area', unicode),                      ('BrandType', unicode),                      ]) loaders = [MPLoader] 主要分析了一下，问题分为几类。 1.验证不能通过的问题： 这个问题很多时候是一个低级错误，之前我曾经犯过类似的错误。在app.yaml中的handlers handlers: [...]]]></description>
			<content:encoded><![CDATA[<p>又是关于Google App Engine的问题。<br />
根据<a rel="nofollow" target="_blank" href="http://code.google.com/intl/zh-CN/appengine/docs/python/tools/uploadingdata.html" target="_blank">GAE的官方文档</a>，向GAE的存储区导入数据，导入了数次均出现问题，翻来覆去的无法成功。</p>
<p>CVS结构示例：1300428,浙江省嘉兴市,联通130卡 （一个手机号码的对应归属地列表）</p>
<p>configfile:</p>
<pre class="py" name="code" >
from google.appengine.ext import db
from google.appengine.tools.bulkloader  import Loader
class MobilePhone(db.Model):
  Number = db.StringProperty()
  Area = db.StringProperty()
  BrandType = db.StringProperty()
class MPLoader(Loader):
  def __init__(self):
    Loader.__init__(self, 'MobilePhone',
                    [('Number', unicode),
                     ('Area', unicode),
                     ('BrandType', unicode),
                     ])
loaders = [MPLoader]</pre>
<p>主要分析了一下，问题分为几类。</p>
<p><span id="more-1242"></span></p>
<p>1.验证不能通过的问题：</p>
<p>这个问题很多时候是一个低级错误，之前我曾经犯过类似的错误。在app.yaml中的handlers</p>
<p>handlers:<br />
- url: /remote_api<br />
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py<br />
  login: admin<br />
- url: /*<br />
  script: main.py</p>
<p>这个/*的配置必须放在最后。否则所有的访问都会直接匹配main.py自然出现问题。</p>
<p>2.跟编码有关的错误：</p>
<p>这个错误是GAE SDK的一个bug，恐怕对于ASCII系统的用户没什么关系，对于我们UTF-8，GB2312，ASCII已经昏倒的用户来说，这是个严重的问题。</p>
<p>在GAE的安装目录下 google\appengine\tools\bulkloader.py文件中2521行</p>
<pre class="python" name="code">
    for (name, converter), val in zip(self.__properties, values):
      if converter is bool and val.lower() in ('0', 'false', 'no'):
        val = False
      properties[name] = converter(val)</pre>
<p>修改为：</p>
<pre class="python" name="code" >    for (name, converter), val in zip(self.__properties, values):
        if converter is bool and val.lower() in ('0', 'false', 'no'):
            val = False
        if isinstance(val,str) and not isinstance(val, unicode):
            val=unicode(val,'utf-8')
        properties[name] = converter(val)</pre>
<p>系统会将unicode类型的变量转换。</p>
<p>3.对于大容量数据的删除</p>
<p>GAE的限制，一次最多载入1000行的数据，每次最多删除500行数据，这对于像我制作的手机号码归属之类的大数据库是远远不够的，多次删除又会导致500报错，我的方法是使用task queue。<br />
Task Queue在官方的中文文档中没有提及，在英文文档中介绍的也不够详细。个人的理解就是让系统定期的去访问一个页面而已，我的例子：</p>
<pre class="python" name="code">from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db
from google.appengine.api.labs import taskqueue
class MobilePhone(db.Model):
    Number = db.StringProperty()
    Area = db.StringProperty()
    BrandType = db.StringProperty()
class Delete(webapp.RequestHandler):
    def get(self):
        q = db.GqlQuery("SELECT * FROM MobilePhone limit 100")
        results = q.fetch(100)
        db.delete(results)
        q = db.GqlQuery("SELECT * FROM MobilePhone limit 100")
        if (q.count() &gt; 0):
            self.addqueue()
        self.response.out.write('Hello world!')
    def addqueue(self):
        taskurl = 'http://ip-and-mp.appspot.com/'
        taskqueue.add( url='/del', params=dict(url=taskurl))
        self.response.out.write('added!')</pre>
<p>每次删除100行，使用默认的default queue，即每秒一次。</p>
<p>4.关于命令行的问题</p>
<p>我按照中文文档的办法始终有问题，添加了&#8211;email=xxxx &#8211;passin的参数才成功。手册已经远远落后了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/05/26/gae%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GAE的镜像</title>
		<link>http://www.litrin.net/2010/05/06/gae%e7%9a%84%e9%95%9c%e5%83%8f/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gae%25e7%259a%2584%25e9%2595%259c%25e5%2583%258f</link>
		<comments>http://www.litrin.net/2010/05/06/gae%e7%9a%84%e9%95%9c%e5%83%8f/#comments</comments>
		<pubDate>Thu, 06 May 2010 05:30:58 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[服务器]]></category>
		<guid isPermaLink="false">/?p=1238</guid>
		<description><![CDATA[本想将LAMP中的PHP弄成Python，研究下Zope或者索性的Python CGI。想到目前推Python最起劲的公司正是Google，况且Google的App Engine又是免费资源，顺道着就申请了。 GAE对于很多人来说只不过是当作撑杆来翻墙的。其实不管从哪个方面来说，GAE的理念就是一个搭载了Java或Python页面框架的虚拟主机，而且支持一大堆的扩展（google wave上的机器人）。借助了Microblog，我在GAE上架设了本站的镜像站点。 相对来说Google提供的SDK目前只能说是一个上传工具而已。很多功能，例如Xmpp，数据存储还没有办法完全模拟，只有页面框架和Memcache还算能用。相信google也会不断的加以完善。 说起Microblog，首先是一个不错的CMS系统。但可能是版本较低，加之GAE程序的调试比较麻烦，功能和结构上只能实现简单的blog功能。相比现成的blog空间反而麻烦不少。相信随着逐步的升级，这个系统将成为一个优秀的CMS。 想用Wordpress的导出工具直接生成一个新站，发现此功能还有问题，至少本站无法成功。于是只能顺手写一个扩展实现两地同步，尽管问题也不少。 说起Python，个人觉得是一个效率很高的语言，缺点就是产生这高效率的扩展太多，太混乱，初学起来很迷糊。顺手之后你就会觉得它作为高级语言，可以操纵的资源丰富的惊人。不过在此插一句，python3的转变真是太突兀了，大部分2.6之前的代码都要重新写过，对于GAE的目标环境还是用2.6以下搭建吧。]]></description>
			<content:encoded><![CDATA[<p>本想将LAMP中的PHP弄成Python，研究下Zope或者索性的Python CGI。想到目前推Python最起劲的公司正是Google，况且Google的App Engine又是免费资源，顺道着就申请了。</p>
<p>GAE对于很多人来说只不过是当作撑杆来翻墙的。其实不管从哪个方面来说，GAE的理念就是一个搭载了Java或Python页面框架的虚拟主机，而且支持一大堆的扩展（google wave上的机器人）。借助了Microblog，我在GAE上架设了<a rel="nofollow" target="_blank" href="http://litrinblog.appspot.com" target="_blank">本站的镜像站点</a>。</p>
<p><span id="more-1238"></span></p>
<p>相对来说Google提供的SDK目前只能说是一个上传工具而已。很多功能，例如Xmpp，数据存储还没有办法完全模拟，只有页面框架和Memcache还算能用。相信google也会不断的加以完善。</p>
<p>说起Microblog，首先是一个不错的CMS系统。但可能是版本较低，加之GAE程序的调试比较麻烦，功能和结构上只能实现简单的blog功能。相比现成的blog空间反而麻烦不少。相信随着逐步的升级，这个系统将成为一个优秀的CMS。<br />
想用Wordpress的导出工具直接生成一个新站，发现此功能还有问题，至少本站无法成功。于是只能顺手写一个扩展实现两地同步，尽管问题也不少。</p>
<p>说起Python，个人觉得是一个效率很高的语言，缺点就是产生这高效率的扩展太多，太混乱，初学起来很迷糊。顺手之后你就会觉得它作为高级语言，可以操纵的资源丰富的惊人。不过在此插一句，python3的转变真是太突兀了，大部分2.6之前的代码都要重新写过，对于GAE的目标环境还是用2.6以下搭建吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/05/06/gae%e7%9a%84%e9%95%9c%e5%83%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>flash播放MP3的问题</title>
		<link>http://www.litrin.net/2010/04/19/flash%e6%92%ad%e6%94%bemp3%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=flash%25e6%2592%25ad%25e6%2594%25bemp3%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/04/19/flash%e6%92%ad%e6%94%bemp3%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 09:45:39 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=1232</guid>
		<description><![CDATA[最近碰到了一个奇异的问题：apache的服务器，一个Flash调Mp3进行播放，用IE和chromium打开后启动时正常，一旦暂停后，再次播放就无效。但对于Firefox则完全正常。 反复检查代码，无果。将文件上传到另外一台机器后IE也正常。反复修改KeepAlive，disk-cache之类的设置，完全没有效果。 真是叫人郁闷。 检查了apache的配置，感觉问题应该跟mod_deflate模块有关，相应的代码如下：     &#60;IfModule deflate_module&#62;         SetOutputFilter DEFLATE         BrowserMatch ^Mozilla/4 gzip-only-text/html         BrowserMatch ^Mozilla/4\.0[678] no-gzip         BrowserMatch \bMSIE !no-gzip !gzip-only-text/html         SetEnvIfNoCase Request_URI \                 \.(?:gif&#124;jpe?g&#124;png)$ no-gzip dont-vary     &#60;/IfModule&#62; 关闭后IE恢复正常，考虑到一般情况下，mp3和swf压缩不了多少，但是却经常需要断点续传，重新修改相应配置：     &#60;IfModule deflate_module&#62;         SetOutputFilter DEFLATE         BrowserMatch ^Mozilla/4 gzip-only-text/html         BrowserMatch ^Mozilla/4\.0[678] no-gzip         BrowserMatch \bMSIE !no-gzip !gzip-only-text/html         SetEnvIfNoCase [...]]]></description>
			<content:encoded><![CDATA[<p>最近碰到了一个奇异的问题：apache的服务器，一个Flash调Mp3进行播放，用IE和chromium打开后启动时正常，一旦暂停后，再次播放就无效。但对于Firefox则完全正常。</p>
<p>反复检查代码，无果。将文件上传到另外一台机器后IE也正常。反复修改KeepAlive，disk-cache之类的设置，完全没有效果。</p>
<p>真是叫人郁闷。</p>
<p><span id="more-1232"></span></p>
<p>检查了apache的配置，感觉问题应该跟mod_deflate模块有关，相应的代码如下：</p>
<pre>    &lt;IfModule deflate_module&gt;
        SetOutputFilter DEFLATE
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI \
                \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    &lt;/IfModule&gt;</pre>
<p>关闭后IE恢复正常，考虑到一般情况下，mp3和swf压缩不了多少，但是却经常需要断点续传，重新修改相应配置：</p>
<pre>    &lt;IfModule deflate_module&gt;
        SetOutputFilter DEFLATE
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI \
                \.(?:gif|jpe?g|mp3|swf|png)$ no-gzip dont-vary
    &lt;/IfModule&gt;</pre>
<p>完全正常！</p>
<p>分析下来大致原理如下（个人分析，无依据）：<br />
首先假设的是我没有踩中任何一个bug。这个问题似乎跟原先出现过deflate的文件不能断点续传为同一个问题。</p>
<p>mp3采用流格式传输，没有完全下载结束就被暂停下载，由于系统启用了mod_deflat的压缩传输模块，本地保存的实际上是一个gzip过的mp3文件。</p>
<p>由于目前主流浏览器都支持断点续传，而对于断点续传的处理却各有不同，IE和chromium可能会先对于gzip之前的文件进行校验，发觉校验失败，认为这是一个错误的文件，不再进行续传；FF则是先不进行校验，或者校验失败后重新下载续传。</p>
<p>尚为猜测，希望各位朋友给个确凿的解释。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/04/19/flash%e6%92%ad%e6%94%bemp3%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>将Apache日志实时写入mysql</title>
		<link>http://www.litrin.net/2010/02/24/%e5%b0%86apache%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e5%86%99%e5%85%a5mysql/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e5%25b0%2586apache%25e6%2597%25a5%25e5%25bf%2597%25e5%25ae%259e%25e6%2597%25b6%25e5%2586%2599%25e5%2585%25a5mysql</link>
		<comments>http://www.litrin.net/2010/02/24/%e5%b0%86apache%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e5%86%99%e5%85%a5mysql/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 09:54:15 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[服务器]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=1176</guid>
		<description><![CDATA[貌似 站长Litrin已经很久没有关注过LAMP的东西了。 作为网站运行来说，日志分析是一个很重要的工作。当一个网站的日志到了一定程度，或者一个网站同时有多台服务器的时候，传统的文本日志分析总会遇到瓶颈。 这个时候我就会想起强大的sql语句。看了网上很多人的帖子，都是将日志转成sql语句再导入的，搞得有点复杂。本方案不需要任何多余的软件和操作，一切全是实时、自动，供各位参考。 主机至少需要预安装apache(废话！)和mysql的客户端。如果访问量不大且服务器的资源管够的话可以将mysql装在本地，否则建议一台独立的mysql服务器。 在apache配置文件或者虚拟主机配置文件中面添加 LogFormat INSERT INTO apacheLog (ID, dateTime, IP, URL, code, referer, userAgent, size, request) VALUES ( NULL , \"%{%Y-%m-%d %H:%M:%S}t\", \"%a\", \"%U\", \"%&#62;s\", \" %{Referer}i\", \"%{User-Agent}i\", %b, %T);" sqlcomm CustomLog "&#124; /usr/local/Mysql --host=HOST --user=USER --password=PASSWORD --database=LITRIN_NET" sqlcomm 建立数据库apacheLog。 CREATE TABLE ` apacheLog ` ( `ID` int(11) NOT NULL auto_increment, `dateTime` datetime NOT [...]]]></description>
			<content:encoded><![CDATA[<p>貌似 站长Litrin已经很久没有关注过LAMP的东西了。</p>
<p>作为网站运行来说，日志分析是一个很重要的工作。当一个网站的日志到了一定程度，或者一个网站同时有多台服务器的时候，传统的文本日志分析总会遇到瓶颈。</p>
<p>这个时候我就会想起强大的sql语句。看了网上很多人的帖子，都是将日志转成sql语句再导入的，搞得有点复杂。本方案不需要任何多余的软件和操作，一切全是实时、自动，供各位参考。</p>
<p><span id="more-1176"></span></p>
<p>主机至少需要预安装apache(废话！)和mysql的客户端。如果访问量不大且服务器的资源管够的话可以将mysql装在本地，否则建议一台独立的mysql服务器。</p>
<p>在apache配置文件或者虚拟主机配置文件中面添加</p>
<pre>LogFormat INSERT INTO apacheLog (ID, dateTime, IP, URL, code, referer, userAgent, size, request) VALUES ( NULL , \"%{%Y-%m-%d %H:%M:%S}t\", \"%a\", \"%U\", \"%&gt;s\", \" %{Referer}i\", \"%{User-Agent}i\", %b, %T);" sqlcomm
CustomLog "| /usr/local/Mysql --host=HOST --user=USER --password=PASSWORD --database=LITRIN_NET" sqlcomm</pre>
<p>建立数据库apacheLog。</p>
<pre name=code class=sql>
CREATE TABLE ` apacheLog ` (
  `ID` int(11) NOT NULL auto_increment,
  `dateTime` datetime NOT NULL,
  `IP` varchar(15) NOT NULL,
  `URL` varchar(256) NOT NULL,
  `code` varchar(3) NOT NULL,
  `referer` varchar(256) NOT NULL,
  `userAgent` varchar(256) NOT NULL,
  `size` int(11) NOT NULL,
  `request` float NOT NULL,
  PRIMARY KEY  (`ID`),
  KEY `dateTime` (`dateTime`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;
</pre>
<p> 确认无误后重启apache生效！</p>
<p>其实整个流程很简单：先是利用LogFormat设置将日志转换为接近sql的格式，再通过CustomLog 调用pipe实现mysql写入。你也可以参照<a rel="nofollow" target="_blank" href="http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats">http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats</a>的格式设置写入自己关心的数据。<br />
此外，你也可以使用<code>SetEnvIf配合正则表达式过滤掉诸如图片、CSS、JS之类相对不重要的信息。</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/02/24/%e5%b0%86apache%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e5%86%99%e5%85%a5mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用SSH Tunnel穿越防火墙</title>
		<link>http://www.litrin.net/2010/02/09/%e7%94%a8ssh-tunnel%e7%a9%bf%e8%b6%8a%e9%98%b2%e7%81%ab%e5%a2%99/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e7%2594%25a8ssh-tunnel%25e7%25a9%25bf%25e8%25b6%258a%25e9%2598%25b2%25e7%2581%25ab%25e5%25a2%2599</link>
		<comments>http://www.litrin.net/2010/02/09/%e7%94%a8ssh-tunnel%e7%a9%bf%e8%b6%8a%e9%98%b2%e7%81%ab%e5%a2%99/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 02:17:06 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[桌面应用]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=1164</guid>
		<description><![CDATA[这次接上篇。 很多企业对互联网的访问进行了限制，如何突破防火墙的限制成了一个问题。本文就是利用了SSH tunnel搭建了socket5代理。 首先，申请一个外网的ssh帐户，个人建议使用http://www.unix-center.net/提供的免费资源，该网站还提供多种平台主机可供测试之用，非常不错！当然，如果可以使用密钥方式登录那就完美了。 申请好账户之后，依然在本地安装ssh的客户端，windows推荐putty。 安装好后执行putty，在hostname里面输入主机名，或者用户名@主机名。我选了FreeBSD的那台，有兴趣的话还有ubuntu，Sun，甚至龙芯一系列主机可供挑选 选择ssh-&#62;tunnels，在source栏里添加你要提供的端口号，一般随便填一个未使用的端口就可，我用了8080端口。选择Dynamic，点击add。这里需要说明的是，如果你的主机允许别人使用的话，请勾选最上面的Local ports accept connection from other hosts。 点击Open确认连接，在接下来的窗口中输入用户名和密码。最小化窗口，不要关闭。 打开命令行，输入命令netstat -an，如果出现了你刚才输入的那个端口号的侦听，说明搭建成功！socket服务已经完成。 浏览器设置，IE:internet选项，连接，局域网设置，勾选“为LAN使用代理服务器”，高级，套接字选择127.0.0.1并填写端口号。完成设置。 对应的命令行： plink : plink -C -N -f -D 端口号 用户名@主机名 ssh: ssh  -C -N -f -D 端口号 用户名@主机名 PS: 话两头说，如果你负责一个企业局域网的话，稍大点的企业如果要限网，SSH端口是绝对要加以限制使用的。伟大的防火墙亦是如此。]]></description>
			<content:encoded><![CDATA[<p>这次接<a href="http://www.litrin.net/2010/02/03/%e7%94%a8ssh-tunnel%e6%89%93%e9%80%a0%e5%ae%89%e5%85%a8%e9%82%ae%e4%bb%b6%e7%b3%bb%e7%bb%9f/" target="_blank">上篇</a>。</p>
<p>很多企业对互联网的访问进行了限制，如何突破防火墙的限制成了一个问题。本文就是利用了SSH tunnel搭建了socket5代理。</p>
<p>首先，申请一个外网的ssh帐户，个人建议使用<a rel="nofollow" target="_blank" href="http://www.unix-center.net/">http://www.unix-center.net/</a>提供的免费资源，该网站还提供多种平台主机可供测试之用，非常不错！当然，如果可以使用密钥方式登录那就完美了。</p>
<p><span id="more-1164"></span></p>
<p>申请好账户之后，依然在本地安装ssh的客户端，windows推荐<a rel="nofollow" target="_blank" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">putty</a>。</p>
<p>安装好后执行putty，在hostname里面输入主机名，或者用户名@主机名。我选了FreeBSD的那台，有兴趣的话还有ubuntu，Sun，甚至龙芯一系列主机可供挑选</p>
<div id="attachment_1166" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_main.png"><img class="size-medium wp-image-1166" title="ssh_proxy_putty_main" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_main-300x288.png" alt="Putty 主界面" width="300" height="288" /></a><p class="wp-caption-text">Putty 主界面</p></div>
<p>选择ssh-&gt;tunnels，在source栏里添加你要提供的端口号，一般随便填一个未使用的端口就可，我用了8080端口。选择Dynamic，点击add。这里需要说明的是，如果你的主机允许别人使用的话，请勾选最上面的Local ports accept connection from other hosts。</p>
<div id="attachment_1167" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_tunnel_setting.png"><img class="size-medium wp-image-1167" title="ssh_proxy_putty_tunnel_setting" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_tunnel_setting-300x288.png" alt="Putty ssh tunnel界面" width="300" height="288" /></a><p class="wp-caption-text">Putty ssh tunnel界面</p></div>
<p>点击Open确认连接，在接下来的窗口中输入用户名和密码。最小化窗口，不要关闭。</p>
<p>打开命令行，输入命令netstat -an，如果出现了你刚才输入的那个端口号的侦听，说明搭建成功！socket服务已经完成。</p>
<div id="attachment_1165" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_netstat.png"><img class="size-medium wp-image-1165" title="ssh_proxy_netstat" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_netstat-300x195.png" alt="netstat -an " width="300" height="195" /></a><p class="wp-caption-text">netstat -an </p></div>
<p>浏览器设置，IE:internet选项，连接，局域网设置，勾选“为LAN使用代理服务器”，高级，套接字选择127.0.0.1并填写端口号。完成设置。</p>
<div id="attachment_1168" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_IE.png"><img class="size-medium wp-image-1168" title="ssh_proxy_IE" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_IE-300x300.png" alt="IE 设置" width="300" height="300" /></a><p class="wp-caption-text">IE 设置</p></div>
<p>对应的命令行：</p>
<ol>
<li>plink : plink -C -N -f -D 端口号 用户名@主机名</li>
<li>ssh: ssh  -C -N -f -D 端口号 用户名@主机名</li>
</ol>
<p>PS:<br />
话两头说，如果你负责一个企业局域网的话，稍大点的企业如果要限网，SSH端口是绝对要加以限制使用的。伟大的防火墙亦是如此。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/02/09/%e7%94%a8ssh-tunnel%e7%a9%bf%e8%b6%8a%e9%98%b2%e7%81%ab%e5%a2%99/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>配置Ubuntu的php支持OCI8</title>
		<link>http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e9%2585%258d%25e7%25bd%25aeubuntu%25e7%259a%2584php%25e6%2594%25af%25e6%258c%2581oci8</link>
		<comments>http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 09:48:03 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=1085</guid>
		<description><![CDATA[PHP的OCI模块支持Oracle总是比较让人头痛。这趟弄个ubuntu的安装文档。 通过ubuntu-server安装盘安装LAMP。当然，正常情况下，建议安装好openssh服务器，免得麻烦。 虽然ubuntu的server支持root直接登录，既然是ubutu，还是遵循它的sudo吧。 安装结束后，启动server。 首先，经典的更新 #sudo apt-get update; sudo apt-get upgrade 添加所需的包 #sudo apt-get install php5-dev build-essential php-pear libaio1 差点忘了，要装unzip： #sudo apt-get install unzip 按照oracle官方网站的要求http://www.oracle.com/technology/tech/oci/instantclient/index.html 下载Instant Client ，我老老实实的下载了basic和sdk两个包，理论上下载basic-lit和sdk就可以。 设立目录，解压缩： #sudo mkdir /opt/oracle #sudo cp ~/*.zip /opt/oracle #cd /opt/oracle #sudo unzip ./*.zip #sudo mv instantclient_11_1 instantclient 设置instantclient： #sudo ln –s libclntsh.so.11.1 libclntsh.so #sudo ln –s libocci.so.11.1 libocci.so [...]]]></description>
			<content:encoded><![CDATA[<p>PHP的OCI模块支持Oracle总是比较让人头痛。这趟弄个ubuntu的安装文档。</p>
<p>通过ubuntu-server安装盘安装LAMP。当然，正常情况下，建议安装好openssh服务器，免得麻烦。</p>
<p>虽然ubuntu的server支持root直接登录，既然是ubutu，还是遵循它的sudo吧。</p>
<p>安装结束后，启动server。</p>
<p>首先，经典的更新<br />
#sudo apt-get update; sudo apt-get upgrade</p>
<p><span id="more-1085"></span></p>
<p>添加所需的包<br />
#sudo apt-get install php5-dev build-essential php-pear libaio1</p>
<p>差点忘了，要装unzip：<br />
#sudo apt-get install unzip</p>
<p>按照oracle官方网站的要求<a rel="nofollow" target="_blank" href="http://www.oracle.com/technology/tech/oci/instantclient/index.html">http://www.oracle.com/technology/tech/oci/instantclient/index.html</a> 下载<span>Instant Client ，我老老实实的下载了basic和sdk两个包，理论上下载basic-lit和sdk就可以。</span></p>
<p>设立目录，解压缩：<br />
#sudo mkdir /opt/oracle<br />
#sudo cp ~/*.zip /opt/oracle<br />
#cd /opt/oracle<br />
#sudo unzip ./*.zip<br />
#sudo mv instantclient_11_1 instantclient</p>
<p>设置instantclient：<br />
#sudo ln –s libclntsh.so.11.1 libclntsh.so<br />
#sudo ln –s libocci.so.11.1 libocci.so<br />
#sudo export ORACLE_HOME=/opt/oracle/instantclien</p>
<p>添加lib库位置：<br />
#cd /etc/ld.so.conf.d<br />
#sudo nano liboci.conf  //添加一行：/opt/oracle/instantclient<br />
#sudo ldconfig</p>
<p>准备OCI8库：<br />
#sudo mkdir /tmp/src<br />
#cd /tmp/src<br />
#sudo pecl download oci8<br />
#sudo tar vzxf oci8-1.3.5.tgz //我下载的版本是135<br />
#cd oci8-1.3.5</p>
<p>编译OCI8：<br />
#sudo phpize //比较容易出错的地方，如果报错，你可能没有安装php5-dev包<br />
#sudo ./configure &#8211;with-oci8=share,instantclient,$ORACLE_HOME<br />
#sudo make; sudo make install</p>
<p>设置php5支持：<br />
正常情况下编译完成后会有提示：Installing shared extensions:     /usr/lib/php5/20060613/<br />
到此目录下确认是否存在oci8.so<br />
#cd /etc/php5/conf.d<br />
#sudo nano oci8.ini //添加一行：extension=oci8.so<br />
#sudo apache2ctl restart</p>
<p>经过上述步骤，oci8模块就会成功安装，可以通过phpinfo页面确认是否存在oci8模块</p>
<h2><a name="module_oci8">oci8</a></h2>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<td>OCI8 Support</td>
<td>enabled</td>
</tr>
<tr>
<td>Version</td>
<td>1.3.5</td>
</tr>
<tr>
<td>Revision</td>
<td>$Revision: 1.269.2.16.2.38.2.32 $</td>
</tr>
<tr>
<td>Active Persistent Connections</td>
<td>0</td>
</tr>
<tr>
<td>Active Connections</td>
<td>0</td>
</tr>
<tr>
<td>Oracle Instant Client Version</td>
<td>11.1</td>
</tr>
<tr>
<td>Temporary Lob support</td>
<td>enabled</td>
</tr>
<tr>
<td>Collections support</td>
<td>enabled</td>
</tr>
</tbody>
</table>
<p> </p>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<th>Directive</th>
<th>Local Value</th>
<th>Master Value</th>
</tr>
<tr>
<td>oci8.connection_class</td>
<td><em>no value</em></td>
<td><em>no value</em></td>
</tr>
<tr>
<td>oci8.default_prefetch</td>
<td>100</td>
<td>100</td>
</tr>
<tr>
<td>oci8.events</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>oci8.max_persistent</td>
<td>-1</td>
<td>-1</td>
</tr>
<tr>
<td>oci8.old_oci_close_semantics</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>oci8.persistent_timeout</td>
<td>-1</td>
<td>-1</td>
</tr>
<tr>
<td>oci8.ping_interval</td>
<td>60</td>
<td>60</td>
</tr>
<tr>
<td>oci8.privileged_connect</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>oci8.statement_cache_size</td>
<td>20</td>
<td>20</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>说说“专业”</title>
		<link>http://www.litrin.net/2009/09/11/%e8%af%b4%e8%af%b4%e2%80%9c%e4%b8%93%e4%b8%9a%e2%80%9d/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e8%25af%25b4%25e8%25af%25b4%25e2%2580%259c%25e4%25b8%2593%25e4%25b8%259a%25e2%2580%259d</link>
		<comments>http://www.litrin.net/2009/09/11/%e8%af%b4%e8%af%b4%e2%80%9c%e4%b8%93%e4%b8%9a%e2%80%9d/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 10:12:24 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[业界话题]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=1081</guid>
		<description><![CDATA[暂且不提中文里说你不专业是什么语气，至少来说，在英语语系里说一个人或者一家公司是“不专业的”，不管什么语境，总归是句很重的话。 公司的一家子公司，由于人少财弱，没有专职的网站开发人员。于是找了一个现在比较知名的免费网店全站程序。用的久了，不够用了，联系了那家公司进行开发。这本身也是符合免费软件生存法则的，没有什么不对。对方很专业的报价350块/小时。很是吓人的价钱。周瑜打黄盖，一个愿打一个愿挨。认了，付钱，问题才刚刚开始。 作为服务器的管理员，首先他们问我要root帐号，要知道，这台主机的网站差不多有几十个，谁会给？然后他们很发了顿牢骚。不得已，开了一个用户给他们，竟然蒙混过去，他们竟然以为得到了root，汗。 然后又是说ftp连不上，我很客气的说ftp没开，又是牢骚：“人家的linux都开ftp的，为什么？”我建议他们用sftp上传就OK，“不会用。”。又晕！嫌烦，现装了proftpd应付过去，又被人说密码太长太难记，彻底无语！ 大约一个礼拜左右（350块/小时，赚了不少吧？）我得知他们已经完成了网站的定制开发。OK，停ftp，删帐户。程序照旧是加密的php，一个根目录下的php.php引起了我的注意，好家伙！&#60;? phpinfo(); ?&#62; 嫌我的站点太安全了不成？仔细查找了一下发现根目录下还有一个data.zip文件，全是打包的程序文件，当然包括数据库配置的用户名和密码。一个“白版页面”只有一个文本栏和一个submit按钮，顺手输入了一句sql，很幸运的发现了这竟然是数据库的接口——甚至可以直接drop table。文件名，就叫做sql.php，当然还是在根目录下。 如果说他们是在测试机下，新手来做，我们可以理解，可要知道生产环境下的服务器，调试程序都会要了命。 如他们所说“以专业的功能、领先的技术以及快速的价值体现，获得了45万用户的肯定。”我只能说，最近黑客们的效率确实很低。如此厂商如何评价？]]></description>
			<content:encoded><![CDATA[<p>暂且不提中文里说你不专业是什么语气，至少来说，在英语语系里说一个人或者一家公司是“不专业的”，不管什么语境，总归是句很重的话。</p>
<p>公司的一家子公司，由于人少财弱，没有专职的网站开发人员。于是找了一个现在比较知名的免费网店全站程序。用的久了，不够用了，联系了那家公司进行开发。这本身也是符合免费软件生存法则的，没有什么不对。对方很专业的报价350块/小时。很是吓人的价钱。周瑜打黄盖，一个愿打一个愿挨。认了，付钱，问题才刚刚开始。</p>
<p><span id="more-1081"></span></p>
<p>作为服务器的管理员，首先他们问我要root帐号，要知道，这台主机的网站差不多有几十个，谁会给？然后他们很发了顿牢骚。不得已，开了一个用户给他们，竟然蒙混过去，他们竟然以为得到了root，汗。</p>
<p>然后又是说ftp连不上，我很客气的说ftp没开，又是牢骚：“人家的linux都开ftp的，为什么？”我建议他们用sftp上传就OK，“不会用。”。又晕！嫌烦，现装了proftpd应付过去，又被人说密码太长太难记，彻底无语！</p>
<p>大约一个礼拜左右（350块/小时，赚了不少吧？）我得知他们已经完成了网站的定制开发。OK，停ftp，删帐户。程序照旧是加密的php，一个根目录下的php.php引起了我的注意，好家伙！&lt;? phpinfo(); ?&gt; 嫌我的站点太安全了不成？仔细查找了一下发现根目录下还有一个data.zip文件，全是打包的程序文件，当然包括数据库配置的用户名和密码。一个“白版页面”只有一个文本栏和一个submit按钮，顺手输入了一句sql，很幸运的发现了这竟然是数据库的接口——甚至可以直接drop table。文件名，就叫做sql.php，当然还是在根目录下。</p>
<p>如果说他们是在测试机下，新手来做，我们可以理解，可要知道生产环境下的服务器，调试程序都会要了命。</p>
<p>如他们所说“以专业的功能、领先的技术以及快速的价值体现，获得了45万用户的肯定。”我只能说，最近黑客们的效率确实很低。如此厂商如何评价？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/09/11/%e8%af%b4%e8%af%b4%e2%80%9c%e4%b8%93%e4%b8%9a%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>wordpress2.8的一个问题</title>
		<link>http://www.litrin.net/2009/07/15/wordpress2-8%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress2-8%25e7%259a%2584%25e4%25b8%2580%25e4%25b8%25aa%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2009/07/15/wordpress2-8%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 05:37:25 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[服务器]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=1037</guid>
		<description><![CDATA[前一段时间把小站的wordpress升级到了2.8。升级结束后，发觉后台的特效全部出了问题。文章编辑栏也坏掉了。 搜索了google，很多人报类似的错误。说是google某个插件的lib和系统冲突。多次禁用全部的插件依然无果。 以为是php版本太低，升级了php，照旧。 反复折腾中2.81正式release了,更新，再度失望。 搭建了一套测试环境，整个系统搬过去却奇迹的解决了问题。OK，至少错误定位了，开始检查php.ini。 反复调试后，总算找到了问题所在：很不起眼的magic_quotes_gpc设置成了On，修改成了Off,一切解决！ 比较令人不解的是，这个不起眼的设置怎么会影响到JS的故障，很是郁闷。 PS:其实unreal写的那个Easy AdSense真的是很垃圾，强行插入链接，满屏的paypal“捐助请求”，又是替换你的广告代码——少赚广告费倒是算了，被怀疑作弊就麻烦大了。几乎一天一个版本的更新，真的是很“敬业”。只能自己重新写了一个。有想要的可以直接告诉我。]]></description>
			<content:encoded><![CDATA[<p>前一段时间把小站的wordpress升级到了2.8。升级结束后，发觉后台的特效全部出了问题。文章编辑栏也坏掉了。</p>
<p>搜索了google，很多人报类似的错误。说是google某个插件的lib和系统冲突。多次禁用全部的插件依然无果。</p>
<p>以为是php版本太低，升级了php，照旧。</p>
<p><span id="more-1037"></span>反复折腾中2.81正式release了,更新，再度失望。</p>
<p>搭建了一套测试环境，整个系统搬过去却奇迹的解决了问题。OK，至少错误定位了，开始检查php.ini。</p>
<p>反复调试后，总算找到了问题所在：很不起眼的magic_quotes_gpc设置成了On，修改成了Off,一切解决！</p>
<p>比较令人不解的是，这个不起眼的设置怎么会影响到JS的故障，很是郁闷。</p>
<p>PS:其实unreal写的那个Easy AdSense真的是很垃圾，强行插入链接，满屏的paypal“捐助请求”，又是替换你的广告代码——少赚广告费倒是算了，被怀疑作弊就麻烦大了。几乎一天一个版本的更新，真的是很“敬业”。只能自己重新写了一个。有想要的可以直接告诉我。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/07/15/wordpress2-8%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD+apache+PHP+OCI支持Oracle</title>
		<link>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=freebsdapachephpoci%25e6%2594%25af%25e6%258c%2581oracle</link>
		<comments>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 10:08:54 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[服务器]]></category>
		<guid isPermaLink="false">http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/</guid>
		<description><![CDATA[由于FreeBSD的Port中自带了oracle-client可用，但仅支持i386的平台，故此文仅针对于i386，AMD64无法实现oci的连接库。 首先，确定你已经安装好apache + php，没有安装的可以参考这里或者文学化的这里 安装php5-oci8 cd /usr/ports/database/php5-oci8 make install clean 安装到这里，Php的OCI8库已经安装成功，但需要对oracle-client进行设置，否则无法使用。 将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下 内容大致如下： ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) ) 由于php默认只会在/etc目录下查找该目录，这里我做了一个手工链接 ln -s /usr/local/oracle8-client/network/admin/tnsnames.ora /etc/tnsnames.ora tnsnames已经配置完成，但对于非ASCII字符集最容setenv NLS_LANG 易出现的问题就是乱码了，这里要设置一下。 killall httpd //杀掉httpd进程，我曾经碰到过apachectl无效的情况 ee /usr/local/sbin/apachectl 在第二行加入： setenv american_america.UTF8 setenv ORACLE_HOME [...]]]></description>
			<content:encoded><![CDATA[<p>由于FreeBSD的Port中自带了oracle-client可用，但仅支持i386的平台，故此文仅针对于i386，AMD64无法实现oci的连接库。</p>
<p>首先，确定你已经安装好apache + php，没有安装的可以参考<a href="http://www.litrin.net/2005/11/09/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql/comment-page-1/#comment-1345" target="_blank">这里</a>或者文学化的<a href="http://www.litrin.net/2007/08/01/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql%c2%b7%e6%94%b9/" target="_blank">这里</a></p>
<p>安装php5-oci8</p>
<p>cd /usr/ports/database/php5-oci8<br />
make install clean</p>
<p>安装到这里，Php的OCI8库已经安装成功，但需要对oracle-client进行设置，否则无法使用。</p>
<p>将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下<br />
内容大致如下：<span id="more-1026"></span></p>
<p>ORCL =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = ORCL)<br />
)<br />
)<br />
<!--break--><br />
由于php默认只会在/etc目录下查找该目录，这里我做了一个手工链接<br />
ln -s /usr/local/oracle8-client/network/admin/tnsnames.ora /etc/tnsnames.ora</p>
<p>tnsnames已经配置完成，但对于非ASCII字符集最容setenv NLS_LANG<br />
易出现的问题就是乱码了，这里要设置一下。<br />
killall httpd //杀掉httpd进程，我曾经碰到过apachectl无效的情况<br />
ee /usr/local/sbin/apachectl<br />
在第二行加入：<br />
setenv american_america.UTF8<br />
setenv ORACLE_HOME /usr/local/oracle8-client</p>
<p>开启apache<br />
apachectl start</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>说说WordPress和Drupal</title>
		<link>http://www.litrin.net/2009/05/05/%e8%af%b4%e8%af%b4wordpress%e5%92%8cdrupal/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e8%25af%25b4%25e8%25af%25b4wordpress%25e5%2592%258cdrupal</link>
		<comments>http://www.litrin.net/2009/05/05/%e8%af%b4%e8%af%b4wordpress%e5%92%8cdrupal/#comments</comments>
		<pubDate>Tue, 05 May 2009 06:14:26 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=980</guid>
		<description><![CDATA[上次就想把Wordpress和Drupal做一个对比，这次补上。 WordPress和Drupal都是目前比较流行的开源CMS，用户数量也比较多。以下将从比较常用的几个方面进行比较。 平台支持 作为典型的LAMP结构的应用软件，WP仅支持Mysql，而DP支持mysql和Pgsql两种数据库。从某种虽然像本站这样从pgsql迁移到mysql的平台几乎很少，而且国内很少有Pgsql的空间，作为一个开源项目，提供多个备选数据库还是不错的。 从响应时间上看，同样采用了Mysql的数据库，DP的响应速度快了WP不少，但换成了Pgsql之后，速度慢了整整一个数量级——这跟Pgsql本身有关。故可以认为同等数量下，DP的硬件要求相对较低。 数据结构 看了WP的数据结构，了了10张表，感觉很干净。每个表的字段命名方式也足够清晰。初学者不需要多少时间就能理解整个数据流程。而且默认会在表名前添加wp_前缀，方便那些虚拟主机用户添加别的系统。 DP的数据结构比较复杂，40几个表的数量相对比较惊人。冗余度很高表名，字段名，重复的很多，也有很多缩写，初学者很容易给吓住。默认没有前缀，虽然可以设置前缀，但相对比较麻烦。 逻辑结构 WP的逻辑结构是一个内核程序已经可以完成大部分的功能，其他的功能通过plugin的方式实现。DP的逻辑是整个程序是由若干个Module实现，每块的功能都可以通过设置进行开关设置。相对灵活性比较好，但设置自然而然的复杂了很多。 安装步骤 WP的安装步骤相对较多，很详细的流程向导。WP的安装只要设置好数据库就OK，但不够清晰，特别是管理员添加采用的方式，很容易让人迷糊，同时不注意的话，默认注册用户就会有管理员权限。 本地化实现 WP的本地化通过.mo文件实现，等于是基于内核的实现，速度几乎不受影响。DP的本地化基于Module实现，每出现一个词组就需要一次数据库查询，相对效率低下。 主题开发 由于DP特有的逻辑，主题方面本身也是一个Module，可以通过扩展的方式支持各种同样的模板引擎，很适合于大团队进行主题的开发。WP相对主题开发比较困难，默认不支持页面引擎扩展，主题制作需要一定的PHP基础。 插件开发 DP的插件相对比较复杂，涉及到很多内容，需要对整个系统有一定的了解才能完成。WP的插件相对比较简单，对于简单的插件只要明确“在什么地方出现什么”就可以完成，甚至默认还提供了一个Hello Dolly伪插件作为范例。 管理界面 DP的管理界面与用户界面高度统一，同时提供了详尽的日志方便查阅。WP采用独立的管理控制台，可查阅的内容不多。 其他 默认状况下，WP提供了一个反垃圾插件很是有效。 个人觉得，两个系统都各有所长： WP方便简单，很适合于个人网站的快速部署。DP功能很强，同时支持企业级的Pgsql，适合具有一定规模的网站。 WP很容易开发出一些小插件，但界面开发有一定难度，最好找个主题自己修改。DP可以很容易的进行大规模的模块、主题HACK且不会对系统做成太大影响，前提是你要对他有足够的了解。]]></description>
			<content:encoded><![CDATA[<p>上次就想把Wordpress和Drupal做一个对比，这次补上。</p>
<p>WordPress和Drupal都是目前比较流行的开源CMS，用户数量也比较多。以下将从比较常用的几个方面进行比较。</p>
<ol>
<li>平台支持<br />
作为典型的LAMP结构的应用软件，WP仅支持Mysql，而DP支持mysql和Pgsql两种数据库。从某种虽然像本站这样从pgsql迁移到mysql的平台几乎很少，而且国内很少有Pgsql的空间，作为一个开源项目，提供多个备选数据库还是不错的。<span id="more-980"></span><br />
从响应时间上看，同样采用了Mysql的数据库，DP的响应速度快了WP不少，但换成了Pgsql之后，速度慢了整整一个数量级——这跟Pgsql本身有关。故可以认为同等数量下，DP的硬件要求相对较低。</li>
<li>数据结构<br />
看了WP的数据结构，了了10张表，感觉很干净。每个表的字段命名方式也足够清晰。初学者不需要多少时间就能理解整个数据流程。而且默认会在表名前添加wp_前缀，方便那些虚拟主机用户添加别的系统。<br />
DP的数据结构比较复杂，40几个表的数量相对比较惊人。冗余度很高表名，字段名，重复的很多，也有很多缩写，初学者很容易给吓住。默认没有前缀，虽然可以设置前缀，但相对比较麻烦。</li>
<li>逻辑结构<br />
WP的逻辑结构是一个内核程序已经可以完成大部分的功能，其他的功能通过plugin的方式实现。DP的逻辑是整个程序是由若干个Module实现，每块的功能都可以通过设置进行开关设置。相对灵活性比较好，但设置自然而然的复杂了很多。</li>
<li>安装步骤<br />
WP的安装步骤相对较多，很详细的流程向导。WP的安装只要设置好数据库就OK，但不够清晰，特别是管理员添加采用的方式，很容易让人迷糊，同时不注意的话，默认注册用户就会有管理员权限。</li>
<li>本地化实现<br />
WP的本地化通过.mo文件实现，等于是基于内核的实现，速度几乎不受影响。DP的本地化基于Module实现，每出现一个词组就需要一次数据库查询，相对效率低下。</li>
<li>主题开发<br />
由于DP特有的逻辑，主题方面本身也是一个Module，可以通过扩展的方式支持各种同样的模板引擎，很适合于大团队进行主题的开发。WP相对主题开发比较困难，默认不支持页面引擎扩展，主题制作需要一定的PHP基础。</li>
<li>插件开发<br />
DP的插件相对比较复杂，涉及到很多内容，需要对整个系统有一定的了解才能完成。WP的插件相对比较简单，对于简单的插件只要明确“在什么地方出现什么”就可以完成，甚至默认还提供了一个Hello Dolly伪插件作为范例。</li>
<li>管理界面<br />
DP的管理界面与用户界面高度统一，同时提供了详尽的日志方便查阅。WP采用独立的管理控制台，可查阅的内容不多。</li>
<li>其他<br />
默认状况下，WP提供了一个反垃圾插件很是有效。</li>
</ol>
<p>个人觉得，两个系统都各有所长：</p>
<ul>
<li>WP方便简单，很适合于个人网站的快速部署。DP功能很强，同时支持企业级的Pgsql，适合具有一定规模的网站。</li>
<li>WP很容易开发出一些小插件，但界面开发有一定难度，最好找个主题自己修改。DP可以很容易的进行大规模的模块、主题HACK且不会对系统做成太大影响，前提是你要对他有足够的了解。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/05/05/%e8%af%b4%e8%af%b4wordpress%e5%92%8cdrupal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql的几个设置值</title>
		<link>http://www.litrin.net/2009/04/14/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e8%ae%be%e7%bd%ae%e5%80%bc/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mysql%25e7%259a%2584%25e5%2587%25a0%25e4%25b8%25aa%25e8%25ae%25be%25e7%25bd%25ae%25e5%2580%25bc</link>
		<comments>http://www.litrin.net/2009/04/14/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e8%ae%be%e7%bd%ae%e5%80%bc/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 09:19:57 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[mysql]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=970</guid>
		<description><![CDATA[mysql数据库的优化——老声长谈的话题，总是有那么多的话题好谈。闲来无事，谈谈几个关键优化参数的设置问题。注意的是，本文主要针对于MyISAM引擎，其他的，日后再吧。 在此之前，如果对mysql的命令和配置不很熟的情况下，phpmysql是必要的。 首先，到状态选项栏，拉一个系统状态表下来，或者执行mysqladmin variables extended-status –u root –p  ，同时计算下系统的uptime. 配置文件一般保存在/etc/my.cnf中，直接修改其中的内容即可。 此外，我的设置中还有如下内容： skip-networking #不使用网络连接 skip-innodb #不使用innodb引擎 thread_concurrency = 4 #这个数值等于cpu核心数x2 key_buffer_size参数的设置:索引缓冲池大小，决定了处理索引的速度。官方文档说最多这将会有238%的性能提升。什么，你的表不加索引？来人啊，把他拖到这个页面。 算法一：把系统中所有在用的表的索引加起来，个人习惯取一个最接近此数的2的n次方。如32M，64M，128M…… 算法二：设置到Key_reads  ：Key_read_requests 至少应该1：500以上，越大越好，例如我的： [root@www ~]# mysqladmin variables extended-status -u admin -p  &#124;grep Key_re Enter password: &#124; Key_read_requests        &#124; 7335599   &#124; &#124; Key_reads                          &#124; 9137      &#124; 两种方式随个人喜好啦，个人习惯用后面的方式进行配置。 query_cache_size：返回结果缓存，数据库会将返回值缓冲，当然会快，如果想要强制关闭该功能，可以在sql中加入SQL_NO_CACHE。 [root@www ~]# mysqladmin variables extended-status -u [...]]]></description>
			<content:encoded><![CDATA[<p>mysql数据库的优化——老声长谈的话题，总是有那么多的话题好谈。闲来无事，谈谈几个关键优化参数的设置问题。注意的是，本文主要针对于MyISAM引擎，其他的，日后再吧。</p>
<p>在此之前，如果对mysql的命令和配置不很熟的情况下，phpmysql是必要的。</p>
<p>首先，到状态选项栏，拉一个系统状态表下来，或者执行mysqladmin variables extended-status –u root –p  ，同时计算下系统的uptime.</p>
<p>配置文件一般保存在/etc/my.cnf中，直接修改其中的内容即可。</p>
<p>此外，我的设置中还有如下内容：</p>
<p>skip-networking #不使用网络连接<br />
skip-innodb #不使用innodb引擎</p>
<p>thread_concurrency = 4 #这个数值等于cpu核心数x2</p>
<p><span id="more-970"></span></p>
<p><strong>key_buffer_size参数的设置:</strong>索引缓冲池大小，决定了处理索引的速度。官方文档说最多这将会有238%的性能提升。什么，你的表不加索引？来人啊，<a href="http://www.litrin.net/2006/03/25/%e4%bc%98%e5%8c%96%e4%bd%a0%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93/">把他拖到这个页面。</a></p>
<ol>
<li>算法一：把系统中所有在用的表的索引加起来，个人习惯取一个最接近此数的2的n次方。如32M，64M，128M……</li>
<li>算法二：设置到Key_reads  ：Key_read_requests 至少应该1：500以上，越大越好，例如我的：<br />
[root@www ~]# mysqladmin variables extended-status -u admin -p  |grep Key_re<br />
Enter password:<br />
| Key_read_requests        | 7335599   |<br />
| Key_reads                          | 9137      |</li>
</ol>
<p>两种方式随个人喜好啦，个人习惯用后面的方式进行配置。</p>
<p><strong>query_cache_size：</strong>返回结果缓存，数据库会将返回值缓冲，当然会快，如果想要强制关闭该功能，可以在sql中加入SQL_NO_CACHE。</p>
<p>[root@www ~]# mysqladmin variables extended-status -u admin -p  |grep Qcache<br />
Enter password:<br />
| Qcache_free_blocks       | 115       |<br />
| Qcache_free_memory       | 27422464  | #剩余的缓冲空间<br />
| Qcache_hits              | 15257     |<br />
| Qcache_inserts           | 11492     |<br />
| Qcache_lowmem_prunes     | 0         | #出现缓存过低的此数<br />
| Qcache_not_cached        | 29        |<br />
| Qcache_queries_in_cache  | 1115      | #缓存的结果数<br />
| Qcache_total_blocks      | 2441      |<br />
| Questions                | 43849     |</p>
<p>次数值大致算法：最大返回大小x每5分钟查询次数。</p>
<p>原则上，如果内存足够的情况下，可以尽量调大此数值。个人认为  uptime 秒数/Qcache_lowmem_prunes  应该小于300。这意味着至少不是每5分钟系统就报一次缓存过低。</p>
<p>要注意的是配置了此参数的时候，请同时设置 query_cache_type= 1</p>
<p><strong>table_cache</strong>：表缓冲数量。</p>
<p>mysqladmin variables extended-status -u admin -p  |grep Open<br />
Enter password:<br />
| Open_files               | 191       |<br />
| Open_streams             | 0         |<br />
| Open_tables              | 132       | #打开的表<br />
| Opened_tables            | 138       | #已经打开的表</p>
<p>我这边设置的table_cache为512，uptime为2小时，暂时看不出有什么问题，如果系统一开没多久Open_tables就已经等于设置的table_cache的时候，请将此数值再调大。</p>
<p><strong>关于索引：</strong>刚才被拖走的兄弟可以回来了^_^<br />
很多人最初接触索引的时候，以为索引越多越快。其实不然，过多的索引往往会拖慢系统，按照惯例索引字段最多只占字段总数的40%。多则无益。</p>
<p>索引字段的类型，尽量选择numeric下属的类型或者date time下属的类型，如果非要用string，可以尝试使用char来取代varchar，很多情况下不影响使用，但性能提升一个档次。</p>
<p><strong>关于内存</strong></p>
<p>经过上面的折腾，内存耗用量应该大有提升。很多人觉得内存占用高了性能会下降——这似乎是windows桌面的问题。要知道，<span style="text-decoration: underline;">作为一个数据库服务器而言，痛苦的不是内存用完了；而是内存用不掉，IO用光了。</span> 能把内存用的光光但swap基本不动，这才是高明的系统管理员。</p>
<p>正常负载下，mysql的内存耗用要保证大于空闲内存。</p>
<p><strong>sql语句的问题</strong></p>
<p>尽管这不属于系统管理员的工作内容，但要知道，一个到处是select * 语句的程序是绝对会影响系统性能的。</p>
<p><strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/04/14/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e8%ae%be%e7%bd%ae%e5%80%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress的家</title>
		<link>http://www.litrin.net/2009/03/17/wordpress%e7%9a%84%e5%ae%b6/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=wordpress%25e7%259a%2584%25e5%25ae%25b6</link>
		<comments>http://www.litrin.net/2009/03/17/wordpress%e7%9a%84%e5%ae%b6/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 05:50:59 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=558</guid>
		<description><![CDATA[几次思想斗争以后，总算下了狠心将小站迁移到了wordpress。 迁移的大致成绩如下： 所有文章页全部迁移成功，文章标签只能后续手工做。 评论迁移了大部分，部分评论由于格式问题无法被迁移。 网站模板全部丢弃。 其余的数据全部丢弃。 原先的链接全部碎掉，需要小幅的hack。 之前的小站使用drupal，由于系统的数据库仅支持postgresql，Drupal似乎是唯一的选择。等到网站上线后，忽然间发觉再要移植数据库几乎是不可能的。postgresql并不是那么普遍，只是至少在国内没有几家能够提供这个平台，兼容性成了问题。 wordpress可以说是最近发展最快的系统，对于Ajax和SEO也支持的绝佳，种种优势不言而喻。 litrin本人经过这一段时间，CSS和PHP的功力大幅下降——糟糕的页面布局就是最好的例证:-) 最后，奉上转移脚本，希望能够给同样困扰的朋友些许帮助。 &#60;?php //Wordpress的URL路径 $wpURL = ‘http://www.litrin.net/’; //目标数据库(mysql)设置 $mysqlServer = ‘localhost’; $mysqlUser = ”; $mysqlPasswd = ”; $mysqlDB = ”; //源数据库(pgsql)设置 $pgsqlServer = ‘localhost’; $pgsqlUser = ”; $pgsqlPasswd = ”; $pgsqlDB = ”; $mysql = mysql_connect($mysqlServer, $mysqlUser, $mysqlPasswd); mysql_select_db($mysqlDB); $pgsql = pg_connect(“host=”.$pgsqlServer.” port=5432 dbname=”.$pgsqlDB.” user=”.$pgsqlUser.” password=”.$pgsqlPasswd); [...]]]></description>
			<content:encoded><![CDATA[<pre>几次思想斗争以后，总算下了狠心将小站迁移到了<a rel="nofollow" target="_blank" href="http://wordpress.org" target="_blank">wordpress</a>。</pre>
<p>迁移的大致成绩如下：</p>
<ul>
<li>所有文章页全部迁移成功，文章标签只能后续手工做。</li>
<li>评论迁移了大部分，部分评论由于格式问题无法被迁移。</li>
<li>网站模板全部丢弃。</li>
<li>其余的数据全部丢弃。</li>
<li>原先的链接全部碎掉，需要小幅的hack。</li>
</ul>
<p>之前的小站使用drupal，由于系统的数据库仅支持postgresql，Drupal似乎是唯一的选择。等到网站上线后，忽然间发觉再要移植数据库几乎是不可能的。postgresql并不是那么普遍，只是至少在国内没有几家能够提供这个平台，兼容性成了问题。</p>
<p>wordpress可以说是最近发展最快的系统，对于Ajax和SEO也支持的绝佳，种种优势不言而喻。</p>
<p>litrin本人经过这一段时间，CSS和PHP的功力大幅下降——糟糕的页面布局就是最好的例证:-)</p>
<p>最后，奉上转移脚本，希望能够给同样困扰的朋友些许帮助。<br />
<span id="more-558"></span></p>
<div>
<pre name=code class=php>
&lt;?php
//Wordpress的URL路径
$wpURL = ‘http://www.litrin.net/’;
//目标数据库(<a title="mysql" href="http://www.litrin.net/tag/mysql/">mysql</a>)设置
$mysqlServer = ‘localhost’;
$mysqlUser = ”;
$mysqlPasswd = ”;
$mysqlDB = ”;
//源数据库(pgsql)设置
$pgsqlServer = ‘localhost’;
$pgsqlUser = ”;
$pgsqlPasswd = ”;
$pgsqlDB = ”;
$mysql = mysql_connect($mysqlServer, $mysqlUser, $mysqlPasswd);
mysql_select_db($mysqlDB);
$pgsql = pg_connect(“host=”.$pgsqlServer.” port=5432 dbname=”.$pgsqlDB.” user=”.$pgsqlUser.” password=”.$pgsqlPasswd);
//先期准备
echo ‘Start import…n’;
mysql_query(‘SET NAME UTF8′);
mysql_query(‘TRUNCATE `wp_posts`’);
mysql_query(‘TRUNCATE `wp_comments`’);
//文章导入
echo ‘Start import node…n’;
$SQL = “SELECT nid, title, body, created, changed FROM node ORDER BY nid “;
$result = pg_query($pgsql, $SQL);
while ( $arr = pg_fetch_array($result, NULL, PGSQL_ASSOC) ){
 $title = $arr[title];
 $body = $arr[body];
 $createDate = date(DATE_ATOM, $arr[created]);
 $createDate_gmt = date(DATE_ATOM, $arr[created] – 8 * 3600);
 $changedDate = date(DATE_ATOM, $arr[changed]);
 $changedDate_gmt = date(DATE_ATOM, $arr[changed] – 8 * 3600);
 $id = $arr[nid];
 $postType = $wpURL . “?p=” . $id ;
 
 $sqlIns = “INSERT INTO `wp_posts`
    (`ID`,`post_author`, `post_date`, `post_date_gmt`, `post_content`,
    `post_title`, `post_category`, `post_excerpt`, `post_status`, `comment_status`,
    `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`,
    `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`,
    `post_type`, `post_mime_type`, `comment_count`)
   VALUES (
         ”.$id.”,1, ‘”.$createDate.”‘, ‘”.$createDate_gmt.”‘, ‘”.$body.”‘,
    ’”.$title.”‘, 0, ”, ‘publish’, ‘open’, ‘open’,
    ”, ‘”.$title.”‘, ”, ”, ‘”.$changedDate.”‘, ‘”.$changedDate_gmt.”‘,
    ”, 0, ‘”.$postType.”‘, 0, ‘post’, ”, 0)”;
 
 $query = mysql_query($sqlIns);
 
}
//评论导入
echo ‘Start import comment… n ‘;
$SQL= “SELECT cid, nid, name, homepage, timestamp, comment FROM comments ORDER BY cid”;
$result = pg_query($pgsql, $SQL);
while ( $arr = pg_fetch_array($result, NULL, PGSQL_ASSOC) ){
 $sqlIns= “INSERT INTO `wp_comments`
    (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`,
    `comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt`,
    `comment_content`, `comment_karma`, `comment_approved`, `comment_agent`,
    `comment_type`, `comment_parent`, `user_id`)
   VALUES (“.$arr[cid].”, “.$arr[nid].”, ‘”.$arr[name].”‘, ”, ‘”.$arr[homepage].”‘,
    ”, ‘”.date(DATE_ATOM, $arr[timestamp]).”‘, ‘”.date(DATE_ATOM, $arr[timestamp] – 8 * 3600).”‘,
    ’”.$arr[comment].”‘, 0, ‘1′, ”, ”, 0, “.$arr[uid].”)”;
 
 $query = mysql_query($sqlIns); 
 
}
//评论整理
echo ‘Start arrage comment… n’;
$SQL= “SELECT comment_post_ID, count( `comment_ID` ) AS count FROM `wp_comments` GROUP BY `comment_post_ID` “;
$query = mysql_query($SQL);
while ($arr = mysql_fetch_array($query)){
 $sqlUp = “update wp_posts set comment_count = “.$arr[count].” where ID =”.$arr[comment_post_ID].”";
 mysql_query ($sqlUp);
}
mysql_close($mysql);
pg_close($pgsql);
echo ‘All finished! n’;
?&gt;
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/03/17/wordpress%e7%9a%84%e5%ae%b6/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Browser Benchmark</title>
		<link>http://www.litrin.net/2009/03/13/the-browser-benchmark/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-browser-benchmark</link>
		<comments>http://www.litrin.net/2009/03/13/the-browser-benchmark/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 01:11:12 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=505</guid>
		<description><![CDATA[刚刚得知，那个一向以benchmark软件出名的那个futuremark公司在推出了一系列烧硬件的3DMark PCMark之后，总算将热火烧到了浏览器领域。 http://service.futuremark.com/peacekeeper/index.action&#160;就是这么一个工具。粗粗的测试了一下，竟然能将我这台双核的本本搞得不响应。最终我的电脑很荣幸的得到了一个低分。 也许futuremark就是这么一个公司&#8212;&#8212;当大家都在为谁的硬件更加好一点而打口水仗时，他们就会跳出来做个软件bench一下。然后各个硬件厂商就会专门为这个软件优化从而正常或者非正常的做为宣传卖点。从而几个买电脑就是为了看分数的人（我也曾经是其中之一）跳出来评头论足。导致大多数的人都愿意为了这几个分数掏出大把银子。等到回过头来才发现其实很多人买的配置已经大大超出了需求。导致了全球气候变暖等一系列事关国计民生的问题。 忽然有了一种很不详的预感，也许以后不少网站的banner处会出现如下的醒目文字： 浏览本站建议采用某某牌***以上CPU，NG内存，支持DX9以上显卡，并在IE7以上显示更佳。 然后就会看到硬件厂商赞助网站，要求其提高硬件要求，搞推荐配置。&#8212;&#8212;没准这以后也会步游戏开发商的后尘，成为网站收入的重要组成部分。哭泣的恐怕只有上网本了&#8212;&#8212;难怪AMD声称上网本必定要消失，考虑到AMD与Futuremark一贯&#8220;良好的合作&#8221;恐怕&#8230;&#8230; Futuremark&#8212;&#8212;硬件中的搅屎棍&#8212;&#8212;欧也！]]></description>
			<content:encoded><![CDATA[<p>刚刚得知，那个一向以benchmark软件出名的那个<a rel="nofollow" target="_blank" target="_blank" href="http://www.futuremark.com">futuremark</a>公司在推出了一系列烧硬件的3DMark PCMark之后，总算将热火烧到了浏览器领域。</p>
<p><a rel="nofollow" target="_blank" href="http://service.futuremark.com/peacekeeper/index.action">http://service.futuremark.com/peacekeeper/index.action</a>&nbsp;就是这么一个工具。粗粗的测试了一下，竟然能将我这台双核的本本搞得不响应。最终我的电脑很荣幸的得到了一个低分。</p>
<p>也许futuremark就是这么一个公司&mdash;&mdash;当大家都在为谁的硬件更加好一点而打口水仗时，他们就会跳出来做个软件bench一下。然后各个硬件厂商就会专门为这个软件优化从而正常或者非正常的做为宣传卖点。从而几个买电脑就是为了看分数的人（我也曾经是其中之一）跳出来评头论足。导致大多数的人都愿意为了这几个分数掏出大把银子。等到回过头来才发现其实很多人买的配置已经大大超出了需求。<a target="_blank" href="http://www.litrin.net/?q=node/502">导致了全球气候变暖等一系列事关国计民生的问题</a>。</p>
<p>忽然有了一种很不详的预感，也许以后不少网站的banner处会出现如下的醒目文字：</p>
<p><span style="color: #ff0000"><strong>浏览本站建议采用某某牌***以上CPU，NG内存，支持DX9以上显卡，并在IE7以上显示更佳。</strong></span></p>
<p>然后就会看到硬件厂商赞助网站，要求其提高硬件要求，搞推荐配置。&mdash;&mdash;没准这以后也会步游戏开发商的后尘，成为网站收入的重要组成部分。哭泣的恐怕只有上网本了&mdash;&mdash;难怪<a rel="nofollow" target="_blank" target="_blank" href="http://tech.163.com/digi/09/0312/09/546QOFB200161MAH.html">AMD声称上网本必定要消失</a>，考虑到AMD与Futuremark一贯&ldquo;良好的合作&rdquo;恐怕&hellip;&hellip;</p>
<p>Futuremark&mdash;&mdash;硬件中的搅屎棍&mdash;&mdash;欧也！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/03/13/the-browser-benchmark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kernel2.6编译mysql3的问题</title>
		<link>http://www.litrin.net/2008/12/09/kernel26%e7%bc%96%e8%af%91mysql3%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kernel26%25e7%25bc%2596%25e8%25af%2591mysql3%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2008/12/09/kernel26%e7%bc%96%e8%af%91mysql3%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 02:04:19 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[网络和安全]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=499</guid>
		<description><![CDATA[前些天帮个朋友重装了个系统——Centos5.1下的LAMP。由于程序限制，必须在选择mysql3的数据库。 按照常理操作： #cd /mysql3XXX #./configure &#8211;prefix=/usr/local/mysql3 出现如下错误：This is a linux system and Linuxthreads was not found 系统中没有找到linux线程——比较搞笑，没有线程，那系统是怎么起来的？ 分析下来，这是由于mysql使用了较老的thread库，针对于kernel2.4的mysql3得不到支持。 ＃echo &#62;&#62; /usr/include/pthread.h ＃./configure –with-pthread –with-named-thread-lib=-lpthread  &#8211;prefix=/usr/local/mysql3 重新编译后搞定！  ]]></description>
			<content:encoded><![CDATA[<p>前些天帮个朋友重装了个系统——<a rel="nofollow" target="_blank" href="http://www.centos.org" target="_blank">Centos5.1</a>下的LAMP。由于程序限制，必须在选择mysql3的数据库。</p>
<p>按照常理操作：</p>
<p>#cd /mysql3XXX</p>
<p>#./configure &#8211;prefix=/usr/local/mysql3</p>
<p>出现如下错误：<strong><span style="color: #ff0000;"><span style="background-color: #ffff00;">This is a linux system and Linuxthreads was not found</span></span></strong></p>
<p>系统中没有找到linux线程——比较搞笑，没有线程，那系统是怎么起来的？</p>
<p>分析下来，这是由于mysql使用了较老的thread库，针对于kernel2.4的mysql3得不到支持。</p>
<p>＃echo &gt;&gt; /usr/include/pthread.h</p>
<p>＃./configure –with-pthread –with-named-thread-lib=-lpthread  &#8211;prefix=/usr/local/mysql3</p>
<p>重新编译后搞定！</p>
<p style="text-indent: 2em;"> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2008/12/09/kernel26%e7%bc%96%e8%af%91mysql3%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>启用Solaris的tomcat</title>
		<link>http://www.litrin.net/2007/11/19/%e5%90%af%e7%94%a8solaris%e7%9a%84tomcat/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e5%2590%25af%25e7%2594%25a8solaris%25e7%259a%2584tomcat</link>
		<comments>http://www.litrin.net/2007/11/19/%e5%90%af%e7%94%a8solaris%e7%9a%84tomcat/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 08:16:53 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[solaris]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=471</guid>
		<description><![CDATA[网上很多文档对于solaris的tomcat环境都是重新编译或者重新安装的，其实solaris的系统本身并不希望你在上面做太多的编译操作，而作为tomcat这种java应用，其实solaris本身已经自带了一个。 察看系统是否安装了apache和tomcat pkginfo&#124; grep SUNWtcatr pkginfo &#124; grep SUNWapchr 如果有的话 cd /etc/apache cp httpd.conf-example httpd.conf vi httpd.conf include /etc/apache/tomcat.conf #应该是在最后一行，去掉注视 cd /var/apache/tomcat/conf cp server.xml-example server.xml OK了 启动 &#160;/etc/rc3.d/S50apache stop &#160;/etc/rc3.d/S50apache start // 第一次restart似乎无效 svcadm enable apache]]></description>
			<content:encoded><![CDATA[<p>网上很多文档对于solaris的tomcat环境都是重新编译或者重新安装的，其实solaris的系统本身并不希望你在上面做太多的编译操作，而作为tomcat这种java应用，其实solaris本身已经自带了一个。</p>
<p>察看系统是否安装了apache和tomcat</p>
<p>pkginfo| grep <font face="Courier New">SUNWtcatr</font><br />
pkginfo | grep SUNWapchr </p>
<p>如果有的话</p>
<p>cd /etc/apache<br />
cp httpd.conf-example httpd.conf</p>
<p>vi httpd.conf </p>
<p>include /etc/apache/tomcat.conf #应该是在最后一行，去掉注视</p>
<p>cd /var/apache/tomcat/conf <br />
cp server.xml-example server.xml</p>
<p>OK了</p>
<p>启动</p>
<p>&nbsp;/etc/rc3.d/S50apache stop<br />
&nbsp;/etc/rc3.d/S50apache start // 第一次restart似乎无效</p>
<p>svcadm enable apache </p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/11/19/%e5%90%af%e7%94%a8solaris%e7%9a%84tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>apache设置问题引发的Ajax故障</title>
		<link>http://www.litrin.net/2007/10/17/apache%e8%ae%be%e7%bd%ae%e9%97%ae%e9%a2%98%e5%bc%95%e5%8f%91%e7%9a%84ajax%e6%95%85%e9%9a%9c/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=apache%25e8%25ae%25be%25e7%25bd%25ae%25e9%2597%25ae%25e9%25a2%2598%25e5%25bc%2595%25e5%258f%2591%25e7%259a%2584ajax%25e6%2595%2585%25e9%259a%259c</link>
		<comments>http://www.litrin.net/2007/10/17/apache%e8%ae%be%e7%bd%ae%e9%97%ae%e9%a2%98%e5%bc%95%e5%8f%91%e7%9a%84ajax%e6%95%85%e9%9a%9c/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 01:09:51 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=466</guid>
		<description><![CDATA[前阵日子遇到了一件郁闷的问题&#8212;&#8212;一个网页，采用Ajax技术动态更新一个Frame，任何代码都没有问题，可就是在我自己的机器上测试就会出现IE无法显示的问题，然FireFox却没有任何问题。 首先，考虑到可能是IE的安全设置问题，将测试地址列入IE的&#8220;安全区域&#8221;，无果。 查看了几个网站上的资料，据说IE的安全机制决定了它不会显示512B以下的网页云云。把框架中的网页填补到了2K，无果。 怀疑自己的IE可能是由于插件的问题无法访问，换了崭新的一台系统，无果。 万般无奈之中，考虑到可能是HTTP-header的问题，找了个工具抓了头下来，恍然大悟&#8212;&#8212;其中有一句&#8220;Content-Type&#160;&#160;&#160; text/html; charset=utf8&#8221; ，修改Apache设置中的DefaultCharset选项，将UTF8修改为UTF-8，一个减号的差别，错误解决！ IE也是蛮奇怪的，对于html格式上的容错性比较不错（至少支持不在W3C标准之内的n多设定），可对于HTTP传输上的容错性，真是天知道]]></description>
			<content:encoded><![CDATA[<p>前阵日子遇到了一件郁闷的问题&mdash;&mdash;一个网页，采用Ajax技术动态更新一个Frame，任何代码都没有问题，可就是在我自己的机器上测试就会出现IE无法显示的问题，然FireFox却没有任何问题。</p>
<p>首先，考虑到可能是IE的安全设置问题，将测试地址列入IE的&ldquo;安全区域&rdquo;，无果。</p>
<p>查看了几个网站上的资料，据说IE的安全机制决定了它不会显示512B以下的网页云云。把框架中的网页填补到了2K，无果。</p>
<p>怀疑自己的IE可能是由于插件的问题无法访问，换了崭新的一台系统，无果。</p>
<p>万般无奈之中，考虑到可能是HTTP-header的问题，找了个工具抓了头下来，恍然大悟&mdash;&mdash;其中有一句&ldquo;Content-Type&nbsp;&nbsp;&nbsp; text/html; charset=<font color="#ff0000"><strong>utf8&rdquo;</strong> </font>，修改Apache设置中的DefaultCharset选项，将UTF8修改为UTF-8，一个减号的差别，错误解决！</p>
<p>IE也是蛮奇怪的，对于html格式上的容错性比较不错（至少支持不在W3C标准之内的n多设定<img src="/modules/fckeditor/lib/editor/images/smiley/msn/teeth_smile.gif" alt="" />），可对于HTTP传输上的容错性，真是天知道</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/10/17/apache%e8%ae%be%e7%bd%ae%e9%97%ae%e9%a2%98%e5%bc%95%e5%8f%91%e7%9a%84ajax%e6%95%85%e9%9a%9c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JS的IDE——Aptana</title>
		<link>http://www.litrin.net/2007/10/10/js%e7%9a%84ide%e2%80%94%e2%80%94aptana/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=js%25e7%259a%2584ide%25e2%2580%2594%25e2%2580%2594aptana</link>
		<comments>http://www.litrin.net/2007/10/10/js%e7%9a%84ide%e2%80%94%e2%80%94aptana/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 09:42:18 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=465</guid>
		<description><![CDATA[一直苦于开发JavaScript的时候没有合适的调试器，开发起来非常麻烦，在网上搜索了半天，找到了aptana项目&#160;（似乎读作：&#8220;阿婆她呢&#8221;）。 正如以往Litrin的惯例，这个工具也是开源的。随软件附带了一系列的JS CSS框架也相当不错。不过事实上，整个aptana其实就是一个Eclipse的插件版本，继承了Eclipse的优点，aptana也是跨平台的。 aptana其中有个FireFox的debug插件功能非常强大，可惜的是目前aptana的版本还很低，这也意味着bug非常多&#8212;&#8212;不支持中文的UTF-8就是一个非常大的bug。 有需要的朋友可以下一个看看。]]></description>
			<content:encoded><![CDATA[<p>一直苦于开发JavaScript的时候没有合适的调试器，开发起来非常麻烦，在网上搜索了半天，找到了<a rel="nofollow" target="_blank" target="_blank" href="http://www.aptana.com/">aptana项目</a>&nbsp;（似乎读作：&ldquo;阿婆她呢&rdquo;<img alt="" src="/modules/fckeditor/lib/editor/images/smiley/msn/teeth_smile.gif" />）。</p>
<p>正如以往Litrin的惯例，这个工具也是开源的。随软件附带了一系列的JS CSS框架也相当不错。不过事实上，整个aptana其实就是一个Eclipse的插件版本，继承了Eclipse的优点，aptana也是跨平台的。</p>
<p>aptana其中有个FireFox的debug插件功能非常强大，可惜的是目前aptana的版本还很低，这也意味着bug非常多&mdash;&mdash;不支持中文的UTF-8就是一个非常大的bug。</p>
<p>有需要的朋友可以下一个看看。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/10/10/js%e7%9a%84ide%e2%80%94%e2%80%94aptana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>再谈PHP</title>
		<link>http://www.litrin.net/2007/10/04/%e5%86%8d%e8%b0%88php/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e5%2586%258d%25e8%25b0%2588php</link>
		<comments>http://www.litrin.net/2007/10/04/%e5%86%8d%e8%b0%88php/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 01:19:38 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=464</guid>
		<description><![CDATA[说起来用PHP做程序开发已经将近7年多了，从php3一直到php5，开发工具也从记事本一直到了Zend Stdio。php的优点自然不必说，随便哪个PHP技术论坛上一抓一把，可这么多项目做完了，总感觉上缺点什么。我不是&#8220;种族主义者&#8221;，只是谈一下作为开发人员或者项目管理人员最渴望PHP的功能。 内置函数不统一，PHP的内置函数命名可谓是乱得可以了，大写的、小写的、驼峰的、并列的、AtoB的、下划的&#8230;&#8230;几乎每种命名方式都能在php的内置函数中找到，够得上一个&#8220;函数命名方式博览会&#8221;的了 。很不利于开发人员记忆。 环境差异，看似PHP只存在版本差异，其实如果你在IDC那边的虚拟主机上部署PHP你就会发现，开不开Safe_mode就够弄半天的了，还有引用的这个库那个库的，如果是pear这样的库也就罢了，大不了自己重新include;拿GD库来讲，根本没有办法通过其他方法来代用。如果同时又有幸使用了Zend加密过的php代码&#8230;&#8230; 模板问题，现在用的最多的就属smarty了，可smarty的功能实在太强，里面的循环、判断和自动转换格式的部分，真不知道是给美工做还是给开发人员做更合适。如果不用模板，直接把php嵌入html中，同样的问题。 数据库访问，有很多数据库的访问接口，但始终无法摆脱fetch的命运，不论怎么封包，复杂的SQL语句总归要成了程序开发中的重点和系统运行中的瓶颈。 对象访问，php的对象在不断的增强，但还是有待增强。虽然不会把php当作java来用。 层次，企业环境开发，最希望的是能把系统访问和应用访问分开，界面和程序分开（即MVC），这一点PHP需要很大的工作量才可以做到，于是大多开发人员不得不选择了不分开。所有的代码集中到了一起，逻辑上很乱，也没有办法实现代码重用。 调试环境，相比java的调试环境，Zend Studio还远远不够。 框架，市面上流行的几个PHP框架，例如ZF，无一例外的都是模仿了Struct或者.net，没有真正表现出PHP自己的特色，这似乎成了一个怪圈&#8212;&#8212;如果别人用框架觉得好就可能从php转到struct或者.net，用得不好反而会得出php很烂的结论，从而转到其他语言。 总之，上面的牢骚只是希望php有所改善，并非是挑php的骨头。 &#160;]]></description>
			<content:encoded><![CDATA[<p>说起来用PHP做程序开发已经将近7年多了，从php3一直到php5，开发工具也从记事本一直到了Zend Stdio。php的优点自然不必说，随便哪个PHP技术论坛上一抓一把，可这么多项目做完了，总感觉上缺点什么。我不是&ldquo;种族主义者&rdquo;，只是谈一下作为开发人员或者项目管理人员最渴望PHP的功能。</p>
<p>内置函数不统一，PHP的内置函数命名可谓是乱得可以了，大写的、小写的、驼峰的、并列的、AtoB的、下划的&hellip;&hellip;几乎每种命名方式都能在php的内置函数中找到，够得上一个&ldquo;函数命名方式博览会&rdquo;的了 。很不利于开发人员记忆。</p>
<p>环境差异，看似PHP只存在版本差异，其实如果你在IDC那边的虚拟主机上部署PHP你就会发现，开不开Safe_mode就够弄半天的了，还有引用的这个库那个库的，如果是pear这样的库也就罢了，大不了自己重新include;拿GD库来讲，根本没有办法通过其他方法来代用。如果同时又有幸使用了Zend加密过的php代码&hellip;&hellip;</p>
<p>模板问题，现在用的最多的就属smarty了，可smarty的功能实在太强，里面的循环、判断和自动转换格式的部分，真不知道是给美工做还是给开发人员做更合适。如果不用模板，直接把php嵌入html中，同样的问题。</p>
<p>数据库访问，有很多数据库的访问接口，但始终无法摆脱fetch的命运，不论怎么封包，复杂的SQL语句总归要成了程序开发中的重点和系统运行中的瓶颈。</p>
<p>对象访问，php的对象在不断的增强，但还是有待增强。虽然不会把php当作java来用。</p>
<p>层次，企业环境开发，最希望的是能把系统访问和应用访问分开，界面和程序分开（即MVC），这一点PHP需要很大的工作量才可以做到，于是大多开发人员不得不选择了不分开。所有的代码集中到了一起，逻辑上很乱，也没有办法实现代码重用。</p>
<p>调试环境，相比java的调试环境，Zend Studio还远远不够。</p>
<p>框架，市面上流行的几个PHP框架，例如ZF，无一例外的都是模仿了Struct或者.net，没有真正表现出PHP自己的特色，这似乎成了一个怪圈&mdash;&mdash;如果别人用框架觉得好就可能从php转到struct或者.net，用得不好反而会得出php很烂的结论，从而转到其他语言。</p>
<p>总之，上面的牢骚只是希望php有所改善，并非是挑php的骨头。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/10/04/%e5%86%8d%e8%b0%88php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>分辨率限制</title>
		<link>http://www.litrin.net/2007/10/04/%e5%88%86%e8%be%a8%e7%8e%87%e9%99%90%e5%88%b6/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e5%2588%2586%25e8%25be%25a8%25e7%258e%2587%25e9%2599%2590%25e5%2588%25b6</link>
		<comments>http://www.litrin.net/2007/10/04/%e5%88%86%e8%be%a8%e7%8e%87%e9%99%90%e5%88%b6/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 00:26:25 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<guid isPermaLink="false">http://www.litrin.net/?p=463</guid>
		<description><![CDATA[新买了显示器，ViewSonic优派的VA1703WB，看型号就知道这是一款宽屏的显示器，最佳分辨率为1440&#215;900。回头看看我的网站&#8212;&#8212;乖乖，这么多空白，也怪我当初设计的时候只考虑到所谓的&#8220;流体布局&#8221;，所有的表格宽度都用了相对宽度。修改CSS吧。 body的属性增加了text-align:center background-color:#ccc 添加了body table{width:1009px} 强行锁住了页面宽度，OK了就是您现在看到的样子。]]></description>
			<content:encoded><![CDATA[<p>新买了显示器，ViewSonic优派的VA1703WB，看型号就知道这是一款宽屏的显示器，最佳分辨率为1440&#215;900。回头看看我的网站&mdash;&mdash;乖乖，这么多空白，也怪我当初设计的时候只考虑到所谓的&ldquo;流体布局&rdquo;，所有的表格宽度都用了相对宽度。修改CSS吧。</p>
<p>body的属性增加了text-align:center background-color:#ccc <br />
添加了body table{width:1009px}</p>
<p>强行锁住了页面宽度，OK了就是您现在看到的样子。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/10/04/%e5%88%86%e8%be%a8%e7%8e%87%e9%99%90%e5%88%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
