[{"content":"最近真是为了笔记犯愁，平时零零散散记录了笔记，没时间整理，也没时间看，主要是也没有地方看。主要原因是我采用Quiver作为平时记笔记的软件，但是不支持手持设备同步。最近准备整理整理笔记，把笔记发到博客中。由于很久之前采用hexo，而且自己很久不维护了，导致昨天生成文件的时候没有html产生，用debug也看不出毛病。随即怒换hugo。hugo发布和主题都采用git submodule功能，顺便记录之。\n主项目初始化 git 初始化如下：\n1 2 3 4 5 6 7 git init # 编写几个文件 git add . git commit -m \u0026#34;xxxx\u0026#34; git remote set-url origin git@github.com/foo/bar.git git origin remote set-url git@github.com/foo/bar.git //same as before git push 通过以上命令可以得到一个空项目。接下来就在该空项目上面使用git子模块submodule功能。\n引入子模块 引入git子模块submodule采用以下三个步骤：\n先采用add命令添加相应的仓库到本地目录 init初始化 update更新 具体例子如下：\n1 2 3 4 5 git submodule add -b master git@github.com/foo/baz.git subdir # hugo举例主题例子 git submodule add https://github.com/reuixiy/hugo-theme-meme.git themes/meme git submodule init git submodule update 存储结构 初始化完成后看看配置文件：\ncat .gitmodules 应该得到如下信息；这里用hugo的meme主题举例子\n[submodule \u0026#34;themes/meme\u0026#34;] path = themes/meme url = https://github.com/reuixiy/hugo-theme-meme.git cat .git/config 获得内容如下：\n[submodule \u0026#34;themes/meme\u0026#34;] url = https://github.com/reuixiy/hugo-theme-meme.git active = true 查看子模块的git信息，跟.git目录一致。是不是瞬间开启套娃模式\nls -al .git/modules ls -al submodule #子模块所在目录 删除子模块 如果配置错误，没有采用git命令删除的，则可能会出现already exists in the index，这样只需要检查以上的文件是否存在相关信息，删除账号就可以重新建立submodule了\n1 2 git submodule deinit themes/ananke Submodule \u0026#39;themes/ananke\u0026#39; (https://github.com/budparr/gohugo-theme-ananke.git) unregistered for path \u0026#39;themes/ananke\u0026#39; # 删除目录文件 git rm --cached themes/ananke see more\n","date":"2020-07-28T11:22:51+08:00","permalink":"/posts/git-submodule-usage/","title":"git子模块 submodule 使用"},{"content":"一直用CentOS 6 习惯了，一下没适应过来。防火墙配置后执行service iptables save 出现\u0026quot;Failed to restart iptables.service: Unit iptables.service failed to load: No such file or directory.\u0026ldquo;错误,在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理，当然你可以还原传统的管理方式。或则使用新的命令进行管理。 假如采用传统请执行一下命令：\nsystemctl stop firewalld systemctl mask firewalld 并且安装iptables-services：\nyum install iptables-services 设置开机启动：\nsystemctl enable iptables systemctl [stop|start|restart] iptables #or service iptables [stop|start|restart] service iptables save #or /usr/libexec/iptables/iptables.init save","date":"2015-03-29T12:43:37Z","permalink":"/posts/rhel-7-iptables-service/","title":"解决 RHEL 7/ CentOS 7/Fedora 出现Unit iptables.service failed to load"},{"content":"在REHL系搭建pptp vpn服务器 连接的时候出现（619等错误）查看系统日志[cat /var/log/messages |grep pptpd]后发现每次连接失败都会出现以下日志内容:\nGRE: read(fd=6,buffer=80504c0,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs CTRL: PTY read or GRE write failed (pty,gre)=(6,7) CTRL: Reaping child PPP[13354] CTRL: Client XXX.XXX.XXX.XXX control connection finished 于是把打开调试模式，修改/etc/ppp/pptp-options 文件，找到\n#取消如下行前# debug #执行 service pptpd restart 取消行前的注释，重启pptpd服务进入调试模式 分析日志后发现是logwtmp版本的与pptpd版本不一致的原因导致的问题，于是打开/etc/pptpd.conf文件,找到\nlogwtmp 注释掉logwtmp后，重新启动pptpd，再次连接后一切恢复正常。 默认启用了proxyarp（在/etc/ppp/pptp-options中）功能，每次非正常断开连接后，执行以下命令： #windows arp -d #linux sudo arp -d -a \u0026nbsp; ","date":"2015-03-29T12:27:48Z","permalink":"/posts/slove-pptpd-vpn-pty-read-or-gre-write-failed/","title":"解决VPN服务器出现PTY read or GRE write failed问题"},{"content":"用vpn已经有很多年，然而一直因为懒惰原因，所以一直都没有写关于如何搭建vpn服务器的文章，今年兴致所致，分享一下个人搭建vpn server的过程，写的简陋，请勿拍砖。vpn的使用非常广泛，可谓大多网虫和技术股都需要用到的东西，不过看下文之前请先看看自己的服务器是否支持pptp方式的vpn服务器，具体请执行命令\nmodprobe ppp-compress-18 \u0026amp;\u0026amp; echo ok 假如输出ok请继续， 假如不ok，说明服务器不支持。下面的文章可能对你没啥用。\n第一步：安装pptpd 通常情况下可以通过yum直接安装pptpd，执行\nyum list pptpd 假如有则执行\nyum install pptpd 如果没有需要到sf.net下载，执行如下命令进行安装\ncd /usr/local/src #For 64bit OS wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm rpm -Uhv pptpd-1.4.0-1.el6.x86_64.rpm #For 32bit os wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.i686.rpm rmp -Uhv pptpd-1.4.0-1.el6.i686.rpm 到此pptpd vpn 服务器安装完毕\npptp vpn服务器配置 配置pptp vpn ip地址 编辑/etc/pptpd.conf设置： vim /etc/pptpd.conf 找到39行logwtmp处前面加上#号注释（详细见：解决VPN服务器出现PTY read or GRE write failed问题）;并且设置本地ip（localip）和客户端ip（remoteid）分配ip大约在102行\n#logwtmp localip 192.168.0.1 remoteip 192.168.0.234-238,192.168.0.245 这样在pptp vpn 服务器上面ip为192.168.0.1进行转发，客户端可以分配ip号段为remoteip，根据自己的数量需要设置ip号段。\n添加pptp vpn账户和密码 编辑/etc/ppp/chap-secrets，添加格式为： 用户名 pptpd的名称（默认为pptpd）密码 ip地址\n这里需要注意：位置一定不能弄错，最后一个ip地址随机分配请填写*,但是一定要加上，否则在验证的时候会出错具体示例如下：\n# client server secret IP addresses vpnuser0 pptpd vpnpass1 * 配置pptp vpn dns服务器 通常情况下使用google的DNS服务器，编辑/etc/ppp/options.pptpd文件\nvim /etc/ppp/options.pptpd #把ms-dns处修改为： ms-dns 8.8.8.8 ms-dns 4.2.2.2 #推荐把调试模式开启，取消以下文字前面的#号取消注释 debug 开启网络转发功能 #打开 /etc/sysctl.conf vim /etc/sysctl.conf #添加（如果有则去掉前面的#号取消注释） net.ipv4.ip_forward = 1 #执行如下命令使刚刚操作在系统生效 sysctl -p pptp vpn防火墙配置 通过以上步骤基本上可以连接到重启后的vpn服务器，但是要让外部用户能连接PPTP VPN，还需要在防火墙中将Linux服务器的1723端口和47端口打开，并打开GRE协议：\n#注意下面的eth1为网卡，通常有一张内网卡和外网卡，请通过ifconfig命令查看 #请选择显示为外网ip的网卡 iptables -A INPUT -i eth1 -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -i eth1 -p gre -j ACCEPT iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE #保存防火墙设置并重启防火墙 service iptables save service iptables restart 如果出现\u0026quot;Failed to restart iptables.service: Unit iptables.service failed to load: No such file or directory.\u0026quot; 请查看解决 RHEL 7/ CentOS 7/Fedora 找不到iptables service\n调试pptp vpn服务器 #开启pptpd service pptpd restart #设置开机启动pptpd chkconfig pptpd on 到以上步骤，基本上配置已经完成。接下来连接客户端并执行如下命令查看pptp vpn服务器日志\ntail -f /var/log/messages 假如正常，便可收工，如果有问题，请根据日志提示自动爬文\n","date":"2015-03-29T12:16:17Z","permalink":"/posts/install-pptp-vpn-rhel-linux/","title":"如何在RHEL/Centos/Fedora/下搭建vpn pptp 服务器"},{"content":"如何解决BAIDU SITEMAP GENERATOR插件出现 ILLEGAL STRING OFFSET LC_IS_UPDATE_SITEMAP_WHEN_POST问题呢？当发布文章的时候，出现了这个，于是便有了下文。 ILLEGAL STRING OFFSET 这个错误请看鸟哥的《PHP5.4更新注意点》\nwordpress网址地图插件现在用得比较多的就是柳城的《Baidu Sitemap Generator》，我现在用的也是这个！但是有时候会报一个这样的问题！在发布或更新文章，出现的 PHP Warning:Illegal string offset ‘ lc_is_update_sitemap_when_post ’ in ……/wp-content/plugins/baidu-sitemap-generator/baidu_sitemap.php on line 406， 出现这问题的解决办法是： 打开 baidu-sitemap.php 文件中的第 406 行： 把下面的代码：\nif($get_baidu_sitemap_options[' lc_is_update_sitemap_when_post '] == ’1′){ wp_clear_scheduled_hook(‘do_baidu_sitemap_by_post’); wp_clear_scheduled_hook(‘do_this_auto_daily’); wp_schedule_single_event(time()+10, ‘do_baidu_sitemap_by_post’); } 直接把条件语句注释掉， 改为：\n//if($get_baidu_sitemap_options[' lc_is_update_sitemap_when_post '] == ’1′){ wp_clear_scheduled_hook(‘do_baidu_sitemap_by_post’); wp_clear_scheduled_hook(‘do_this_auto_daily’); wp_schedule_single_event(time()+10, ‘do_baidu_sitemap_by_post’); //} 就行了。\n修改后的代码大致意思是：每当发布文章时，sitemap都会自动更新。\n","date":"2015-03-24T14:39:44Z","permalink":"/posts/baidu-sitemap-generator-illegal-string-offset-lc-is-update-sitemap-when-post/","title":"解决LC IS UPDATE SITEMAP WHEN POST"},{"content":"久闻sublime text editor 是个神器，其实平时很少用，今天闲来无事儿，特地安装尝试一下，果断各种黑\n1.Sublime Text 安装 下载地址：http://www.sublimetext.com/\ntar -jxf tar -jxf Sublime\\ Text\\ 2.0.2\\ x64.tar.bz2 mv Sublime\\ Text\\ 2 /usr/local/sublime ln -s /usr/local/sublime/sublime_text /usr/bin/sublime #假如为Sublime text 3 安装于/opt/sublime_text_3 vim /usr/bin/subl #输入以下内容并保存 #!/bin/bash SUBLIME_HOME=\"/opt/sublime_text\" LD_LIB=$SUBLIME_HOME/libsublime-imfix.so sh -c \"LD_PRELOAD=$LD_LIB $SUBLIME_HOME/sublime_text $@\" 2.Sublime Text 注册与破解 安装16进制编辑器\nyum install ghex ghex /usr/local/sublime/sublime_text 在菜单悬在[Edit]-\u0026gt;[Replace]\n找到\n33 42\n替换为\n32 42 选择Replace All\n保存退出（[File]\u0026gt;[Save]-\u0026gt;[Exit]）\n打开sublime\n点击菜单[Help]-\u0026gt;[Enter License]\n输入以下License sublime text 2\n—–BEGIN LICENSE—– Patrick Carey Unlimited User License EA7E-18848 4982D83B6313800EBD801600D7E3CC13 F2CD59825E2B4C4A18490C5815DF68D6 A5EFCC8698CFE589E105EA829C5273C0 C5744F0857FAD2169C88620898C3845A 1F4521CFC160EEC7A9B382DE605C2E6D DE84CD0160666D30AA8A0C5492D90BB2 75DEFB9FD0275389F74A59BB0CA2B4EF EA91E646C7F2A688276BCF18E971E372 —–END LICENSE—– sublime text 3\n----- BEGIN LICENSE ---- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F 942194A6 02396E98 E62C9979 4BB979FE 91424C9D A45400BF F6747D88 2FB88078 90F5CC94 1CDC92DC 8457107A F151657B 1D22E383 A997F016 42397640 33F41CFC E1D0AE85 A0BBD039 0E9C8D55 E1B89D5D 5CDB7036 E56DE1C0 EFCC0840 650CD3A6 B98FC99C 8FAC73EE D2B95564 DF450523 ------ END LICENSE ------ 点击[Use License]\n3.Sublime Text中文输入法问题 Fcitx输入法无法在Sublime Text 中输入中文的解决办法如下： 新建sublime-imfix.c文件\nvim sublime-imfix.c 粘帖以下代码到sublime-imfix.c\n/* sublime-imfix.c Use LD_PRELOAD to interpose some function to fix sublime input method support for linux. By Cjacker Huang gcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC LD_PRELOAD=./libsublime-imfix.so subl */ #include \u0026lt;gtk/gtk.h\u0026gt; #include \u0026lt;gdk/gdkx.h\u0026gt; typedef GdkSegment GdkRegionBox; struct _GdkRegion { long size; long numRects; GdkRegionBox *rects; GdkRegionBox extents; }; GtkIMContext *local_context; void gdk_region_get_clipbox (const GdkRegion *region, GdkRectangle *rectangle) { g_return_if_fail (region != NULL); g_return_if_fail (rectangle != NULL); rectangle-\u0026gt;x = region-\u0026gt;extents.x1; rectangle-\u0026gt;y = region-\u0026gt;extents.y1; rectangle-\u0026gt;width = region-\u0026gt;extents.x2 - region-\u0026gt;extents.x1; rectangle-\u0026gt;height = region-\u0026gt;extents.y2 - region-\u0026gt;extents.y1; GdkRectangle rect; rect.x = rectangle-\u0026gt;x; rect.y = rectangle-\u0026gt;y; rect.width = 0; rect.height = rectangle-\u0026gt;height; //The caret width is 2; //Maybe sometimes we will make a mistake, but for most of the time, it should be the caret. if(rectangle-\u0026gt;width == 2 \u0026amp;\u0026amp; GTK_IS_IM_CONTEXT(local_context)) { gtk_im_context_set_cursor_location(local_context, rectangle); } } //this is needed, for example, if you input something in file dialog and return back the edit area //context will lost, so here we set it again. static GdkFilterReturn event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer im_context) { XEvent *xev = (XEvent *)xevent; if(xev-\u0026gt;type == KeyRelease \u0026amp;\u0026amp; GTK_IS_IM_CONTEXT(im_context)) { GdkWindow * win = g_object_get_data(G_OBJECT(im_context),\"window\"); if(GDK_IS_WINDOW(win)) gtk_im_context_set_client_window(im_context, win); } return GDK_FILTER_CONTINUE; } void gtk_im_context_set_client_window (GtkIMContext *context, GdkWindow *window) { GtkIMContextClass *klass; g_return_if_fail (GTK_IS_IM_CONTEXT (context)); klass = GTK_IM_CONTEXT_GET_CLASS (context); if (klass-\u0026gt;set_client_window) klass-\u0026gt;set_client_window (context, window); if(!GDK_IS_WINDOW (window)) return; g_object_set_data(G_OBJECT(context),\"window\",window); int width = gdk_window_get_width(window); int height = gdk_window_get_height(window); if(width != 0 \u0026amp;\u0026amp; height !=0) { gtk_im_context_focus_in(context); local_context = context; } gdk_window_add_filter (window, event_filter, context); } 保存并退出 编译代码，先安装支持库，然后编译，并且拷贝到安装目录下\nyum install gtk3 gtk2 gtk3-devel gtk2-devel gcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC cp libsublime-imfix.so /usr/local/sublime/lib/ 将编译好的扩展文件加入到参数中就会见到奇迹\n4.设置 启动图标 上面我们已经编译好了输入法支持的扩展，现在通过启动参数加进来，具体操作如下\nsublime /usr/share/applications/sublime.desktop [Desktop Entry] Version=2.0.2 Name=Sublime Text 2 # Only KDE 4 seems to use GenericName, so we reuse the KDE strings. # From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413. GenericName=Text Editor Exec=bash -c 'LD_PRELOAD=/usr/local/sublime/lib/libsublime-imfix.so sublime' Terminal=false Icon=/usr/local/sublime/Icon/48x48/sublime_text.png Type=Application Categories=TextEditor;IDE;Development X-Ayatana-Desktop-Shortcuts=NewWindow [NewWindow Shortcut Group] Name=New Window Exec=bash -c 'LD_PRELOAD=/usr/local/sublime/lib/libsublime-imfix.so sublime' -n TargetEnvironment=Unity 如果在sublime_text_3中请编辑\n/usr/share/applications/sublime_text.desktop 修改对应的Exec如下\n[Desktop Entry] [...] Exec=env LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text %F [...] [Desktop Action Window] [...] Exec=env LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text -n [...] [Desktop Action Document] [...] Exec=env LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text --command new_file [...] 保存后就可以输入中文了\n然后在你的Applications里面会出现Sublime Text菜单\n安装 Package Control 基本上是必备扩展打开如下网站 https://sublime.wbond.net/installation ctrl+`/[View] \u0026gt; [Show Console] 从网站复制相应版本代码——粘帖——回车 重启Sublime Text 安装成功后，接下来安装Emmet（ZenCoding）举例 快捷键Ctrl + Shift + P 调出输入输入Install 回车，输入 Emmet 重启Sublime Text后便可以使用Emmet（ZenCoding）\n","date":"2014-05-31T20:02:05Z","permalink":"/posts/sublime-text-23-install-and-crack-and-use/","title":"Sublime Text 2/3安装与注册及使用"},{"content":"plupload算是一个好东西（用过的人都知道），用起来不好不坏的，当然每个插件在使用过程中未必跟业务完全耦合，就看你修改插件让其符合业务还是业务适应插件，这里对plupload作一个简单的介绍和分享一些个人心得。\nplupload简介 Plupload是有TinyMCE的开发者开发的，为您的内容管理系统或是类似上传程序提供一个高度可用的上传插件。Plupload 目前分为一个核心API 和一个jQuery上传队列部件，这样使你可以直接使用或是自己定制。\nplupload特性 Plupload使用jQuery的组件做为选择文件和上传文件的队列组件。 Plupload使用Flash，Silverlight，HTML5，Gears，BrowserPlus、FileUpload上传文件技术引擎。 Plupload允许自定义使用Plupload核心API来进行选择文件与上传文件。 JavaScript用来激活文件选择对话框。此文件选择对话框是可以设置允许用户选择一个单独的文件或者是多个文件。 选择的的文件类型也是可以被限制的，因此用户只能选择指定的适当的文件，例如jgp;gif。 Plupload允许对上传过程中的一些事件进行自定义，写上自己的处理方式。 选定的文件的上传和它所在页面、表单是独立的。每个文件都是单独上传的，这就保证了服务端脚本能够在一个时间点更容易地处理单个文件。具体信息可以访问Plupload官方网站：http://www.plupload.com/ plupload配置说明 Browse_button:触发浏览文件按钮标签的唯一id,,在flash、html5、和silverlight中能找到触发事件的源（我理解的，这个参数在队列部件不需要参见） Container: 展现上传文件列表的容器，[默认是body] chunk_size：当上传文件大于服务器接收端文件大小限制的时候，可以分多次请求发给服务器，如果不需要从设置中移出 drop_element：当浏览器支持拖拽的情况下，能够文件拖放到你想要的容器ID里 file_data_name：设置上传字段的名称。默认情况下被设置为文件。（我试验了没找到该如何使用它，暂且不提） filters:选择文件扩展名的过滤器,每个过滤规则中只有title和ext两项[{title:\u0026rsquo;\u0026rsquo;, extensions:\u0026rsquo;\u0026rsquo;}] flash_swf_url:flash文件地址 headers：自定义的插入http请求的键值对 max_file_size：最大上传文件大小（格式100b, 10kb, 10mb, 1gb） multipart：布尔值，如果用mutlipart 代替二进制流的方式，在webkit下无法工作 multipart_params： 跟 multipart关联在一起的键值 multi_selection： 多选对话框 resize：修改图片属性 resize: {width: 320, height: 240, quality: 90} runtimes:上传插件初始化选用那种方式的优先级顺序，如果第一个初始化失败就走第二个，依次类推 required_features：需要那些特性，才能初始化插件 url：上传服务器地址 unique_names：是否生成唯一的文件名，避免与服务器文件重名 urlstream_upload：布尔值 如果是flash上传应该用URLStream 代替FileReference.upload pluload API文档 方法列表 方法列表：\nUploader(setting)：创建实例的构造方法 bind(event, function[, scope])：绑定事件 destroy()：销毁plupload的实例对象 uploader.destroy() getFile(id): 获取上传文件信息 init:初始化plupload实例，添加监听对象 uploader.destroy() refresh：重新实例化uploader removeFile(id):从file中移除某个文件 splice(start,length)：从队列中start开始删除length个文件， 返回被删除的文件列表 start() 开始上传 stop()停止上传 unbind(name, function): 接触事件绑定 unbindAll()解绑所有事件 属性集合 features：uploader中包含那些特性 files:当前队列中的文件列表 id：uploader实例的唯一id runtime：当前运行环境（是html5、flash等等) state:当前上传进度状态 total：当前上传文件的信息集合 事件集合 BeforeUpload(up, file)：文件上传完之前触发的事件 ChunkUploaded(up, file,response)文件被分块上传的事件 Destroy(up):uploader的destroy调用的方法 Error(up, err)：上传出错的时候触发 Fileadded(up, files):用户选择文件时触发 FileRemoved(up, files):当文件从上传队列中移除触发 FileUploaded(up, file, res):文件上传成功的时候触发 Init(up):当初始化的时候触发 PostInit(up):init执行完以后要执行的事件触发 QueueChanged(up):当文件队列变化时触发 Refresh(up):当silverlight/flash或是其他运行环境需要移动的时候触发 StateChanged(up)当整个上传队列被改变的时候触发 UploadComplete(up,file)当队列中所有文件被上传完时触发 UploadFile(up,file)当一个文件被上传的时候触发 UploadProgress(up,file):当文件正在被上传中触发 应用实例 1.hmtl部分\n\u0026lt;div class=\"form-group\"\u0026gt; \u0026lt;label class=\"control-label col-md-2\"\u0026gt;缩略图\u0026amp;nbsp;\u0026amp;nbsp;\u0026lt;/label\u0026gt; \u0026lt;div class=\"col-10\"\u0026gt; \u0026lt;div class=\"col-md-4\" id=\"filelist\"\u0026gt; \u0026lt;input type=\"text\" name=\"thumbimg\" class=\"form-control col-md-2\"/\u0026gt; \u0026lt;label for=\"none\" class=\"control-label processbar col-md-1\"\u0026gt;\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div id=\"uploader\" class=\"col-md-5\"\u0026gt; \u0026lt;button type=\"button\" id=\"pickfiles\" class=\"btn blue\"\u0026gt;选择图片\u0026lt;/button\u0026gt; \u0026lt;button type=\"button\" id=\"uploadfiles\" class=\"btn default\"\u0026gt;上传文件\u0026lt;/button\u0026gt; \u0026lt;pre id=\"console\" class=\"display-hide\"\u0026gt;\u0026lt;/pre\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; 2.js部分\n$(function () { var uploader = new plupload.Uploader({ runtimes: 'html5,flash,silverlight,html4', browse_button: 'pickfiles', // you can pass in id... container: document.getElementById('uploader'), // ... or DOM Element itself url: '/extend/common/upload', flash_swf_url: '/assets/plugins/plupload/Moxie.swf', silverlight_xap_url: '/assets/plugins/plupload/Moxie.xap', filters: { max_file_size: '10mb', mime_types: [ {title : \"Image files\", extensions : \"jpg,gif,png\"}, {title : \"Zip files\", extensions : \"zip\"} ] }, init: { PostInit: function () { $('#uploadfiles').html(\"上传文件\"); $(\"#uploadfiles\").on('click', function () { uploader.start(); return false; }); }, FilesAdded: function (up, files) { var html = \"\"; plupload.each(files, function (file) { html = '\u0026lt;input type=\"text\" name=\"thumbimg\" class=\"form-control '+file.id+'\" value=\"' + file.name + '\"/\u0026gt;\u0026lt;label for=\"none\" class=\"control-label processbar col-md-1 ' + file.id + '\" \u0026gt;\u0026lt;/label\u0026gt;'; }); $(\"#filelist\").html(html); }, UploadProgress: function (up, file) { $(\"label.\" + file.id).html(file.percent + '%'); }, FileUploaded: function (up, file,response) { var res = $.parseJSON(response.response); $(\"input.\" + file.id).val(res.result); }, Error: function (up, err) { document.getElementById('console').innerHTML += \"\\nError #\" + err.code + \": \" + err.message; } } }); uploader.init(); }); ","date":"2014-04-30T18:05:25Z","permalink":"/posts/plupload/","title":"plupload图片上传插件的使用"},{"content":"进了Windows 8 再一次进入Fedora后，出现unable to mount NTFS partition fedora的错误，其实是Windows 8 快速启动造成的。关闭即可。具体操作如下：\n打开Control Panel 点击 Power Options;\n点击Choose what the power buttons do; 点击** Change settings that are currently unavailable**; 在 Shutdown 设置, 去掉勾选 Turn on fast startup然后点击Save changes 按钮保存.\n","date":"2014-04-24T23:03:11Z","permalink":"/posts/slv-fedora-centos-mount-ntfs-error/","title":"解决fedora/CentOS下不能挂载NTFS分区"},{"content":"网上找了许多办法都行不通，经过半天的折腾。终于弄出来下面能够实时显示当前时间\n\u0026lt;?php //ob_end_flush(); //关闭php缓存，或者在flush前ob_flush(); //ie下 需要先发送256个字节, firefox 1024, chrome 2048 date_default_timezone_set(\"PRC\");//设置当前时区 set_time_limit(0); for($i=1; $i\u0026lt;=10; $i++) { ob_end_clean(); ob_start(); echo str_repeat(\" \", 4096); echo \"Now is :\". date(\"H:i:s\").\"\u0026lt;br\u0026gt;\"; echo str_repeat(\" \", 4096); ob_flush(); //把php缓存推送到apache去，前面已经关闭了php缓存了，这里再推就报错了 // flush(); //把apache缓存推送到浏览器去 sleep(1); }","date":"2014-04-24T22:52:57Z","permalink":"/posts/php-show-in-time/","title":"php 实时输出显示"},{"content":"作为一个web开发人员，开发过程中肯定有很多项目需要分配不同的域名来访问，这样避免一个localhost不够用和避免加端口各种麻烦，以及子目录超级麻烦等问题。那么很多时候需要在开发环境上门绑定多个域名。假如是一个团队开发。那么每个人都去修改hosts是一件很悲剧的事情，那么你需要的就是一台内部的dns服务器。其实本人对理论这块了解甚少，所以重在实用。\n1.理论普及 DNS服务器分为: master（主DNS服务器）：拥有区域数据的文件，并对整个区域数据进行管理。 slave(从服务器或叫辅助服务器）：拥有主DNS服力器的区域文件的副 本，辅助主DNS服务器对客户端进行解析，当主DNS服务器坏了后，可以完全接替主服务器的工作。 forward:将任何查询请求都转发给其他服务器。起到一个代理的作用。 cache:缓存服务器。 hint：根DNS internet服务器集。 2.软件安装 #For Debian/Ubuntu apt-get install bind* #For CentOS/Fedora/RedHat yum install bind* 其他的根据自己的功能需要安装相应的安装包。\n3.配置 通过以下命令\ncat /etc/sysconfig/named 可以看到系统将named的目录指向哪里。\n/etc/sysconfig/named #由该文件控制是否动chroot及其他参数 /etc/named.conf #配置文件 /var/named/ #数据库文件（如正向、反向、根文件）存放位置 /var/run/named: #named程序默认将pid文件放置此目录下 这里主要需要配置的文件就/etc/named.conf\nvim /etc/named.conf #修改文件 主意any的地方根据自己需要 options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory \"/var/named\"; dump-file \"/var/named/data/cache_dump.db\"; statistics-file \"/var/named/data/named_stats.txt\"; memstatistics-file \"/var/named/data/named_mem_stats.txt\"; query-source port 53; query-source-v6 port 53; allow-query { any; }; }; logging { channel default_debug { file \"data/named.run\"; severity dynamic; }; }; view localhost_resolver { match-clients { any; }; match-destinations { any; }; recursion yes; include \"/etc/named.rfc1912.zones\"; }; 假如我想绑定ryan.com到192.168.0.5\nvim /etc/named.rfc1912.zones #附加以下内容并保存 zone \"ryan.com\" IN { type master; file \"ryan.com.zone\"; allow-update { none; }; }; zone \"ryan.com-arpa\" IN { type master; file \"ryan.com.arpa\"; allow-update { none; }; }; 然后分别新建两个文件\nvim /var/named/ryan.com.zone #插入以下内容并保存 $TTL 1D @ IN SOA ryan.com. root. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ NS ryan.com. @ A 192.168.1.5 www A 192.168.1.5 * A 192.168.1.5 vim /var/named/ryan.com.arpa #插入以下内容并保存 $TTL 1D @ IN SOA ryan.com. root. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ NS ryan.com. @ A 192.168.1.5 5 PTR www.ryan.com. 以上编辑基本上完成了基本配置，接下来修改你机器的域名解析\nvim /etc/resolv.conf #修改（没有添加）指向dns所在的机器ip nameserver 192.168.0.5 到此配置结束。\n4.测试 #设置开机启动 chkconfig named --level 235 on #开启dns 服务器 service named start #如已经开启请使用下面的命令重启 service named restart 然后在终端输入\nnslookup #enter进入nslookup的会话后直接输入需要测试的域名看看返回的结果是否正确如： vkilo.ryan.com 还有一些如dig之类的测试命令，根据个人喜好和要求。还有主从这里就不再累赘。 \u0026lt; 收工\u0026gt;\n","date":"2014-04-24T22:42:47Z","permalink":"/posts/config-dns-server-on-linux-var-bind/","title":"linux 通过bind下搭建DNS Server"},{"content":"遍历当前目录及子目录。把所有的文件转换编码到UTF-8\n\u0026lt; ?php //php iconv.php //exec it on root dir $path = dirname(__FILE__); tree($path); function encodeFiles($fileName) { // echo $fileName; if (file_exists($fileName)) { // Read in the contents $res = file_get_contents($fileName); $i = pathinfo($fileName); if(!in_array($i['extension'],array('js','css','php','html','htm'))){ return ; } // Just display on the screen the file being modified echo $fileName . \"---form---\"; // Convert the contents echo $encode = mb_detect_encoding($res, array(\"ASCII\", \"UTF-8\", \"GB2312\", \"GBK\")); echo \"---to---UTF-8!\\n\"; $res = iconv($encode, \"UTF-8\", $res); // Write back out to the same file file_put_contents($fileName, $res); } // } function tree($directory) { $mydir = dir($directory); while ($file = $mydir-\u0026gt;read()) { if ((is_dir(\"$directory/$file\")) AND ($file != \".\") AND ($file != \"..\")) { tree(\"$directory/$file\"); } else { $file =\"$directory/$file\"; // echo \"\u0026lt;li\u0026gt;$file\u0026lt;/li\u0026gt;\\n\"; if(is_file($file)){ encodeFiles($file); } } } } ","date":"2014-04-11T11:20:40Z","permalink":"/posts/dir-file-iconv/","title":"遍历目录文件编码转换"},{"content":"最近各种工作没有状态，本来很想写点心情日志啥的。可惜文笔有限制，就当在这里抱怨一下。MySQL 编译安装各种疼。顺便整理下笔记，不说了。都是泪。\n－－－－－－－－－－－－－－－土豪金分割线－－－－－－－－－－－－－－－－－－－－ 直入主题：依赖安装 安装环境：centos 6.4 x86_64 安装c＋＋编译环境：\nyum install gcc gcc-c++ ncurses-devel bision：\ncd /usr/local/src wget http://ftp.gnu.org/gnu/bison/bison-2.7.1.tar.gz tar -zxf bison-2.7.1.tar.gz cd bison-2.7.1 ./configure make \u0026amp;\u0026amp; sudo make install cd .. cmake：\nwget http://www.cmake.org/files/v2.8/cmake-2.8.11.tar.gz tar -zxf cmake-2.8.11.tar.gz cd cmake-2.8.11 ./bootstrap make sudo make install 或者 ./configure gmake sudo make install cd .. curl -O http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12.tar.gz tar -zxf mysql-5.6.12 cd mysql-5.6.12 #添加执行用户名和组 groupadd mysql useradd -g mysql mysql #开始编译安装 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \\ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \\ -DDEFAULT_CHARSET=utf8 \\ -DDEFAULT_COLLATION=utf8_general_ci \\ -DWITH_EXTRA_CHARSETS=all \\ -DWITH_MYISAM_STORAGE_ENGINE=1 \\ -DWITH_INNOBASE_STORAGE_ENGINE=1 \\ -DWITH_MEMORY_STORAGE_ENGINE=1 \\ -DWITH_READLINE=1 \\ -DENABLED_LOCAL_INFILE=1 \\ -DMYSQL_DATADIR=/var/mysql/data \\ -DMYSQL_USER=mysql make -j8 make install #改变所有者及控制权限 chmod +w /usr/local/mysql chown -R mysql:mysql /usr/local/mysql mkdir -p /var/mysql/ mkdir -p /var/mysql/data/ mkdir -p /var/mysql/log/ chown -R mysql:mysql /var/mysql/ #配置文件及安装服务 cd support-files/ cp my-default.cnf /var/mysql/my.cnf cp mysql.server /etc/rc.d/init.d/mysqld chmod +x /etc/init.d/mysqld chkconfig --level 345 mysqld on #初始化数据库 /usr/local/mysql/scripts/mysql_install_db \\ --defaults-file=/etc/my.cnf \\ --basedir=/usr/local/mysql \\ --datadir=/var/mysql/data \\ --user=mysql #建立软链接 ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/ ln -s /usr/local/mysql/bin/mysql /usr/bin/ #启动MySQL服务 service mysqld start #修改root帐户密码 mysqladmin -u root password 123456 #登陆MySQL mysql -uroot -p #创建一个MySQL 帐户 CREATE USER 'ryan'@'localhost' IDENTIFIED BY 'some_pass';#some_pass就是ryan帐户密码 #对用户ryan进行授权，当然你最好不要这么做 GRANT ALL PRIVILEGES ON *.* TO 'ryan'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; #刷新权限 flush privileges; #修改默认的引擎 set global storage_engine=MYISAM set storage_engine=MYISAM 写的简单，很少文字说明，当给自己参考。收工！\n","date":"2013-11-08T00:19:04Z","permalink":"/posts/mysql-compile-on-centos/","title":"MySQL 编译安装"},{"content":"top命令基本用法 显示系统当前的进程和其他状况； top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序；而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.\ntop [-] [d delay] [p pid] [q] [c] [C] [S] [s] [i] [n iter] [b] p 仅监视进程给定的进程ID d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。 q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限，那么top将以尽可能高的优先级运行。 S 指定累计模式。 C 显示总CPU状态，而不是单个的CPU。此选项仅对SMP系统有效。 s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 i 使top不显示任何闲置或者僵死进程。\n统计信息区（上箭头所指部分） 前五行是系统整体的统计信息。第一行是任务队列信息，同 uptime 命令的执行结果。其内容如下：\n01:06:48 当前时间 up 17 days, 6:21 系统运行时间，格式为时:天数，小时:分钟 1 user 当前登录用户数 load average: 0.05, 0.08, 0.03 系统负载，即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 第二、三行为进程和CPU的信息。当有多个CPU时，这些内容可能会超过两行。内容如下： Tasks: 53 total 进程总数 1 running 正在运行的进程数 52 sleeping 睡眠的进程数 0 stopped 停止的进程数 0 zombie 僵尸进程数 Cpu(s): 0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 99.8% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0% hi 0.0% si 0.1% st 最后两行为内存信息。内容如下： Mem: 1048876k total 物理内存总量 887984k used 使用的物理内存总量 160592k free 空闲内存总量 0k buffers 用作内核缓存的内存量 Swap: 2097152k total 交换区总量 57280k used 使用的交换区总量 2039872k free 空闲交换区总量 0k cached 缓冲的交换区总量。 内存中的内容被换出到交换区，而后又被换入到内存，但使用过的交换区尚未被覆盖， 该数值即为这些**内容已存在于内存中**的交换区的大小。 相应的内存再次被换出时可不必再对交换区写入。 进程信息区（下箭头指向部分） 统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。\n序号 列名 含义 a PID 进程id b PPID 父进程id c RUSER Real user name d UID 进程所有者的用户id e USER 进程所有者的用户名 f GROUP 进程所有者的组名 g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ? h PR 优先级 i NI nice值。负值表示高优先级，正值表示低优先级 j P 最后使用的CPU，仅在多CPU环境下有意义 k %CPU 上次更新到现在的CPU时间占用百分比 l TIME 进程使用的CPU时间总计，单位秒 m TIME+ 进程使用的CPU时间总计，单位1/100秒 n %MEM 进程使用的**物理内存**百分比 o VIRT 进程使用的虚拟内存总量，单位kb。VIRT=SWAP+RES p SWAP 进程使用的虚拟内存中，被换出的大小，单位kb。 q RES 进程使用的、未被换出的物理内存大小，单位kb。RES=CODE+DATA r CODE 可执行代码占用的**物理**内存大小，单位kb s DATA 可执行代码以外的部分(数据段+栈)占用的**物理**内存大小，单位kb t SHR 共享内存大小，单位kb u nFLT 页面错误次数 v nDRT 最后一次写入到现在，被修改过的页面数。 w S 进程状态。 **D**=不可中断的睡眠状态 **R**=运行 **S**=睡眠 **T**=跟踪/停止 **Z**=僵尸进程 x COMMAND 命令名/命令行 y WCHAN 若该进程在睡眠，则显示睡眠中的系统函数名 z Flags 任务标志，参考 sched.h 更改显示内容(左箭头指向光标处) top命令进入后在未按q退出时，一直会占用一个session，所以你键入任何字符都能作为参数给Top\n通过 **f **键可以选择显示的内容。按 f 键之后会显示列的列表，按 a-z 即可显示或隐藏对应的列，最后按回车键确定。\n按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动，而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。\n按大写的 F 或 O 键，然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。\n默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。 Ctrl+L 擦除并且重写屏幕。 h或者? 显示帮助画面，给出一些简短的命令总结说明。 k 终止一个进程。系统将提示用户输入需要终止的进程PID，以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号；如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。 i 忽略闲置和僵死进程。这是一个开关式命令。 q 退出程序。 r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低，反之则可以使该进程拥有更高的优先权。默认值是10。 S 切换到累计模式。 s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间，单位为s。如果有小数，就换算成m s。输入0值则系统将不断刷新，默认值是5 s。需要注意的是如果设置太小的时间，很可能会引起不断刷新，从而根本来不及看清显示的情况，而且系统负载也会大大增加。 f或者F 从当前显示中添加或者删除项目。 o或者O 改变显示项目的顺序。 l 切换显示平均负载和启动时间信息。 m 切换显示内存信息。 t 切换显示进程和CPU状态信息。 c 切换显示命令名称和完整命令行。 M 根据驻留内存大小进行排序。 P 根据CPU使用百分比大小进行排序。 T 根据时间/累计时间进行排序。 W 将当前设置写入~/:toprc文件中。这是写top配置文件的推荐方法。\n","date":"2013-08-11T01:02:57Z","permalink":"/posts/top-command-in-linux/","title":"top命令使用详解"},{"content":"此处省略无数字\n一、单件模式： 问题的提出：某些应用程序资源是独占的，因为有且只有一个此类型的资源。例如，通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄，因为在保持连接打开或关闭时，它是一种开销，在获取单个页面的过程中更是如此。 问题的解决：那么下面我们就开始玩魔兽吧。首先双击war3.exe，这时候就开始运行魔兽了。我们用代码来实现吧。。\n\u0026lt;?php class War3 { public function __construct() { echo \"War3 is Running.\"; } } $war = new War3(); 运行！很好，输出War3 is Running.我们已经可以开始游戏了，但是，如果我在代码末尾再加入\n$war2 = new War3(); $war3 = new War3(); 会怎么样呢？我们试试，输出结果：War3 is Running.War3 is Running.War3 is Running.完了，如果不小心双击了两次就开了3个魔兽，那如果再双击几次，那电脑肯定爆掉。。。我们还是来想想解决方法吧。。。既然我们不能这么随意的就把这个类实例化了，那么我们就把构造函数改成私有方法。\n\u0026lt;?php class War3 { private function __construct() { echo \"War3 is Running.\"; } } 可是私有变量外部是无法访问的，这样以来，我们就连一个都打不开了啊。别急，我们再给他加一个不用通过实例化，外部也能访问的函数，那就是静态函数\n\u0026lt;?php class War3 { private function __construct() { echo \"War3 is Running.\"; } public static function runWar() { } } 通过这个静态的方法runWar()我们来控制类War3的实例化，那么还缺上一个标识，我们再创建一个标识，通过这个标识来表示我们的类是否已经实例化，如果实例化，直接返回句柄就行了。把类修改成\n\u0026lt;?php class War3 { protected static $_instance = null; private function __construct() { echo \"War3 is Running.\"; } public static function runWar() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; } } 当然，我们运行魔兽时的实例化也要换种方法，就通过 $war = War3: :runWar(); 就能开始玩魔兽了，好了，下面把完整的代码附上来：\n\u0026lt;?php class War3 { protected static $_instance = null; private function __construct() { echo \"War3 is Running.\"; } public static function runWar() { if (null === self:: $_instance ) { self:: $_instance = new self(); } return self::$_instance; } } $war = War3::runWar(); $war2 = War3::runWar(); $war3 = War3::runWar(); 运行一下，结果是：War3 is Running.太好了，我双击了这么多次，也就只运行了一个魔兽，现在随便你怎么打开，机子都不会爆掉了。这就是传说中的单价模式，主要用于一些很占资源的而且实例仅有一个实例就够用的东西，比如，zendframework中的Zend_Controller_Front前端控制器，就是采用单价模式来设计的，大家有兴趣的话可以看看那个。\n二、策略模式： 问题的提出：在此模式中，算法是从复杂类提取的，因而可以方便地替换。例如，如果要更改搜索引擎中排列页的方法，则策略模式是一个不错的选择。思考一下搜索引擎的几个部分——一部分遍历页面，一部分对每页排列，另一部分基于排列的结果排序。在复杂的示例中，这些部分都在同一个类中。通过使用策略模式，您可将排列部分放入另一个类中，以便更改页排列的方式，而不影响搜索引擎的其余代码。 问题的解决：呵呵，不讲那么复杂，刚才魔兽好不容易打开了，我们还是玩魔兽好了。下面我们选battle，哇好多种族啊，有人族（Human），兽族（ORC），暗夜精灵族（Nighy Elf），不死族（Undead）。我选精灵族（Nighy Elf），再选一个精灵族和两个兽族（ORC），一个兽族和我是一家的，另一个精灵族和兽族是另一家的。每一个玩家在进入游戏后都会得到一些资源，如一个大厅，五个小精灵（苦工）和一个矿山。这些可以称为是初始化的一些东西，这里我们就可以用到策略模式来封装这些初始化。进入正题，首先我们来构建一个玩家类：\n\u0026lt;?php class player { //玩家名字 protected $_name; //种族 protected $_race; //队伍 protected $army; //建筑 protected $building; //人口 protected $population; //黄金 protected $gold; //木材 protected $wood; //构造函数，设定所属种族 public function __construct($race) { $this-\u0026gt;race = $race; } //__get()方法用来获取保护属性 private function __get($property_name) { if (isset($this-\u0026gt;$property_name)) { return ($this-\u0026gt;$property_name); } else { return (NULL); } } //__set()方法用来设置保护属性 private function __set($property_name, $value) { $this-\u0026gt;$property_name = $value; } } 接着，我们再建一个玩家初始化的接口，\n\u0026lt;?php interface initialPlayer { //制造初始化的部队 public function giveArmy($player); //制造初始化的建筑 public function giveBuilding($player); //初始化资源 public function giveSource($player); } 好了，到这里我们就该对这个接口来实现了，为了方便，我只选了两个种族，就只写这两个种族的初始化了：首先是精灵族：\n\u0026lt;?php class NighyElfInitial implements initialPlayer { //制造初始化的部队 public function giveArmy($player) { //五个小精灵 for ($i = 0; $i \u0026lt;= 5; $i++) { $creator = new CreatArms(); //这个是创建部队类，在后面得工厂模式中会用到，这里我就不多说了 $player - \u0026gt;army[] = $creator - \u0026gt;Creat('Wisp', './Arms/'); } } //制造初始化的建筑 public function giveBuilding($player) { $creator = new CreatBuildings(); //一个基地 $player-\u0026gt;building[] = $creator-\u0026gt;Creat('TownHall', './Buildings/'); //一个矿场 $player-\u0026gt;building[] = $creator-\u0026gt;Creat('Mine', './Buildings/'); } //初始化人口上限 public function giveSource($player) { $player-\u0026gt;population = 10; $player-\u0026gt;gold = 1000; $player-\u0026gt;wood = 100; } } 接下来是兽族：\n\u0026lt;?php class ORCInitial implements initialPlayer { //制造初始化的部队 public function giveArmy($player) { //五个苦工 for ($i = 0; $i \u0026lt;= 5; $i++) { $creator = new CreatArms(); //这个是创建部队类，在后面得工厂模式中会用到，这里我就不多说了 $player - \u0026gt;army[] = $creator - \u0026gt;Creat('Peon', './Arms/'); } } //制造初始化的建筑 public function giveBuilding($player) { $creator = new CreatBuildings(); //一个基地 $player-\u0026gt;building[] = $creator-\u0026gt;Creat('TownHall', './Buildings/'); //一个矿场 $player-\u0026gt;building[] = $creator-\u0026gt;Creat('Mine', './Buildings/'); } //初始化人口上限 public function giveSource($player) { $player-\u0026gt;population = 10; $player-\u0026gt;gold = 1000; $player-\u0026gt;wood = 100; } } 好了，到这里初始化代码就写好了，现在还差一个控制这些初始化得类，也就是封装他们：\n\u0026lt;?php class initialController { //构造函数，参数为玩家的数组 public function __construct($playerArray) { foreach ($playerArray as $player) { switch ($player-\u0026gt;race) { case 'NighyElf': $initialController = new NighyElfInitial(); break; case 'ORC': $initialController = new ORCInitial(); break; } $initialController-\u0026gt;giveArmy($player); $initialController-\u0026gt;giveBuilding($player); $initialController-\u0026gt;giveSupply($player); } } } 最后就是简单这么一调用，就OK：\n\u0026lt;?php //有两个精灵族两个兽族 $playerArray = array(new player('NighyElf'), new player('NighyElf'), new player('ORC'), new player('ORC')); //进行初始化工作 $initialController = new initialController($playerArray); ?\u0026gt; 这就是策略模式，他将不同情况下的算法封装在一起。Zend framework中的Zend_Application_Resource就是用策略模式来设计的。\n三、工厂模式： 问题的提出：最初在设计模式一书中，许多设计模式都鼓励使用松散耦合。要理解这个概念，让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时，就会发生问题，系统其他部分——您曾认为完全不相关的部分中也有可能出现级联破坏。该问题在于紧密耦合。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式，使这些类能够相互通信，但不希望将它们紧密绑定在一起，以避免出现联锁。在大型系统中，许多代码依赖于少数几个关键类。需要更改这些类时，可能会出现困难。例如，假设您有一个从文件读取的User类。您希望将其更改为从数据库读取的其他类，但是，所有的代码都引用从文件读取的原始类。这时候，使用工厂模式会很方便。工厂模式是一种类，它具有为您创建对象的某些方法。您可以使用工厂类创建对象，而不直接使用new。这样，如果您想要更改所创建的对象类型，只需更改该工厂即可。使用该工厂的所有代码会自动更改。 问题的解决：呵呵，估计有些phper没看懂吧，没关系，那是我从其他地方抄的，我们下面还是通过魔兽来进行吧。这一部分，我看都已经有前人写好了，我就基本上照抄了，请前人不要见怪啊。呵呵。前面选了暗夜精灵族（Nighy Elf），和兽族（ORC），因为小精灵（Wisp）能建造建筑，还能自爆。所以根据这个我们下面先写个小精灵（Wisp）的类。\n\u0026lt;?php class Wisp { private $mHealthPoint = 120; //这是小精灵的血量 private $mArmor = 0; //这是小精灵的护甲 //小精灵能建造建筑 public function Build() { echo '精灵建造建筑咯。 '; } //每个小精灵被造出来时还会占用一个人口 public function __construct() { echo '你已经建造了一个小精灵。 '; //这里是增加已有人口的代码 } //每个小精灵死亡会减少你占用的人口 public function __destruct() { //这里是减少已有人口的代码 } } 把这些代码放在Arms / Wisp.php中。啊，还有还有，还有苦工（Peon）的类\n\u0026lt;?php class Peon { private $mHealthPoint = 250; //这是苦工的血量 private $mArmor = 0; //这是苦工的护甲 //苦工能建造建筑 public function Build() { echo '苦工建造建筑咯。 '; } //每个苦工被造出来时还会占用一个人口 public function __construct() { echo '你已经建造了一个苦工。 '; //这里是增加已有人口的代码 } //每个苦工死亡会减少你占用的人口 public function __destruct() { //这里是减少已有人口的代码 } } 把这些代码放在Arms / Peon.php中。等等，这样岂不是很复杂，魔兽里面还有那么多的兵种，另外都还有两个种族，每次创建一个兵就要new一个，要是记不住这个兵的类名，岂不是new不了？而且如果一个兵是一个类，放在一个文件里，那是不是一开始就要把所有的几十上百个文件都include一次啊，那效率可想而知啊。嘿嘿，当然是有解决办法的啊，我们再写一个类把这些类都封装起来，这个把兵种都封装起来的类我们称之为工厂类，他可以像生产产品一样，来创建兵，帮我们对其实例化。下面我们就来看这个类怎么实现吧。\n\u0026lt;?php class CreatArms { public function __construct() { } public function Creat($arms, $path = '') { include $path . $arms . '.php'; //包含要这个类的文件 return new $arms; //返回你创建的兵种对象的句柄 } } 这样，即使在兵种多样的情况下，我们仍然可以很方便地实例化：$creator = new CreatArms(); $w1 = $creator - \u0026gt;Creat(\u0026lsquo;兵种名\u0026rsquo;, \u0026lsquo;前缀或路径\u0026rsquo;); 例如创建小精灵：$creator = new CreatArms(); //不管创建啥，我都只要使用这个类 $w1 = $creator - \u0026gt;Creat(‘Wisp’, ’. / Arms / ’); //创建一个小精灵 $w1 - \u0026gt;Build(); //让小精灵造建筑 这就是传说中的工厂模式，通过工厂模式，对于如论坛那种有很多种用户的，特别是为了以后扩展比较方便的，采用工厂模式，是个很好的解决方法。在zend framework中的Zend_Form、Zend_Filter、Zend_Validate就是用工厂模式来构架的。\n四、观察者模式： 问题的提出：观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单：一个对象通过添加一个方法（该方法允许另一个对象，即观察者注册自己）使本身变得可观察。当可观察的对象更改时，它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话，而不必了解原因。 问题的解决：呵呵，上面还是抄的，看不懂没关系，我们今天重点是玩魔兽。已经造了很长时间的兵了，现在可以出去带兵打仗了，如果我去打电脑的兽族，那么电脑与那个兽族同盟的精灵族就会过来帮忙。那么如何让他知道自己的同盟受攻击了呢。现在我们就来讨论这个问题。首先我们写一下结盟的抽象类：\n\u0026lt;?php abstract class abstractAlly { //放置观察者的集合，这里以简单的数组来直观演示 protected $oberserverCollection; //增加观察者的方法，参数为观察者（也是玩家） public function addOberserver($oberserver) { $this-\u0026gt;oberserverCollection[] = new oberserver($oberserver); } //将被攻击的电脑的名字通知各个观察者 public function notify($beAttackedPlayerName) { //把观察者的集合循环 foreach ($this-\u0026gt;oberserverCollection as $oberserver) { //调用各个观察者的救援函数，参数为被攻击的电脑的名字，if用来排除被攻击的电脑的观察者 if ($oberserver-\u0026gt;name != $beAttackedPlayerName) $oberserver -\u0026gt;help($beAttackedPlayerName); } } abstract public function beAttacked($beAttackedPlayer); } 下面我们就写具体的结盟类：\n\u0026lt;?php class Ally extends abstractAlly { //构造函数，将所有电脑玩家的名称的数组作为参数 public function __construct($allPlayer) { //把所有电脑玩家的数组循环 foreach ($allPlayer as $player) { //增加观察者，参数为各个电脑玩家的名称 $this-\u0026gt;addOberserver($player); } } //将被攻击的电脑的名字通知各个观察者 public function beAttacked($beAttackedPlayerName) { //调用各个观察者的救援函数，参数为被攻击的电脑的名字，if用来排除被攻击的电脑的观察者 $this-\u0026gt;notify($beAttackedPlayerName); } } 接着在二、策略模式中我们定义的player类中加入一个help方法\n\u0026lt;?php class ablit { public function help($beAttackedPlayerName) { //这里简单的输出，谁去救谁，最后加一个换行，便于显示 echo $this-\u0026gt;name . \" help\" . $beAttackedPlayerName . \"\u0026lt;br /\u0026gt;\"; } } 这样就行了。最后就是仿真了。\n\u0026lt;?php //先设置敌方电脑 $allComputePlayer = array('NighyElf2', 'ORC2'); //新建电脑结盟 $Ally = new Ally($allComputePlayer); //假设我进攻了电脑的兽族 $Ally-\u0026gt;beAttacked('ORC2'); 这样结盟的另一家就能接到通知，去救援。观察者模式主要就是用在这种情况下。可以将某个状态变化立即通知到相关的对象，相关的对象就可以采用相应的策略。例如，zend framework中的Zend_Message就是用的观察者模式。好了，今天就玩到这里，以后有空再和大家一起玩魔兽啊。\n","date":"2013-08-03T00:42:13Z","permalink":"/posts/php-design-pattern-with-warcraft/","title":"魔兽与PHP设计模式"},{"content":"yum remove sendmail yum install dovecot yum install postfix yum install cyrus-sasl cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-md5 cyrus-sasl-plain #start dovecot config #file=/etc/dovecot.conf protocols = imap imaps pop3 pop3s #line 20 default_mail_env = maildir:/home/vmail/%d/%n #line205 first_valid_uid = 89 #line 328 ssl_cert_file = /etc/postfix/ssl/smtpd.crt #line 91 ssl_key_file = /etc/postfix/ssl/smtpd.key #line 92 ssl_ca_file = /etc/postfix/ssl/cacert.pem #line 105 mechanisms = plain login passdb sql { # Path for SQL configuration file, see doc/dovecot-sql-example.conf #line 869 args = /etc/dovecot-mysql.conf } userdb sql { # Path for SQL configuration file, see doc/dovecot-sql-example.conf #line 931 args = /etc/dovecot-mysql.conf } client { # The client socket is generally safe to export to everyone. Typical use # is to export it to your SMTP server so it can do SMTP AUTH lookups # using it. path = /var/spool/postfix/private/auth user = postfix group = postfix mode = 0660 } #end dovecot config #create vmail \u0026gt; mkdir /home/vmail \u0026gt; chmod 770 /home/vmail \u0026gt; chown postfix:postfix /home/vmail #start dovecot-mysql config #file=/etc/dovecot-mysql.conf driver = mysql connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix password=pwd4postfix default_pass_scheme = MD5-CRYPT user_query = SELECT '/home/vmail/%d/%n' as home, 'maildir:/home/vmail/%d/%n' as mail, 89 AS uid, 89 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1' password_query = SELECT username as user, password, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u' AND active = '1' #end dovecot-mysql.conf #start postfix config main.cf #file = /etc/postfix/main.cf mynetworks = 198.71.86.91/32, 127.0.0.0/8, 198.71.86.92/32, 192.80.146.47/32 #line 248 inet_interfaces = all #line 100 myhostname = mail.vkilo.com #line 70 mydomain =vkilo.com #line 71 #inet_interfaces = localhost #line 103 mydestination = $myhostname, localhost.$mydomain, localhost #line 148 #start virtual_mailbox config append virtual_mailbox_base = /home/vmail readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, regexp:/etc/postfix/virtual_regexp virtual_gid_maps = static:89 virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_minimum_uid = 89 virtual_transport = virtual virtual_uid_maps = static:89 dovecot_destination_recipient_limit = 1 smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path=/var/spool/postfix/private/auth smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain smtpd_sasl_security_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain #smtpd_sasl_security_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_tls_security_level = may smtpd_tls_loglevel = 1 smtpd_tls_auth_only =yes smtp_use_tls = yes smtpd_use_tls = yes smtp_tls_note_starttls_offer = yes smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt #`smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_hostname smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain smtpd_helo_required = yes unknown_local_recipient_reject_code = 550 disable_vrfy_command = yes smtpd_data_restrictions = reject_unauth_pipelining #end postfix config #Afterwards we create the certificates for TLS mkdir /etc/postfix/ssl cd /etc/postfix/ssl/ openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024 chmod 600 smtpd.key openssl req -new -key smtpd.key -out smtpd.csr openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt openssl rsa -in smtpd.key -out smtpd.key.unencrypted mv -f smtpd.key.unencrypted smtpd.key openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650 #end create certificates #start mysql_virtual_alias_maps.cf #file=/etc/postfix/mysql_virtual_alias_maps.cf user = postfix password = postfixuser hosts = localhost dbname = postfix table = alias select_field = goto where_field = address #end mysql_virtual_alias_maps.cf #start /etc/postfix/mysql_virtual_domains_maps.cf #file=/etc/postfix/mysql_virtual_domains_maps.cf user = postfix password = postfixuser hosts = localhost dbname = postfix table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '0' and active = '1' #end #vim /etc/postfix/mysql_virtual_mailbox_maps.cf hosts = localhost user = postfix password = postfixuser dbname = postfix table = mailbox select_field = maildir where_field = username #end #vim /usr/lib64/sasl2/smtpd.conf #for i586 /usr/lib/sasl2/smtpd.conf pwcheck_method: auxprop mech_list: PLAIN LOGIN auxprop_plugin: sql sql_verbose: yes sql_engine: mysqli sql_hostnames: localhost sql_user: postfix sql_passwd: postfixuser sql_database: postfix sql_select: select password from mailbox where username = '%u@%r' log_level: 3 #end service postfix start service saslauthd start chkconfig --level 235 postfix on chkconfig --level 235 saslauthd on postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf ","date":"2013-07-21T00:24:19Z","permalink":"/posts/install-mail-server-on-centos-5-5/","title":"install mail server on centos 5.5"},{"content":"首先到官方http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx 下载相应的驱动。 然后windows为例\nextension=php_pdo_odbc.dll extension=php_pdo_sqlsrv_54_nts.dll extension=php_sqlsrv_54_nts.dll 查看phpinfo中是否已经开启MsSQL 接下来用代码测试即可\n$DSN = \"mssql:host=localhost;dbname=testdb\";//mssql dsn $DSN=\"sybase:host=localhost;dbname=testdb\";//sybase dsn $DSN=\"dblib:host=localhost;dbname=testdb\";//any dsn $DSN = \"sqlsrv:Server=localhost,1521;Database=testdb\";//ms sql server $dbUser = \"dbuser\";//username $dbPass = \"password\";//password $conn = new PDO($DSN,$dbUser,$dbPass);//connect handle $conn-\u0026gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// set some attribute of pdo object $query = \"select * from table where field=:field;\"; //T_SQL query $fieldValue = 'Value';// $params = array(\":field\"=\u0026gt;$fieldValue); $getProducts = $conn-\u0026gt;prepare($query); $getProducts-\u0026gt;execute($params); $products= $getProducts-\u0026gt;fetchAll(PDO::FETCH_ASSOC);","date":"2013-07-19T20:43:58Z","permalink":"/posts/connect-to-mssql-using-php-pdo-sqlsrv/","title":"使用php pdo 连接到mssql sqlsrv "},{"content":":set nu 设置行号\n插入命令\ni：光标后\nI：行首\na:光标前\nA:行末\no:光标后插入新行\nO:光标上插入新行\n定位\nh:left\nj:down\nk:up\nl:right\n$:行尾\n0：行首\nH:(hight)屏幕上端\nM:(mediun)屏幕中央\nL:(lower)屏幕下方\n定位命令\n:set nu\n:set nonu\ngg:到第一行\nG:到最后一行\nnG:到第n行\n:n：到第n行\n删除命令\nx:删除光标所在处的字符\nnx:删除光标所在处后的n个字符\ndd:删除光标所在行\nndd:删除第n行字符\ngG:删除光标所在到文章底部的内容\nD:删除光标所在到行首的\n:n1,n2d:删除n1到n2行的所有内容\n复制粘贴\nyy,Y:复制当前行\nnyy,nY 复制当前行以下n行\ndd:剪切当前行\nndd :剪切当前行以下n行\np,P：粘贴在当前光标所在行下或行上\n查找/替换\nr:替换光标所在处\nR:替换光标后的字符直到esc\nu:取消，上一步ctrl+z(undo)\n/string: 查找n next，N pre set:ic(忽略大小写)\n:%s/old/new/g:全文替换\n：n1,n2s/old/new/g n1 to n2\n：n1,n2s/old/new/c 询问\n保存/退出\nZZ=:wq\n:wq! owner root\n:w dir/filename\n:r filename 倒入文件内容\n:r !date 倒入当前日期\n:map ^p 0x\u0026lt;ESC\u0026gt;\n^ 行首\n：n1,n2s/^/#/g 添加行首#\n：n1,n2s/^#//g 删除行首#\n特殊字符转义///\n:ab a b 定义a =b\n^p = ctrl+v+p\n","date":"2013-07-07T14:30:35Z","permalink":"/posts/vim-quick/","title":"vim 命令与快捷键"},{"content":"Start Command Prompt: 1. Hit the combination key of Windows+R (or start run window) 2. Type cmd and hit enter. 3. This will open the command prompt\nCheck which process is using port 80: 1. On the command prompt window, type the following command (copy and paste) without the \u0026quot; \u0026ldquo;.\n\u0026ldquo;netstat -o -n -a | findstr 0.0:80\u0026rdquo;\n1. The last column is what is called as the process ID column.\nOpen Task Manager to check the process ID: 1. Right click on the taskbar to open the the task manager. 2. Go to the Processes tab. 3. Click the View menu 4. And make sure you select the PID (Process Identifier) as shown in the image below. 5. Now you’ll be able to see which process is using the PID in question. In my case the process ID was 4 which stood for NT AUTHORITY/SYSTEM. Do not kill that process! If you do you will get a blue screen of death (BSOD). This is an important process comprised of various services. The service in question is (the one using port 80) “World Wide Web Publishing Service (W3SVC)“. This is the service using port 80. Go to the service and stop it..\nTo stop this service: 1. Go to Task Manager. 2. Click the Services tab 3. Arrange the Services by description. 4. Look for something that reads World Wide Web Publishing Service in the description column 5. Right click on it and select Stop Sevice.\nThat\u0026rsquo;s it, now try and connect with tiny umbrella and you will see that it will not give you the dreaded error that something is using port 80. I do not know how important the W3SVC service is, so, once you finish with tiny umbrella turn it back on again.\nThis tut was not done by me, my only credit is to find it and modify it a bit and posting it here.\nHope this helps you guys and if it does you know what to do! PRESS THANKS!\n","date":"2013-07-04T10:46:51Z","permalink":"/posts/windows-8-pid-4-system-80-port/","title":"windows 8 pid 4 system  80 port "},{"content":"文章关闭标签函数\nfunction CloseTags($html) { // strip fraction of open or close tag from end (e.g. if we take first x characters, we might cut off a tag at the end!) $html = preg_replace('/\u0026lt;[^\u0026gt;]*$/','',$html); // ending with fraction of open tag // put open tags into an array preg_match_all('#\u0026lt;([a-z]+)(?: .*)?(?\u0026lt;![/|/ ])\u0026gt;#iU', $html, $result); $opentags = $result[1]; // put all closed tags into an array preg_match_all('#\u0026lt;/([a-z]+)\u0026gt;#iU', $html, $result); $closetags = $result[1]; $len_opened = count($opentags); // if all tags are closed, we can return if (count($closetags) == $len_opened) { return $html; } // close tags in reverse order that they were opened $opentags = array_reverse($opentags); // self closing tags $sc = array('br','input','img','hr','meta','link'); // ,'frame','iframe','param','area','base','basefont','col' // should not skip tags that can have content inside! for ($i=0; $i \u0026lt; $len_opened; $i++) { $ot = strtolower($opentags[$i]); if (!in_array($opentags[$i], $closetags) \u0026amp;\u0026amp; !in_array($ot,$sc)) { $html .= '\u0026lt;/'.$opentags[$i].'\u0026gt;'; } else { unset($closetags[array_search($opentags[$i], $closetags)]); } } return $html; }","date":"2013-07-03T03:05:21Z","permalink":"/posts/article-close-html-tag/","title":"article close html tag"},{"content":"因为本人没有android设备，更准确说，我没有智能手持设备，故对android设备我果断不熟，每次刷机以及刷机还有刷机都要花良久时间方可完事儿，这里分享一下如何root Samsung I9100 Galaxy S II 获取root权限 设备上面刷的是官方4.1.2的rom，折腾良久未果，其中原因不说的好，因为存储卡不能用，所以确定改用adb命令来root。开始\n1.当然要安装驱动 建议去官方网站下载最新驱动 地址：http://www.samsung.com/us/support/downloads/global\n选择对应型号下载即可。\n安装驱动时注意查看设备管理器的com端口是否驱动成功，安装后会有Samsung的设备字样，而且不应该有叹号。\n2. 准备root需要的工具 去http://pan.baidu.com/share/link?shareid=2123502885\u0026amp;uk=1107686635下载\nadb usb通信命令行工具adbtool.zip 也可以到Google官方下载https://dl-ssl.google.com/android/repository/tools_r22.0.1-windows.zip最新的工具包。\n当然这都是针对windows的，其他平台MAC/Linux请使用对应的工具。\n以及拿root权限工具CWM-SuperSU-v0.97.zip(有0.99版本的，我这里为测试)\n3.现在开始执行root操作 a.手机链接到电脑，确认已经链接好，使用手机管家之类的进行备份。\nb.按住Volume 上＋Home键＋power键就是（加音量键＋主页键＋电源键）3秒以上放开，重启后进入recovery模式，选择Install Update with adb，接着手机进入等待传送状态。\nc.解压adb工具包，将并将CWM-SuperSU-v0.97.zip放入到adb工具对应的目录中\n打开终端工具（命令行工具），并cd到adb所在目录，当然这里你可以用绝对路径执行adb操作。\n输入\nadb usb 然后输入\nadb sideload CWM-SuperSU-v0.97.zip 这里确保CWM-SuperSU-v0.97.zip 与adb.exe在同一目录。假如不在同一目录请使用相应的路径。\n输入命令后你可以看到手机屏幕上面有安装的信息，手机重启后任务完成。\n","date":"2013-06-23T13:51:05Z","permalink":"/posts/i9100-root-best-solution/","title":"Samsung I9100 Galaxy S II 最简单root方法"},{"content":"function setErrorReporting() { //从配置文件读取当前是否为开发环境 if (DEV_ENV == true) { ini_set(\"error_reprorting\", \"E_ALL \u0026amp; ~E_NOTICE\"); ini_set(\"display_errors\", \"on\"); } else { error_reporting(E_ALL); ini_set('display_errors', 'Off'); ini_set(\"log_errors\" , \"On\"); ini_set('error_log', '/var/log/phperror.log'); } } error_reporting() 设置 PHP 的报错级别并返回当前级别。\n语法：error_reporting(report_level)\n下面列出了report_level可能值：\n值常量描述1E_ERROR这是一个严重错误，不可恢复，如位置异常，内存不足等2E_WARNING警告，最一般的错误，如函数的参数错误等4E_PARSE解析错误，在解析PHP文件时产生，并强制PHP在执行前退出8E_NOTICE通告表示可能在操作一些未知的变量等。在开发时可开启通告，以保证程序是\"安全通告\"的，瑞在正式系统中，应关闭通告16E_CORE_ERROR这个内部错误是由于PHP加载扩展失败而导致的，并且会导致PHP停止运行并退出32E_CORE_WARNINGPHP启动时初始化过程中的警告(非致命性错)64E_COMPILE_ERROR编译错误是在编译时发生，这个错误将导致PHP运行退出128E_COMPILE_WARNING编译警告用于告诉用户一些不推荐的语法信息256E_USER_ERROR用户定义的错误将导致辞PHP退出，它对是来自PHP自身，而是来自脚本文件中。512E_USER_WARNING脚本使用它来通知一个执行失败，同时PHP也会用E_WARNING通知1024E_USER_NOTICE用户定义的通告用于在脚本中表示可能存在的错误2048E_STRICT编码标准化警告(建议如何修改以向前兼容)4096E_RECOVERABLE_ERROR接近致命的运行时错误，若未被捕获则视同E_ERROR8191E_ALL除E_STRICT外的所有错误(PHP6中为8191,即包含所有) ","date":"2013-06-14T23:55:11Z","permalink":"/posts/php-error-reporting-setting/","title":"PHP error_reporting 设置"},{"content":"创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类. 生成器模式(Builder pattern): 使用生成器模式封装一个产品的构造过程, 并允许按步骤构造. 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 工厂模式(factory method pattern): 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 原型模式(prototype pattern): 当创建给定类的实例过程很昂贵或很复杂时, 就使用原形模式. 单例模式(Singleton pattern): 确保一个类只有一个实例, 并提供全局访问点. 多例模式(Multition pattern): 在一个解决方案中结合两个或多个模式, 以解决一般或重复发生的问题. 结构型模式 适配器模式(Adapter pattern): 将一个类的接口, 转换成客户期望的另一个接口. 适配器让原本接口不兼容的类可以合作无间. 对象适配器使用组合, 类适配器使用多重继承. 桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变. 组合模式(composite pattern): 允许你将对象组合成树形结构来表现\u0026quot;整体/部分\u0026quot;层次结构. 组合能让客户以一致的方式处理个别对象以及对象组合. 装饰者模式(decorator pattern): 动态地将责任附加到对象上, 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 亨元模式(Flyweight Pattern): 如想让某个类的一个实例能用来提供许多\u0026quot;虚拟实例\u0026quot;, 就使用蝇量模式. 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问. 行为型模式 责任链模式(Chain of responsibility pattern): 通过责任链模式, 你可以为某个请求创建一个对象链. 每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象. 命令模式(Command pattern): 将\u0026quot;请求\u0026quot;封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作. 解释器模式(Interpreter pattern): 使用解释器模式为语言创建解释器. 迭代器模式(iterator pattern): 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示. 中介者模式(Mediator pattern) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式. 备忘录模式(Memento pattern): 当你需要让对象返回之前的状态时(例如, 你的用户请求\u0026quot;撤销\u0026quot;), 你使用备忘录模式. 观察者模式(observer pattern): 在对象之间定义一对多的依赖, 这样一来, 当一个对象改变状态, 依赖它的对象都会收到通知, 并自动更新. 状态模式(State pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好象改了它的类. 策略模式(strategy pattern): 定义了算法族, 分别封闭起来, 让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户. 模板方法模式(Template pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 访问者模式(visitor pattern): 当你想要为一个对象的组合增加新的能力, 且封装并不重要时, 就使用访问者模式. 七大设计原则 单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]：一个类负责一项职责. 里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE]：继承与派生的规则. 依赖倒置原则[DEPENDENCE INVERSION PRINCIPLE]：高层模块不应该依赖低层模块，二者都应该依赖其抽象；抽象不应该依赖细节；细节应该依赖抽象。即针对接口编程，不要针对实现编程. 接口隔离原则[INTERFACE SEGREGATION PRINCIPLE]：建立单一接口，不要建立庞大臃肿的接口，尽量细化接口，接口中的方法尽量少. 迪米特法则[LOW OF DEMETER]：低耦合，高内聚. 开闭原则[OPEN CLOSE PRINCIPLE]：一个软件实体如类、模块和函数应该对扩展开放，对修改关闭. 组合/聚合复用原则[Composition/Aggregation Reuse Principle(CARP)]：尽量使用组合和聚合少使用继承的关系来达到复用的原则. ","date":"2013-06-09T19:10:36Z","permalink":"/posts/24-design-pattern-and-principle-7/","title":"24种设计模式与7大原则"},{"content":" 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问，从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个，单例模式是最好的解决方案。 上面的话来自百度。我个人的理解就是只能是实例化一次，如DB类等。\n接下来自己写了一个PHP的单例模式实例。仅仅参考\n\u0026lt;?php /** * */ class Singleton { private static $_instance; //私有化__construct，禁止外部直接实例化 private function __construct() { } //私有化克隆外部克隆 private function __clone() { } //获取实例，假如没有单例的实例，这返回new一个进行实例化，并返回实例 public static function getInstance() { if (is_null(self::$_instance)||!isset(self::$_instance)) { self::$_instance = new Singleton(); } return self::$_instance; } //测试函数 public function aa(){ $this-\u0026gt;bb(); } private function bb(){ return 'bb'; } } 上面是一个最基本的PHP单例模式，后面可以封装很多函数供外部调用；\n下面访问Class中的aa函数进行测试代码如下：\n\u0026lt;?php echo Singleton::getInstance()-\u0026gt;aa(); 这样可以看到打印出了\u0026rsquo;bb\u0026rsquo;；\n","date":"2013-05-14T23:30:38Z","permalink":"/posts/singleton-of-php-design-patterns/","title":"设计模式之PHP单例模式"},{"content":"听闻Nginx有很多优点，我不知道。你也许知道。下面简述安装过程。Mac下编译安装Nginx需要有好多支持库，不过我默认最简单的安装，其他扩展我也用不到。开始\nA.PCRE是必须的。所以先安装PCRE\n在终端执行如下命令下载最新稳定源码包\ncurl -O ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz 然后执行解压安装\ntar -vzxf pcre-8.32.tar.gz cd pcre-8.32 ./configure make sudo make install 分别执行以上几条命令。加入没有错的话，安装完成。\nB.安装Nginx，终端返回上层目录。下载最新稳定版Nginx源码包，并解压进入到Nginx的源码目录\ncd .. curl -O http://nginx.org/download/nginx-1.4.0.tar.gz tar -vzxf nginx-1.4.0.tar.gz cd nginx-1.4.0 配置Nginx\n./configure 这里说明一点。我这里是默认的配置。假如有特殊需要的话。请后面跟参数。如ssl之类的。请参阅官方安装文档及参数说明。这里不一一例举。配置完成后。假如没有出错的话。执行以下两条命令进行编译安装。\nmake sudo make install 上面命令没有出错的情况下说明已经安装完成 ，接下来做一个连接，方便使用Nginx的命令\nsudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx 然后再输入\nsudo nginx 就可以启动Nginx了。然后可以打开127.0.0.1进行测试就可以看到Nginx的默认页面（假如没有端口冲突等问题存在，Nginx使用80端口，可能与其他web服务软件冲突，请先停止在打开Nginx）；\nC.Nginx 控制命令如下\nnginx -s stop nginx -s quit nginx -s reopen nginx -s reload D.Nginx 的默认配置文件在\n/usr/local/nginx/conf/nginx.conf ","date":"2013-05-14T23:12:49Z","permalink":"/posts/install-nginx-server-on-mac-os-x/","title":"Mac 下Nginx的安装教程"},{"content":"直入主题。当然安装Redis方法不唯一。我这里讲源码编译方式。\nA.到Redis官方下载最新的稳定版本源码包或者利用Curl以及其他的工具下载\ncurl －O http://redis.googlecode.com/files/redis-2.6.13.tar.gz B.下载完成后进行输入下面命令解压Redis压缩包\ntar vzxf redis-2.6.13.tar.gz C.进入Redis解压后的目录进行编译安装\ncd redis-2.6.13 make sudo make install 当你看到4个Install的高亮。说明已经安装完成\nD.建立配置文件以及对配置文件进行修改\nsudo cp redis.conf /private/etc/ sudo vi /private/etc/redis.conf 找到daemonize 把 后面的no改成yes，不然每次启动会占用一个终端的session。\n其他的配置根据需要来。我这里不啰嗦。然后保持退出\n:wq! E.给启动命令加上参数\nalias redis-server=\"redis-server /etc/redis.conf\" 这样保证每次加载的时候都使用你编辑好的配置文件。\nF.安装PHP Redi扩展 这里采用PECl安装方式\nsudo pecl install redis 执行完毕后说明已经安装完成，编辑php.ini 加入下面这一句\nextension=redis.so 然后重启web 服务并重启PHP-FPM,在phpinfo中查看是否配置成功。\nG.开启Redis，并进行测试\n先执行如下命令启动Redis\nsudo redis-server 然后新建一个PHP文件,加入以下代码\n\u0026lt;?php $redis = new Redis(); $redis-\u0026gt;connect('127.0.0.1', 6379); $redis-\u0026gt;connect('127.0.0.1'); // port 6379 by default $redis-\u0026gt;connect('127.0.0.1', 6379, 60); // 2.5 sec timeout. $redis-\u0026gt;set('test','Hello World'); echo $redis-\u0026gt;get('test'); 保存后访问该文件。看下是否成功返回数据。\n","date":"2013-05-14T22:49:48Z","permalink":"/posts/install-redis-of-nosql-on-mac-os-x/","title":"Mac 下载安装Redis"},{"content":"在mac下面如何安装MongoDB呢，其实方法很简单。按照官方的三种方法安装就可以了。我这里是针对PHP的安装。多了一个PHP的MongoDB扩展安装。\nA.执行终端命令\nbrew install mongodb 当然。这是在你安装好Homebrew的情况下。假如没有安装的话请猛戳这里\n至此MongoDB已经安装完成。\nB.接下来执行命令即可启动MongoDB\nmongod C.现在要做的就是把PHP对MongoDB的支持扩展安装上。直接执行如下命令\npecl install mongo 这里需要说明的是你需要安装好pear才可以执行这个命令。而且要有安装autoconf工具，phpize才可以自动配置到PHP的扩展目录\n在php.ini中添加\nextension=mongo.so 重启PHP-FPM以及Web Server软件（如Nginx或Apache）\n新建一个PHP文件，加入以下代码\n$mongo = new Mongo(\"mongodb://localhost:27017\",array(\"connect\"=\u0026gt;TRUE)); $mongo-\u0026gt;connect(); $db = $mongo-\u0026gt;selectDB('test'); $obj = new stdClass(); $obj-\u0026gt;name = 'MongoDB'; $obj-\u0026gt;age = 25; $dataA = $db-\u0026gt;testdb; $dataA-\u0026gt;insert($obj); $r = $dataA-\u0026gt;find(); echo $obj-\u0026gt;name; $mongo-\u0026gt;close(); ","date":"2013-05-14T21:29:19Z","permalink":"/posts/mac-installing-mongodb-tutorial/","title":"Mac下安装MongoDB教程"},{"content":"上次我拿iPhone准备登陆终端进行操作的时候发现我的root密码被修改过，但是很久没有登陆过了。于是自己改成什么密码都忘记了。最开始准备重新刷机，感觉太麻烦，刷机之后还要重新越狱，有很多软件又要重新安装和配置。\n于是找了一下有没有什么办法找回。结果很幸运。接下来讲下具体过程。\n需要安装iFile，不过iFile是越狱必装软件之一。\n打开Cydia 搜索iFile 然后打开iFile找到etc/scroll目录 找到\u0026rsquo;master.passwd\u0026rsquo;文件 使用Text Viewer,按编辑按钮打开编辑器 找到类似于root:UlGASB5XWDrOc:0:0::0:0: 我们需要编辑的UlGASB5XWDrOc这一段 使用\u0026rsquo;crypt\u0026rsquo;函数进行算新密码,这里推荐一个网页 Crypt Tool，在$str输入你新密码，然后$salt输入任意两个字符点击run按钮得到result值 用8中获取的result值替换root:到第一个:0的值也就是这里的UlGASB5XWDrOc 点击顶部的保存保存文件。 完成，你可以使用新设置的密码了 ","date":"2013-02-24T18:02:06Z","permalink":"/posts/ios-recover-root-password/","title":"IOS 设备忘记root密码怎么找回"},{"content":"玩VPS的人都知道，需要远程管理系统以及远程文件上传与下载。有时候操作iPhone的时候，是可以通过WiFi来操作的，但是那个时候我还没有安装WiFi设备，故淘汰，于是就想方设法通过USB来实现。\n当然前提条件是已经越狱的设备。\n为啥要使用SSH通过USB访问iPhone设备：\n操作比WiFi快很多。配置简单方便。2. 不是每个人都有WiFi，但是USB基本上都有。3. iPhone下的终端操作很不方便，电脑操作就跟使用Linux终端一样。4. 文件传输方便。 工具准备 OpenSSH（通过Cydia）安装；2. OpenSSL （通过Cydia）安装;3. itunnel_mux 直接点击itunnel_mux 选择相应系统版本进行下载，然后解压，放在非中文目录下；4. putty 一个比较流行的SSH连接工具；5. WinSCP Windows下比较好用的SFTP与FTP工具。 连接IOS设备 将IOS设备通过USB连接到电脑上，连接完成以后打开“命令提示符（CMD）”工具,切换到itunnet_mux解压后对应的目录，例如我的是D:\\itunnet_mux,先在cmd中输入 \u0026lsquo;D:\u0026rsquo;; 回车，再 \u0026lsquo;cd itunnet_mux\u0026rsquo; 就可以了。\n输入（Windows）：\u0026rsquo;.\\itunnel_mux \u0026ndash;lport 9990 \u0026ndash;iport 22\u0026rsquo;\nlport 表示本地端口，iport 表示iPhone等IOS设备端口。\n连接成功后有对应的提示。\n操作IOS设备\n使用putty 打开putty 设置如图\n点击open打开，要求输入用户和密码\n输入\u0026rsquo;root\u0026rsquo;回车\n在输入密码\u0026rsquo;alpine\u0026rsquo;（note:没有显示）回车\n然后就可以使用putty了。\nWinSCP 使用 asfaf 如下图所示\n主机为：127.0.0.1\n端口号为：9990\n用户名为：root\n密码：alpine\n登陆进去就可以进行各种文件传输了。\n使用putty修改默认密码 为了安全最好首次登陆后修改默认密码\n登陆putty后\n修改root密码\n输入passwd\n输入alpine作为旧密码\n输入新密码回车确认\n再次输入新密码\n修改mobile密码\n输入su mobile\n输入alpine作为默认密码\n输入新密码回车\n再次输入新密码回车\n完成\n忘记root密码怎么办，请访问另一篇IOS设备忘记root密码怎么办\n","date":"2013-02-24T17:35:00Z","permalink":"/posts/ios-usb-control-var-ssh/","title":"使用SSH通过USB操控IOS设备"},{"content":" 用Cydia安装软件 出现dpkg return code(1)错误解决办法 用工具这里就不多说了。不过推荐使用SSH访问IOS的办法。这里的其实iTool之类的比较方便。\n删掉所有/var/cache/apt/archives目录下与/var/lib/dpkg/info下相同的文件。\nPS:\n也就是/var/lib/dpkg/info下有的/var/cache/apt/archives下不能有。/var/cache/apt/archives目录为操作对象，/var/lib/dpkg/info 为参考对象。\n","date":"2013-02-24T16:01:00Z","permalink":"/posts/ios-dpkg-return-code1/","title":"IOS 用Cydia安装软件 出现dpkg return code(1)"},{"content":"最近因为一个打印的页面在Chrome字体忽大忽小，错位很严重，其他的浏览器正常；于是我拿到我电脑上一看是正常的，于是对比一下两台电脑，我用的版本是英文版，显示正常。中文版本就有问题，我因为对CSS不是很感冒，我以为是默认字体的问题，于是我把英文版的字体配置与中文版本一致，但是结果我的英文版Chrome依然正常。于是我做了个艰难的决定，这肯定Chrome中文版本与英文版的区别。\n原来是Chrome中文版字体显示问题，Google浏览器中文版本显示错位问题。默认的情况下，Chrome 中文版配置文件中对最小字体限制为12px，我的字体有9px或者更小的。于是：\nChrome（Google浏览器）中文版本字体12px大小限制解决办法 需要使用 WebKit 私有CSS特性 \u0026lsquo;-webkit-text-size-adjust:none\u0026rsquo; 来避免最小字号限制；于是添加一个webkit的私有属性，就能解决问题。\ntag{-webkit-text-size-adjust:none;} /tag为选择器/ html{-webkit-text-size-adjust: none;} /也可以用全局的，但是影响范围很广/ 我用的是全局的，因为我这里需要对整个页面进行调整。而且错乱排列。\n","date":"2013-02-24T14:59:00Z","permalink":"/posts/how-to-fix-samplifted-chinese-chrome-smallest-font-limit/","title":"Chrome 中文版字体最小限制"},{"content":"话说很久以前看到goagent 翻墙的教程，折腾一番，后面因为不知道啥原因，就一直都木有用了。然后就把所有的都忘记了。现在重抄旧业，翻出来折腾一番。在翻墙软件中，最好的翻墙软件是goagent了，主要针对国内的宽带问题，速度依然猫猫快，然而vpn也很难做到这一点。通过goagent上twitter，facebook，youtube 都灰常流畅。其他vpn啥的用起来是各种掉线，各种不爽，当然我用的是免费的,有一点就是个goagent是浏览器端的，而vpn是整个系统的。\n博客也关闭老久了。路过的都没有几个，打酱油的就更少了。长满了草，所以发一篇笔记来晒晒，望路过的人更多些。偏题内容就还是割掉。\n具体的安装过程就不多说了，有需要的请留言。首先去这里goAgentX传送门，下载dmg package，你也可以下载源码自己编译，不过需要安装xcode，貌似不是很小，我这里当时下载了3天3夜（某个地方的宽带你是知道的）。解压，放到你稀饭的位置， 1.右键选择 Show Package Contents 进入目录,找到GoAgentX.app/Contents/Resources/goagent/CA.crt 文件；\n2.双击打开找到的文件，会自动打开钥匙串访问，会出现各种提示，你就接受所有就ok。\n3.然后选择刚刚导入的证书文件GoAgent CA，双击，展开trust，在第一下拉列表中选择 Always Trust。\n4.基本上就酱紫就可以了。重启下浏览器，登陆，收工。\n[mac os x](http://technorati.com/tag/mac%20os%20x)","date":"2012-04-30T15:43:38Z","permalink":"/posts/solved-ssl-error-of-goagent/","title":"解决goagent 翻墙 在mac os 下的证书错误问题"},{"content":" public function executeShow(sfWebRequest $request) { $this-\u003ecategory = Doctrine_Core::getTable('Category')-\u003efind(array($request-\u003egetParameter('id'))); $this-\u003eforward404Unless($this-\u003ecategory); $this-\u003epager=new sfDoctrinePager('Content', 1); $q=Doctrine::getTable('Content') -\u003ecreateQuery('c') -\u003ewhere('c.category_id=?',array($this-\u003ecategory-\u003egetId())); $this-\u003epager-\u003esetQuery($q); if($request-\u003egetParameter('page')) { $this-\u003epager-\u003esetPage($request-\u003egetParameter('page')); } $this-\u003epager-\u003einit(); } \u003c ?php foreach($pager-\u003egetResults() as $record):?\u003e* \u003c ?php echo $record-\u003egetTitle();?\u003e","date":"2012-04-18T14:16:30Z","permalink":"/posts/symfony-pagnation/","title":"symfony 分页"},{"content":"symfony里面用到yaml貌似比较多，先来唠叨几句,这里关于yaml是个什么东东，yaml干什么用的，我就不说了。由于yaml格式要求相当的严格，因此这里顺便说说yaml 的一些注意事项：\n注意缩进 ，2. 注意字段后面的空格 ，3. 注意对齐，4. 不要使用Tab来缩进，5. 不要在全角字符状态下输入分号与空格， 下面来一段演示代码：\n#@file /data/fixtures/region.yml # 我是注释，前面加个#号 #假如这里是地区信息的yaml文件 Region: NestedSet: true#分号后面跟空格，是Region Model的参数，缩进俩空格 worldwide:#与NestedSet 同级，首字母需对齐与上级有俩空格的缩进 name: 'Worldwide' children:#worldwide 有很多仔，用children Asia: name: 'Asia'#这里分号可以不要,但是在带有分号或者是其他冲突的数据时请加上 children: Eastern_Asia: name: 'Eastern Asia' children: CN: name: 'China' code: 'CN' 实例中主要就是一个分级关系。上下级托行并缩进。\nsymfony 测试数据的编写 普通的测试数据 如schema代码如下： Category: columns: name: string(50) decription: string(1000) Content: actAs: Timestampable: ~#不解释 columns: title: string(250) content: clob view_count: integer reconmmend_level: type: enum values: [0,1,2] default: 2 category_id: integer relations:#关系 Category: local: category_id foreign: id foreignAlias: ContentsComment: actAs: Timestampable: ~ columns: body: clob user_id: integer content_id: integer relations: Content: local: content_id foreign: id foreignAlias: Comments 那么测试数据应该格式如下:\nCategory: c1: name: 新闻 decription: 最新新闻 c2: name: 咨询 decription: 最新咨询 c3: name: 软文 decription: 软文频道 Content: t1: #文章1,命名随便,但须不要要重复 title: 新闻1 content: 新闻１的内容 view_count: 6 reconmmend_level: 0 Category: c1 Comments: [m1,m2]#我有两条评论 t2:#文章2 title: 咨询1 content: 咨询１的内容 view_count: 8 reconmmend_level: 1 Category: c2 Comment: m1: body: 很好很强大 m2: body: 介个灰常棒，信不信由你，反正我是不信 这个例子比较全面,涉及到表与表之间的关系,如一篇文章有多条评论.\n下面来说下最常用的,加入了I18nArticle: actAs: Timestampable: ~ I18n: fields: [ title, body ] columns: title: { type: string(255), notnull: true } body: { type: clob, notnull: true } author: { type: string(255), notnull: false } ","date":"2012-04-11T13:30:09Z","permalink":"/posts/symfony-how-to-create-test-data/","title":"symfony 测试数据的编写"},{"content":"zend studio 以及aptana 是干啥用的我这里就不多嘴了。\n为啥要整合也轮不到我在这里胡说八道。so there we go。\nzend studio 9 与aptana 3的办法 1、打开zend studio,点击菜单栏上面的help-\u0026gt;install new software 则跳出如下所示界面。\n2、安装aptana 3 在地址输入的地方直接输入：http://download.aptana.com/studio3/plugin/install 然后会出现界面如下：\n这样我们直接下一步，下一步，同意协议，再下一步等待完成。当然这不是重点和我写这博文的目的。So you know ，继续往下。\nzend studio 9 与aptana 3离线整合的办法 首先打开：http://download.aptana.com/studio3/plugin/install 你会发现链接自动跳转到一个xml文件，并提示你错误的类型，木有关系。我们在跳转完成后的地址后面加上index.html like this: http://d1iwq2e2xrohf.cloudfront.net/tools/studio/plugin/install/studio3/3.0.9.201202140953/index.html\n按照官方手动安装方法来安装aptana 3\n1.下载点击页面中以下按钮进行下载 2.等待下载完成后打开zend studio 在菜单点击help-\u0026gt;Install New Software如图： 3.点击界面中的add 按钮————\u0026gt;点击Archive…按钮 ，选中刚刚下载好的文件 4.点击open打开文件 ，然后选中列表中的文件，点击下一步——\u0026gt;下一步——\u0026gt;接受协议——\u0026gt;下一步——\u0026gt;等待完成。\n5.完成后重启zend studio ，选择菜单栏中的Zend Studio 中的 Preferences…(Note:Windows中不是这里，你懂得) 6.在偏好设置里面你会发现Aptana 表示安装成功，这里我就不说配置的事儿了。\n引用官方的话： Manual Installation [Download Plugin Update Site](http://d1iwq2e2xrohf.cloudfront.net/tools/studio/plugin/install/studio3/3.0.9.201202140953/com.aptana.feature.studio-3.0.9.201202140953-7E777Q7HFGVBKBSEW7S_Iz0JktqM.zip) Save the above file to an easy-to-find location. Open Eclipse distribution, and go to Help -\u0026gt; Install New Software\u0026hellip;. Click the Add\u0026hellip; button to open the Add Site window. Click the Archive\u0026hellip; button, and select the file saved in step 1. Select the appropriate plugins to install, and click Next -\u0026gt; Next. Click the Finish button. 收工。洗澡去先。 ","date":"2012-04-07T11:50:28Z","permalink":"/posts/zend-studio-install-aptana-plugin-offline/","title":"zend studio 整合aptana"},{"content":"前段时间折腾zend framework ，然后访问目录默认并非网站的根目录，甚是郁闷；接下来symfony也是如此。假如我用的是虚拟主机，那么应用程序根目录肯定是入口，访问的时候不会再带一个web啥的跟到后面怪难看了。\n默认的symfony的.htaccess文件如下：\nOptions +FollowSymLinks +ExecCGI\n\u0026lt;IfModule mod_rewrite.c\u0026gt; RewriteEngine On\n# uncomment the following line, if you are having trouble # getting no_script_name to work #RewriteBase /\n# we skip all files with .something #RewriteCond %{REQUEST_URI} ..+$ #RewriteCond %{REQUEST_URI} !.html$ #RewriteRule .* - [L]\n# we check if the .html version is here (caching) RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f\n# no, so we redirect to our front web controller RewriteRule ^(.*)$ index.php [QSA,L] \u0026lt;/IfModule\u0026gt;\n这个放到了web目录下，于是要么就域名绑定到web目录，要么就绑定到根目录，然后跟一个http://host/web/这样地址来访问。现在我们把这个修改成：\nOptions +FollowSymLinks +ExecCGI\n\u0026lt;IfModule mod_rewrite.c\u0026gt; RewriteEngine On # we skip all files in /web RewriteCond %{REQUEST_URI} ^/web/ RewriteRule .* - [L] # we rewrite all other files with .something to /web RewriteCond %{REQUEST_URI} ..+$ RewriteCond %{REQUEST_URI} !.html$ RewriteRule ^(.)$ /web/$1 [L] # !!! UNTESTED !!! ################################## # we check if the .html version is in /web (caching) RewriteRule ^$ /web/index.html [QSA] RewriteRule ^([^.]+)$ /web/$1.html [QSA] ##################################################### # no, so we redirect to our front web controller RewriteRule ^(.)$ /web/index.php [QSA,L] \u0026lt;/IfModule\u0026gt;\n然后将其移动到网站根目录。直接访问index.php你会发现世界是多么的美好。睡觉！\n","date":"2012-04-05T15:29:56Z","permalink":"/posts/symfony-mod-rewrite-setting/","title":"symfony 之mod_rewrite配置"},{"content":"symfony 闲话 对于php我也就是能看懂一点代码，要我写一个留言板，里面加些杂七杂八的东西（如：ajax,json，jquery,缓存，模板，MVC）的话可能半年的时间不知道弄不弄的出来。因为这些东西只是看起来面熟，不知道是干啥用的。上帝，请原谅我的无知。最近闲来无事，到说听闻php框架可以不需要20分钟就能完成一个很牛X的东西，我就琢磨着，以前也没有做过啥玩意儿，出于好奇，开始了symfony的学习，我这人有一个缺点，就是做事有头无尾，开始是激情和调子都比较高，不过被他们折腾的死去活来的时候就有放弃的思想；这次我对自己提出点希望，就是希望能坚持到底。多嘴完毕，just do it.\nphp环境搭建for symfony 我原来曾经做过一篇文章(笔记) named: 最新php环境apache+php+mysql配置 当然现在不是最新的了。下面我不得不引用一段话。 \u0026gt; 最新apache下载地址：httpd-2.2.22-win32-x86-no_ssl.msi | 更多版本点击此处 最新php下载地址：Installer 或者 Zip | 更多版本请移驾到官方 最新mysql下载地址：http://dev.mysql.com/downloads/mysql/#downloads（注册need） phpmyadmin下载地址：phpMyAdmin-3.3.9.2-all-languages.7z 安装我就不说了。装软件根据个人喜好，安装到对应的位置就OK了。我个人一般软件都不喜欢装到目录带空格的。这里貌似没有什么影响，就随便。 接下来是配置php的配置基本不需要我们管（intaller的安装方法）。 看看apache\n修改配置apache 打开httpd.conf\u0026nbsp; 1、修改默认文件，找到DirectoryIndex 替换成如下的样子（根据个人需要） \u003e \u0026lt;IfModule dir_module\u0026gt; \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp; DirectoryIndex index.html index.php default.php default.html index.htm index.html \u003e \u0026lt;/IfModule\u0026gt; 2、修改网站目录 找到DocumentRoot 在双引号内输入你的网站路径如我的 \u0026gt; DocumentRoot \u0026ldquo;F:/htdocs\u0026rdquo;\n然后找到\u0026lt;Directory \u0026ldquo;Your apache path/htdocs\u0026rdquo;\u0026gt; 同样在双引号内输入你网站路径跟上面路径保持一致如我的 \u0026gt; \u0026lt;Directory \u0026ldquo;F:/htdocs\u0026rdquo;\u0026gt; 这里略去很多英文字 \u0026lt;/Directory\u0026gt;\n3、修改php支持找到 \u0026gt; #BEGIN PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL\nPHPIniDir \u0026quot;\u0026quot; LoadModule php5_module \u0026ldquo;php5apache2_2.dll\u0026rdquo; #END PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL\n修改为你的php所在的路径 如我的： \u0026gt; #BEGIN PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL\nPHPIniDir \u0026ldquo;D:/web/php\u0026rdquo;#php安装的目录 LoadModule php5_module \u0026ldquo;D:/web/php/php5apache2_2.dll\u0026rdquo;#确保这个破玩意儿路径是对的 #END PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL 然后把LoadModule vhost_alias_module modules/mod_vhost_alias.so和 LoadModule rewrite_module modules/mod_rewrite.so以及Include conf/extra/httpd-vhosts.conf前面的#号去掉。 对应需要起用rewrite功能（也就是让.htaccess起作用 it is just my mean ）\nAllowOverride None Order deny,allow Deny from all\n修改成 AllowOverride None\nOrder allow,deny Allow from all\n把apache重启放一边，配置mysql\n双击MySQL安装目录下的bin目录下的MySQLInstanceConfig.exe，选择detailed configuration，下一步——\u0026gt;选择server machine ,下一步——\u0026gt;Non-Transactional Database Only——\u0026gt;下一步——\u0026gt;选择手动（manual setting）,下一步——\u0026gt;默认，勾勾都打上，下一步——\u0026gt;选择手动（最后一项），选择utf8,下一步——\u0026gt;勾上，下一步，设置密码for root user of mysql,后面最后那个勾勾掉进入最后一步点击中间那个button，完成配置。\n到目前测试下你的环境，就基本上可以满足symfony的需求了。后面说下新建项目的问题。\n这里简单的说下项目的地址配置，去下载一个sf_sandbox（这个名字我灰常喜欢），把文件拷贝到你放网站项目的地方，然后我们apache配置使其能够正常访问。\n在pathToApache\\conf\\extra 下有httpd-vhosts.conf 这么一个文件（也就是刚刚去掉#号的原因，因为我们现在需要用到它），用编辑器打开\n我们在后面增加以下代码\nListen 81 NameVirtualHost *:81 \u0026lt;VirtualHost *:81\u0026gt; DocumentRoot \u0026ldquo;D:/htdocs/web\u0026rdquo;#这里表示你项目存放位置下的web目录如我的放到d:\\htdocs下 ServerName localhost：81 #ErrorLog \u0026ldquo;logs/dummy-host.localhost-error.log\u0026rdquo; #CustomLog \u0026ldquo;logs/dummy-host.localhost-access.log\u0026rdquo; common \u0026lt;/VirtualHost\u0026gt;这样再我们访问localhost:81是不是出现奇迹就在于你。完事了。因为时间问题所以弄的有点草率，有空会修改的更好些。谢谢阅读。\n","date":"2012-04-04T15:17:32Z","permalink":"/posts/symfony-develop-env-setup/","title":"symfony 环境配置"},{"content":"话说这是深圳市德科科技有限公司的面试题目，住的是高楼，由于手机问题，结果走错地方了（面试的时候），心里甚是尴尬。完事了之后我内心是灰常的纠结。学习web有N年了，但是一些简单的东西都要借助网络或者是工具书。来这里折腾了好多天了都没有找到一份适合自己的工作。加之发骚，身体灰常不适。每天的生活就是去网吧投简历，然后等待电话通知面试。在找工作这一块还真不是我的强项。应聘的时候老是被一些很纠结的问题给把自己整out了。好久没有更新日志了。顺道来发泄下。发泄完毕。接下来说下面试题目的解决过程。\n一个简单的单页面 头部(header)和底部(footer)高度为60px，背景色为RGB(787878)，宽度自适应;中间一个工具栏（sidebar）和内容区(content)并列 ，高度自适应;sidebar背景为RGB(007777)（这里我不记得了，随便弄的）宽度为160px ,在左边；content居右，宽度自适应； 刚拿到是不知道，所以在网上搜索了一下。得如下代码：\n\u0026lt;script type=\u0026ldquo;text/javascript\u0026rdquo;\u0026gt;\r\u0026gt; window.onload = windowHeight;//页面载入完毕执行函数\r\u0026gt; function windowHeight() {\r\u0026gt; var h = document.documentElement.clientHeight;//获取当前窗口可视操作区域高度\r\u0026gt; var bodyHeight = document.getElementById(\u0026ldquo;content\u0026rdquo;);//寻找ID为content的对象（也就是你想要自适应高度的对象）\r\u0026gt; if (h \u0026lt; 598){//因为前边是获取的当前窗口的可视操作区域的高度 所以当调小窗口的时候 会造成不美观\r\u0026gt; h = 598 ;\r\u0026gt; bodyHeight.style.height = (h-289) + \u0026ldquo;px\u0026rdquo;;// +“px” 是解决 firefox不识别 bodyHeight.style.height =h。289数字可以根据需要更改！\r\u0026gt; }\r\u0026gt; else bodyHeight.style.height = (h-289) + \u0026ldquo;px\u0026rdquo;; } setInterval(windowHeight,500)//每半秒执行一次windowHeight函数\n\u0026lt;/script\u0026gt;\n根据这个稍微修改得到如下：\n\u0026lt;!DOCTYPE html PUBLIC \u0026ldquo;-//W3C//DTD XHTML 1.0 Transitional//EN\u0026rdquo; \u0026ldquo;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\u0026gt;\r\u0026gt; \u0026lt;html xmlns=\u0026ldquo;http://www.w3.org/1999/xhtml\"\u0026gt;\r\u0026gt; \u0026lt;head\u0026gt;\r\u0026gt; \u0026lt;title\u0026gt;窗口特效-自适应高度的窗口\u0026lt;/title\u0026gt;\r\u0026gt; \u0026lt;meta http-equiv=\u0026ldquo;content-type\u0026rdquo; content=\u0026ldquo;text/html;charset=gb2312\u0026rdquo;\u0026gt;\r\u0026gt; \u0026lt;style type=\u0026ldquo;text/css\u0026rdquo;\u0026gt;\r\u0026gt; *{margin:0;padding:0px;}\r\u0026gt; body{width:100%}\r\u0026gt; #header,#footer{height:60px;width:100%;\r\u0026gt; background:#787878;}\r\u0026gt; #sidebar{width:160px;\r\u0026gt; background:#336699;\r\u0026gt; float:left;\r\u0026gt; }\r\u0026gt; #content{background:#669999;\r\u0026gt; float:left;\r\u0026gt; }#footer{\r\u0026gt; clear:both;}\r\u0026gt; \u0026lt;/style\u0026gt;\r\u0026gt; \u0026lt;script type=\u0026ldquo;text/javascript\u0026rdquo;\u0026gt;\r\u0026gt; window.onload = windowHeight;//页面载入完毕执行函数\r\u0026gt; function windowHeight() {\r\u0026gt; var h = document.documentElement.clientHeight;//获取当前窗口可视操作区域高度\r\u0026gt; var w= document.documentElement.clientWidth;//获取当前窗口可视操作区的宽度\r\u0026gt; var sidebar = document.getElementById(\u0026ldquo;sidebar\u0026rdquo;);\r\u0026gt; var content = document.getElementById(\u0026ldquo;content\u0026rdquo;);\r\u0026gt; sidebar.style.height = (h-120) + \u0026ldquo;px\u0026rdquo;;// +“px” 是解决 firefox不识别 bodyHeight.style.height =h。289数字可以根据需要更改！\r\u0026gt; content.style.height = (h-120) + \u0026ldquo;px\u0026rdquo;;\r\u0026gt; content.style.width = (w-160) + \u0026ldquo;px\u0026rdquo;;\r\u0026gt; }\r\u0026gt; \u0026lt;/script\u0026gt;\u0026lt;/head\u0026gt;\r\u0026gt; \u0026lt;body\u0026gt;\r\u0026gt; \u0026lt;div id=\u0026ldquo;header\u0026rdquo;\u0026gt;\u0026lt;/div\u0026gt;\r\u0026gt; \u0026lt;div id=\u0026ldquo;sidebar\u0026rdquo;\u0026gt;\u0026lt;/div\u0026gt;\r\u0026gt; \u0026lt;div id=\u0026ldquo;content\u0026rdquo;\u0026gt;\u0026lt;/div\u0026gt;\r\u0026gt; \u0026lt;div id=\u0026ldquo;footer\u0026rdquo;\u0026gt;\u0026lt;/div\u0026gt;\r\u0026gt; \u0026lt;/body\u0026gt;\r\u0026gt; \u0026lt;/html\u0026gt; 这样就基本上实现了要求。\n这里可以看demo 还有一种css方法是margin-buttom:-9999px来实现。 不过个人感觉javascript的比较好。\n","date":"2012-02-21T20:45:32Z","permalink":"/posts/css-autosize-page/","title":"如何让页面自适应大小"},{"content":"我系统是win 7 sp1 x86，下载了个小软件却界面上全是问号（就是这个“？”，一个很讨嫌的家伙）。百思不得其解，因为设置上的话通常我配置都没有问题的，而且用了1年多了都没有问题，找了良久，未果。\n我记得前面写过一篇关于xp乱码的问题 ： 从这里去，去了就不要回来了\n那篇文章是解决英文版windows XP中文软件乱码的方法 ，其实win 7设置与其类似。\n因为这次问号是个很小的问题，不值一提，所以就顺便说下基本设置步骤。\n1.打开“Control Panel”，点击“Clock,Language,and Region”。\n2.点击“Region and language”；\n进去之后有4个选项卡，这里只需要设置两个地方。\n3.选择“Location”，把”Current location” 设置成“China”。\n4.关键步骤，选择”Administrative”选项卡。 点击“Change system locale”，把“Current system locale”设置成“Chinese（Simplified PRC）”。\n到现在已经完成了。假如还有问题呢。最好是“拷贝设置”如下图（也就是把系统的，用户的之类的设置跟当前用户设置一致）。进去之后把√勾上。\n如果你也跟我一样手贱。不小心把“Additional settings”下的“sorting”更改过，请点击”Reset”按钮。\n收工。\n","date":"2011-11-07T10:50:00Z","permalink":"/posts/slove-garbled-of-windows-en-edition/","title":"解决英文版windows出现软件乱码问题"},{"content":"Ubuntu 下wordpress 发布工具貌似也特别多，但是个人最喜欢的应该是**ScribeFire Blog Editor这个firefox 插件，功能十分强大。推荐使用。 **使用界面非常友好，字体格式设置功能也比较多。能直接插入图片并上传，支持设置分类、标签。修改已经发布文章，支持定时发布，支持自定义设置Pings 。如果你不小心关闭了浏览器，你写的东西不会丢失。 **ScribeFire Blog Editor **插件添加地址：https://addons.mozilla.org/zh-CN/firefox/search/?q=ScribeFire+Blog+Editor\u0026amp;cat=all\u0026amp;lver=any\u0026amp;pid=1\u0026amp;sort=\u0026amp;pp=20\u0026amp;lup=\u0026amp;advanced=\n![](http://img.zemanta.com/pixy.gif?x-id=65c3bfba-1bdd-89d0-a117-0523e6fedea2)","date":"2011-05-04T12:25:40Z","permalink":"/posts/ubuntu-wordpress-post-tool/","title":"ubuntu 下最好的wordpress 发布工具"},{"content":"最新泄露版本来看。距离发布windows 8 beta（windows 8 beta1)版的时候就快要到了，一起期待windows 8 给我们带来的惊喜。 windows 8版本发布顺序：M1 / M2 / M3 / Beta1 / Beta2 / RC / RTM\nMilestone 1 （理解为第一阶段）* Milestone 2 – 2010 年12月9 Milestone 3 – 2011年2月28 Beta 1 – 2011 年9月 Beta 2* Release Candidate(RC) –2012 年9月 Ready to Manufacturing （RTM）– 2012 末 Retail – 2013年1月7号（也太难等了点。） windows 8最新版本(编译)：6.2.7996.0.winmain_win8m3.110429-1810 windows 8 已知编译版本列表（最后更新时间11.05.04） (NT6.1 76xx Winmain Branch Post-RTM) 6.1.7650.0.winmain.090917-1843 6.1.7651.0.winmain.090924-1802 6.1.7656.0.winmain.091015-0833 6.1.7658.0.winmain.091019-1850 6.1.7659.0.winmain.091020-1830 6.1.7660.0.winmain.091021-1736 6.1.7661.0.winmain.091022-1755 6.1.7662.0.winmain.091023-1645 6.1.7664.0.winmain.091027-1825 6.1.7691.0.winmain.100106-1825 6.1.7692.0.winmain.100107-1735 6.1.7693.0.winmain.100111-1820 6.1.7694.0.winmain.100113-1753 6.1.7695.0.winmain.100114-1855 6.1.7696.0.winmain.100115-1725 (NT6.1 77xx Winmain Branch Post-RTM) 6.1.7700.0.winmain.100122-1900 6.1.7702.0.winmain.100126-1751 6.1.7703.0.winmain.100127-1845 6.1.7704.0.winmain.100128-1900 6.1.7705.0.winmain.100129-1930 6.1.7706.0.winmain.100201-1820 6.1.7707.0.winmain.100202-1715 6.1.7709.0.winmain.100204-1515 6.1.7710.0.winmain.100205-2005 6.1.7711.0.winmain.100208-1732 6.1.7712.0.winmain.100211-1740 6.1.7713.0.winmain.100212-1750 6.1.7714.0.winmain.100215-1450 6.1.7715.0.winmain.100217-1715 6.1.7716.0.winmain.100218-1836 6.1.7717.0.winmain.100219-1707 6.1.7718.0.winmain.100223-1403 6.1.7719.0.winmain.100224-1231 6.1.7720.0.winmain.100225-1845 6.1.7721.0.winmain.100226-1832 6.1.7722.0.winmain.100301-1456 6.1.7723.0.winmain.100302-1805 6.1.7724.0.winmain.100303-1435 6.1.7725.0.winmain.100304-1545 6.1.7726.0.winmain.100311-1807 6.1.7727.0.winmain.100315-1740 6.1.7727.0.winmain.100315-1747 6.1.7729.0.winmain.100318-1855 6.1.7730.0.winmain.100319-1635 6.1.7731.0.winmain.100323-1817 6.1.7764.0.winmain.100615-1748 (NT6.1 78xx Milestone 1) 6.1.7800.0.winmain_win8m1.100816-1855 6.1.7804.0.winmain_win8m1.100820-1742 6.1.7809.0.winmain_win8m1.100827-1740 6.1.7811.0.winmain_win8m1.100831-1731 6.1.7812.0.winmain_win8m1.100901-1810 6.1.7814.0.winmain_win8m1.100903-1700 6.1.7817.0.winmain_win8m1.100910-1622 6.1.7818.0.winmain_win8m1.100913-1840 6.1.7821.0.winmain_win8m1.100916-1940 6.1.7822.0.winmain_win8m1.100920-1625 6.1.7830.0.winmain_win8m1.100921-xxxx (Escrow Branch for Windows 8 Milestone 1) 6.1.7850.0.winmain_win81.100922-1508 [Leaked] (NT6.2 78(5+)xMilestone 2) 6.2.7853.0.winmain_win8m2.100928-1040 6.2.7855.0.winmain_win8m2.101001-1815 6.2.7857.0.winmain_win8m2.101006-1908 6.2.7859.0.winmain_win8m2.101008-1300 6.2.7866.0.winmain_win8m2.101019-1507 6.2.7867.0.winmain_win8m2.101020-1800 6.2.7867 (CES 2011 Build) 6.2.7870.0.winmain_win8m2.101025-1900 6.2.7871.0.winmain_win8m2.101026-1800 6.2.7874.0.winmain_win8m2.101029-1838 6.2.7875.0.winmain_win8m2.101101-1832 6.2.7878.0.winmain_win8m2.101104-1752 6.2.7880.0.winmain_win8m2.101108-1530 6.2.7881.0.winmain_win8m2.101109-1816 6.2.7882.0.winmain_win8m2.101110-1650 6.2.7883.0.winmain_win8m2.101111-1631 6.2.7890.0.winmain_win8m2.101122-1810 6.2.7891.0.winmain_win8m2.101123-1908 6.2.7892.0.winmain_win8m2.101129-1902 6.2.7895.0.winmain_win8m2.101202-1845 6.2.7898.0.winmain_win8m2.101207-1620 6.2.7899.0.winmain_win8m2.101208-1900 (NT6.2 79xx Milestone 2) 6.2.7900.0.winmain_win8m2.101209-1830 6.2.7901.0.winmain_win8m2.101210-1755 6.2.7902.0.winmain_win8m2.101213-1745 6.2.7903.0.winmain_win8m2.101215-2325 6.2.7904.0.winmain_win8m2.101216-1845 6.2.7905.0.winmain_win8m2.110103-2100 6.2.7906.0.winmain_win8m2.110105-1750 6.2.7907.0.winmain_win8m2.110106-1823 ‎6.2.7907.0.fbl_x.110109-1800 (FBL) 6.2.7908.0.winmain_win8m2.110107-1755 6.2.7909.0.winmain_win8m2.110110-1515 6.2.7910.0.winmain_win8m2.110111-1804 6.2.7911.0.winmain_win8m2.110112-1725 6.2.7913.0.winmain_win8m2.110114-1745 6.2.7914.0.winmain_win8m2.110118-1605 6.2.7915.0.winmain_win8m2.110119-1806 6.2.7916.0.winmain_win8m2.110121-1715 6.2.7917.0.winmain_win8m2.110125-1757 6.2.7918.0.winmain_win8m2.110126-1827 6.2.7919.0.winmain_win8m2.110127-1733 6.2.7920.0.winmain_win8m2.110128-1740 6.2.7920.0.fbl_srv.110128-1823 (Notepad.exe) 6.2.7921.0.winmain_win8m2.110201-2005 6.2.7922.0.winmain_win8m2.110202-1840 6.2.7925.0.winmain_win8m2.110207-1736 6.2.7926.0.winmain_win8m2.110209-1755 6.2.7927.0.winmain_win8m2.110210-1740 6.2.7928.0.winmain_win8m2.110214-1825 6.2.7929.0.winmain_win8m2.110215-1802 6.2.7930.0.winmain_win8m2.110217-1825 6.2.7947.0.winmain_win8m2.110218-1608 (Escrow Branch for Windows 8 Milestone 2) 6.2.7948.0.winmain_win8m2.110221-1703 6.2.7949.0.winmain_win8m2.110222-1545 6.2.7950.0.winmain_win8m2.110223-1820 (NT6.2 79(5+)x Milestone 3) 6.2.7955.0.winmain.110224-1502 6.2.7955.0.fbl_srv.110225-2127 (Shellstyle.dll) 6.2.7956.0.winmain.110228-1701 6.2.7959.0.winmain.11030x-xxxx 6.2.7959.0.fbl_srv.11030x-xxxx (7959 screenshots) 6.2.7961.0.winmain.110308-1712 6.2.7962.0.winmain.11031x-xxxx 6.2.7963.0.winmain.110310-1721 6.2.7964.0.winmain.11031x-xxxx 6.2.7968.0.winmain.110318-1830 6.2.7971.0.winmain.110324-1900 6.2.7972.0.winmain.110328-1838 6.2.7973.0.winmain.110329-1742 6.2.7974.0.winmain.110330-1622 6.2.7978.0.winmain.110405-1746 6.2.7979.0.winmain.110406-1800 6.2.7980.0.winmain.110407-1832 6.2.7982.0.winmain.110411-1832 6.2.7984.0.fbl_system_licensing.110414-1750 6.2.7996.0.winmain_win8m3.110429-1810 windows 8 更新日志 ARM处理器的支持* 整合的Windows Live ID* 快速恢复默认设置* 更多应用程序进度条* 窗口的标题居中* 在Windows资源管理的新的状态* 基本样式（灰色）* 向上按钮* 在Windows Update下时“如果需要重新启动”复选框* 在多触摸模式更大的系统菜单图标* 黑屏* .ISO镜像虚拟光驱* OEM BIOS的Activaction 3.0 window 8 已泄露版本 6.1.7700.0.winmain.100122.1900 ，2010年1月27日泄露\n标签：6.1.7700.0.amd64fre.winmain.100122.1900\nNAZWA PLIKU：7700.0.100122 - 1900_x64fre_client_en –us-GRMCXFRE_EN_DVD.iso\n大小：3231166444字节\nSHA - 1：C0CB719B781D49B39D8CC93A27F990A366B8E4C7\n6.1.7850.0.winmain_win8m1.100922 - 1508 - 2011年4月12日泄漏\n文件名：6.1.7850.0.winmain_win8m1.100922 - 1508_x86fre_client - enterprise_en - us.iso\n大小：2.45 GB的（2637101056字节）\nMD5的：EA2DCFADA6BBA517A0A0649D15E1EB3D\nSHA - 1：DCA69DF6074BCA8B5DBA5C8D6D030D53CB6D82C8\nCRC32：32EB1881\n6.2.7955.0.fbl_srv_wdacxml.110228 - 1930 - 2011年4月25日泄露\nNAZWA PLIKU：6.2.7955.0.fbl_srv_wdacxml.110228 - 1930_x86fre_client - ultimate.iso\n大小：2.47GB（2657079296字节）\nMD5：40861A02CB14B0D2D7930910DB6CC6E4\nNAZWA PLIKU：6.2.7955.0.fbl_srv_wdacxml.110228 - 1930_x86fre_client - ultimate_en - us.iso\n大小：2.49GB（2674098176字节）\n6.2.7959.0.fbl_srv_wdacxml.110307-1930 泄漏日期：2011年 5月 1日\nFILENAME 6.2.7959.0.fbl_srv_wdacxml.110307-1930_amd64fre_server-enterprise_en-us.iso\nSIZE: 2.87GB (3,229,550,592 bytes)\nMD5: 99375D7782027CBF2E70F5D0F8648406\nwindows 8 下载地址请移步windows 下载\n如何理解Windows 8 版本标签 6.1.7600 .16384 . x86fre . win7_rtm .090710-1945 (WZT) -leaked 13 July 2009 [WZT]\n6.1 – 内核版本\n.7600 – 主要编译版本号\n.16384 – 修订 – 当前版本bug修复序号\n.x86fre – 处理器体系结构 和编译类型(free [fre] – 正常, checked [chk] – 提供调试信息, 速度慢一些)\n.win7_rtm – branch\n.090710-1945 – 编译时间 （格式为： YYMMDD-HHmm [24小时]格式\n(WZT) – 情报人员\nleaked 13 July 2009 – 泄露时间和格式(如 “ISO”, “VHD”, “only x86″)\n[WZT] - 泄露者\nwindow传言（忽悠） Q：Build 6.1.7900 == Windows 8?\n_A:This is false! This myth was created by Softpedia.com newsmans.\n6.1.7900.0.sbs_sbs7.101108-0845 == Windows Small Business Server 2011 RTM (based on Windows Server 2008 R2)_ 6.2.7900.0.winmain_win8m2.101209-1830_ == Windows 8 build_\nQ:Windows 7 Service Pack 1 build 6.1.7601.171257.101210-1930 – leaked?\n_**A:No! This is another rumour by Softpedia.com! **\nAt first: this build tag is incorrect (should be 6.1.7601.171257.101210-1930).\nSecondly: this build (without 7) is Release Candidate – Refresh, which has leaked 8 December 2010 only in x86 version._\n**Q:Windows 8 build 6867 – Screens\nA:Screenshots of build 6867, which have leaked on DeviantArt and Winreview forum are FAKE. The only real photos of this build come from CES2011.**\nPs ：本人不懂E文。尽力做到让大伙明白。但是很多地方还是不知道写些什么。从E 2 C貌似很难just for me。看不明白的小盆友留下你的可爱的脚印吧。\n","date":"2011-04-28T22:39:00Z","permalink":"/posts/windows-8-builds-list/","title":"windows 8 已知builds(编译版本)列表及版本详解"},{"content":"假如你安装并激活了 Windows 8 M1 Build 7850 或者 Windows 8 M2 (Pre-M3) Build 8955, 或许很多人会失望windows 8 跟windows 7没有什么区别，我当时也有这样的感觉，而且windows 8采用了windows 7 安装器，刚刚下载回来的时候还怀疑是不是镜像文件下载错了。其实windows 8 build 里面加入了很多功能。只是默认是关闭的。我们需要自己手动开启才能看到效果。\n在Windows 8 M2 (Pre-M3) Build 7955 中可以开启的功能 Ribbon UI 在 HKEY_CLASSES_ROOT\\CLSID\\ 下创建一个{4F12FF5D-D319-4A79-8380-9CC80384DC08} 键, 在这个键下然后创建一个名字为AppID 字符串的键，键值为**{9198DA45-C7D5-4EFF-A726-78FC547DFF53}**\n[HKEY_CLASSES_ROOT\\CLSID{4F12FF5D-D319-4A79-8380-9CC80384DC08}] \u0026quot;AppID\u0026quot;=\u0026quot;{9198DA45-C7D5-4EFF-A726-78FC547DFF53}\u0026quot;\n重启explorer或者重启电脑。打开资源管理器即可看到效果。\nApplication Explorer Application Explorer 可以通过创建或者是重命名一个目录名字为\nApplications.{4234d49b-0245-4df3-b780-3893943456e1}\nFull DWM 在\nHKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\DWM\n新建 名字为 hide blur 类型为DWORD 的键值1\n然后, 按 Ctrl + Shirt + F9 两次激活\nMetro UI 打开\n%windir%\\System32\\oobe\\windeploy.exe 或者\n%windir%\\System32\\oobe\\msoobe.exe\n在 Windows 8 M1 Build 7850 可开启功能 资源管理器 Ribbon UI 同 Windows 8 M2 (Pre-M3) Build 7955\nWebCam (Microsoft MoCam) 在\nHKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\GRE_Initialize\u0026lt;/ins\u0026gt;\n下新建一个DWORD 类型名字为 RemoteFontBootCacheFlags, 值为0x0000100f 或者4111十进制。\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\GRE_Initialize] \u0026quot;RemoteFontBootCacheFlags\u0026quot;=dword:0000100f\nPDF Reader (Modern Reader)（PDF阅读器） 在\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\Curr entVersion\\Applets\\Paint\\Capabilities\n下新建一个字符串类型名字为 CLSID,键值为**{D3E34B21-9D75-101A-8C3D-00AA001A1652}** 键。\n打开 glcnd.exe 允许 PDF Modern Reader.\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Applets\\Paint\\Capabilities] \u0026quot;CLSID\u0026quot;=\u0026quot;{D3E34B21-9D75-101A-8C3D-00AA001A1652}\u0026quot;\n**TaskUI **\n在 HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\TaskUI\n新建一个 32位 DWORD 键名字为TaskUIEnabled, 值为1。\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\TaskUI] \u0026quot;TaskUIEnabled\u0026quot;=dword:00000001\n假如你不想折腾那么你也可以直接下载以下文件来开启相应的功能。Win8-M1-8750-Registry.zip.\n还有几个软件分别名字叫 Windows 8 Tweaker, Windows 8 BluePoison, SK Patch v2 Beta1 和一些其他不同的工具他们的功能都是一样的, 也可以根据自己喜欢下载。\n","date":"2011-04-28T00:00:00Z","permalink":"/posts/windows-8-new-feather/","title":"如何开启windows 8的隐藏功能"},{"content":"Windows 8 Milestone-2 (7955.0.110228-1930) 下载 File Name: 6.2.7955.0.fbl_sev_wdacxml.110228-1930_x86fre_client-ultimate.iso\nFile Size: 2,657,079,296 bytes MD5: EA2DCFADA6BBA517A0A0649D15E1EB3D SHA1: 23C5A856A9D93E7957ACC36CA9FA38F46A3783F8\nWindows 8 M2 7955下载地址：http://www.fileserve.com/file/x25vhGa （用迅雷等BT下载工具）\n6.2.7959.fbl_srv_wdacxml.110307-1930 下载 File Name: 6.2.7959.0.fbl_srv_wdacxml.110307-1930_amd64fre_server-enterprise_en-us.iso\nSIZE: 2.87GB (3,229,550,592 bytes) MD5: 99375D7782027CBF2E70F5D0F8648406\nwindows 8 6.2.7959下载地址：http://convurl.com/20P4as\nPs:前面有一个版本。版本号为windows 8 M1 build 7850 ，7955相对做了很多变化。其中就是ie 9能正常使用（前面版本输入有延迟问题）；很多功能都是隐藏的。需要自己修改注册表或者是使用工具开启隐藏功能。而且现在没有出中文的版本，所以所有的版本没有作特别说明的情况下都是英文版本的。新出的7959为server版本，我没有安装测试。\n最近一直忙，虽然天天泡在电脑上，但是没有时间更新博客。最近windows 8 泄露了两个测试版本。把下载地址分享出来。给那些喜欢折腾和测试的windows 爱好的朋友开始新系统体验吧。现在泄露的版本是 windows 8 M2 build 7955。\n","date":"2011-04-27T23:03:00Z","permalink":"/posts/window-8-last-download-link/","title":"window 8 最新下载地址"},{"content":"最好用的作笔记工具myBase介绍 myBase 是一个功能强大且可随心所欲自定义格式及层次关系的通用资料压缩管理、查看器，可用于管理和查阅各种各样的信息，如：各类文档、磁盘文件、光盘目录、资料、名片、事件、下载的精华、收集的资料等等，即使毫无规律的资料，也一样可以管理得有条不紊。若您善于管理资料，myBase 将会成为您得心应手的工具，若您不善于管理资料，myBase 将会有助于您提高资料管理能力。它将令您的各种资料分门别类，清清爽爽。新版具有许多令人惊喜的实用功能。\n最好用的作笔记工具myBase下载 myBase 5.51 （目前最新版）官方下载地址：myBase-Desktop-Setup myBase 5.51 汉化文件及注册机下载地址：http://u.115.com/file/f588b67e5b#\n使用方法 先安装源文件，把注册机复制到安装目录点击patch，然后点击第一个按钮算号，打开软件点击regedit输入对应的用户和注册号\n","date":"2011-03-02T22:29:00Z","permalink":"/posts/best-note-tool-mybase/","title":"最好用的作笔记工具myBase"},{"content":"apache+php+mysql下载(for windows) 最新apache下载地址：httpd-2.2.17-win32-x86-no_ssl.msi | 更多版本点击此处\n最新php下载地址：php-5.3.5-nts-Win32-VC6-x86.msi 或者 php-5.3.5-nts-Win32-VC6-x86.zip | 更多版本请移驾到官方\n最新mysql下载地址：http://dev.mysql.com/downloads/mysql/#downloads\nphpmyadmin下载地址：phpMyAdmin-3.3.9.2-all-languages.7z\nPS: php VC9是专门为IIS定制的，VC6 是为了其他WEB服务软件提供的，所以这里下载VC6的版本！\napache+php+mysql安装与配置 首先安装apache，apache引导安装后，输入：http://localhost 或者 http://127.0.0.1 测试 会出现“It works”的字样。\nPS:你也可以使用其他的如http://web 只需在\n%windir%\\System32\\drivers\\etc\\hosts\n的后面加上\n127.0.0.1 web\n保存，但是在安装apache的时候域名处请填写web如下图：\n接下来安装php，因为我这里采用的是windows 安装文件，安装的时候选apache 2.2.x Module\n安装完成后会在apache 配置文件(httpd.conf)最后加上\n#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL PHPIniDir \u0026quot;\u0026quot; LoadModule php5_module \u0026quot;php5apache2_2.dll\u0026quot; #END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL\n后面安装mysql 安装的时候可以选择数据库安装的位置 你也可以安装后再修改 如图：\n配置mysql(方法很多，仅供参考) 1、这里选择详细配置（detailed configuration）\n2、这里选服务器（server machine）\n3、这里选Non-Transactional Database Only\n4、这里选默认编码类型\n5、这里把选框都勾上\n6、这里需要输入你的密码然后重复输入密码（要是有三个输入框第一个留空，后面两个输入密码即可），选框都不用选\n到此下一步配置完成！\n修改配置apache 打开httpd.conf 1、修改默认文件，找到DirectoryIndex 替换成如下的样子（根据个人需要）\n\u0026lt;IfModule dir_module\u0026gt; DirectoryIndex index.html index.php default.php default.html\nindex.htm index.html \u0026lt;/IfModule\u0026gt;\n2、修改网站目录 找到DocumentRoot 在双引号内输入你的网站路径如我的\nDocumentRoot \u0026quot;F:/htdocs\u0026quot;\n然后找到\u0026lt;Directory \u0026quot;Your apache path/htdocs\u0026quot;\u0026gt;\n同样在双引号内输入你网站路径跟上面路径保持一致如我的\n\u0026lt;Directory \u0026quot;F:/htdocs\u0026quot;\u0026gt;\n这里略去很多英文字\n\u0026lt;/Directory\u0026gt;\n3、修改php支持找到\n#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL PHPIniDir \u0026quot;\u0026quot; LoadModule php5_module \u0026quot;php5apache2_2.dll\u0026quot; #END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL\n修改为你的php所在的路径 如我的：\n#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL PHPIniDir \u0026quot;D:/web/php\u0026quot; LoadModule php5_module \u0026quot;D:/web/php/php5apache2_2.dll\u0026quot; #END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL\n配置php 最新php默认支持mysql 也不需要修改extension_dir 如果不能正常运行 。则：打开php.ini 找到Dynamic Extensions\n再后面加入：\nextension=php_curl.dll extension=php_gd2.dll extension=php_mbstring.dll extension=php_mysql.dll extension=php_pdo_mysql.dll extension=php_pdo_odbc.dll extension=php_xmlrpc.dll\n开启mysql 支持 ，找到; extension_dir = \u0026quot;ext\u0026quot;\n修改为extension_dir=\u0026quot;D:\\web\\php\\ext\u0026quot;\nPS:我的安装目录分别为\napache：D:\\web\\Apache\nmysql：D:\\web\\MySQL\nphp：D:\\web\\php\nmysql数据库：D:\\web\\Data\\data\n所以以上安装路径如跟我的不同需做对应的更改。\nphp环境测试 新建文件info.php\n写入代码：\n\u0026lt;?php phpinfo(); ?\u0026gt;\n放到网站对应根目录重启apache 打开http://localhost/info.php 查看配置好的php环境功能\n测试mysql\n新建文件db_test.php\n写入代码：\n\u0026lt;?php $connect=mysql_connect(“127.0.0.1″,”root”,”mysql数据库密码”); if(!$connect) echo “恭喜俺 出错鸟”; else echo “恭喜俺！链接成功”; mysql_close(); ?\u0026gt;\n打开http://localhost/db_test.php 查看效果\n不明白请本站冒个泡泡，更多请参考官方手册。\n","date":"2011-02-16T17:34:00Z","permalink":"/posts/how-to-install-apache-php-mysql-on-windows/","title":"最新php环境apache+php+mysql配置"},{"content":"a disk read error occured press ctrl+alt+alt to restart的解决方法\n因为很多人是用的是串口的硬盘。换接口是不行的。前不久一个兄弟电脑坏了。老是开机出现这个错误。\n弄了好几回都没有效果；感觉相当的纠结。不过几经折腾呢，我感觉也不是问题的问题。我再也不弄那个bios了，弄的太累了，越搞越糊涂。\n我是这么弄的。把机子拆开，把cmos电池反装一会儿，重新给正确的装上去。然后开机会出现Floppy disk fail (40)；还有就是cmos没有设置什么的；我们点击delete键进入bios，然后把Floppy disk默认的1.44M设置为 none。启动磁盘里面该选什么选什么。这样应该就不存在什么问题了。\n还有一个需要检查的地方就是你的硬盘是不是存在活动分区，假如说不存在，请把你装的最早的系统所在的分区设为活动分区。\n","date":"2010-12-23T22:20:16Z","permalink":"/posts/solve-a-disk-read-occured/","title":"解决a disk read error occured  press ctrl+alt+alt to restart"},{"content":"wordpress如何更换域名 在phpmyadmin中执行下面的查询语句\nUPDATE wp_options SET option_value = replace(option_value,'http://kimozh.net','http://www.vkilo.com') WHERE option_name = 'home' OR option_name = 'siteurl'; UPDATE wp_posts SET post_content = replace(post_content,'http://kimozh.net','http://www.vkilo.com'); UPDATE wp_posts SET guid = replace(guid,'http://kimozh.net','http://www.vkilo.com'); domain格式 http://www.vkilo.com 最后不要带\u0026quot;/\u0026quot;;\n如果出错，检查是不是标点符号有问题！\nwordpress换域名完美301重定向\n假如你的linux主机只需要把 .htaccess 文件 WordPress 部分修改成下面样子：\n# BEGIN WordPress \u0026lt;IfModule mod_rewrite.c\u0026gt; Options +FollowSymLinks RewriteEngine on rewritecond %{http_host} ^www.old.com [nc] rewriterule ^(.*)$ http://www.new.com/$1 [L,R=301] \u0026lt;/IfModule\u0026gt; # END WordPress 假如是windows主机需修改 wordpress 根目录下的 **wp-blog-header.php** ，并在文件开头 \u0026lt;?php 之后加入以下代码： if (strtolower($_SERVER['SERVER_NAME'])!='www.kimozh.net') { $URIRedirect=$_SERVER['REQUEST_URI']; if(strtolower($URIRedirect)==\"/index.php\") { $URIRedirect=\"/\"; } header('HTTP/1.1 301 Moved Permanently'); header('Location:http://www.vkilo.com'.$URIRedirect); exit(); } 注意把[www.kimozh.net](http://www.vkilo.com)改成你自己的新玉米","date":"2010-12-23T22:03:14Z","permalink":"/posts/wordpress-change-domain/","title":"wordpress更换域名及设置方法"},{"content":"firefox几点优化 在firefox地址栏中输入about:config）\n1、加入一个boolean（布尔）项：config.trim_on_minimize,并设置为true,这样就可以在最小化时自动释放内存。 2、修改browser.sessionhistory.max_total_viewers修改值为5或更小{页面快进/快退功能中保存的页面总数，默认是-1(无限)}。 3、创建一个browser.cache.memory.capacity设置firefox使用多少内存来进行缓存，默认值-1基于系统内存自动设置，18432=18MB一般适用于512M~1G内存。 4、 browser.cache.memory.enable[布尔值]该项和browser.cache.memory.capacity联合起作用。如果 设置为true，firefox将使用browser.cache.memory.capacity指定的内存大小来进行缓存。 5、browser.urlbar.clickSelectsAll [布尔值]决定在地址栏单击时是高亮选中还是插入光标。 6、browser.urlbar.hideGoButton [布尔值]决定是否显示地址栏右侧绿色的箭头（一般人都是敲回车的，这个实在是鸡肋）。 7、 创建config.trim_on_minimize[布尔值]（仅限于windows）决定是否象其它windows应用程序一样最小化到任务栏时释放 内存，对于配置较低的电脑建议设置为true，配置还过的去的设置为false，这将加速firefox的最小化、最大化过程。 8、 dom.disable_window_open_feature.*[布尔值]以 dom.disable_window_open_feature. 开头的设置总共有11个，*可以是 close，directories，location，menubar，minimizable，personalbar，resizable，scrollbars，status，titlebar，toolbar。 这些设置控制弹出窗口（主要是广告）的显示元素，比如将dom.disable_window_open_feature.close设置为true，则 会强迫弹出窗口在右上角显示一个关闭按钮。建议将close和resizeable设置为true。 9、dom.popup_maximum [整数]能够同时打开的弹出窗口的数目。经常有一些恶意站点会冒出一大堆弹出窗口，直到屏幕崩溃为止。建议将该值设置为5或更小。 10、extensions.dss.enabled [布尔值]决定是否能够动态主题切换。假如设置为true，在安装或切换主题时，将立刻显现出新主题的效果，而不用关闭firefox后重新引导firefox。 11、 network.cookie.cookieBehavior[整数]决定firefox处理cookies的政策。设置为1允许所有的 cookies，设置为2禁止所有的cookies，设置为1仅允许原始站点的cookies，不允许第三方（大多是广告）的cookies。建议设置为 1。 12、network.dnsCacheEntries [整数]（需创建）决定在firefox的DNS缓存中保存条目的数目。当在firefox中键入一个web地址时，它通过查询DNS服务器将web地址 转化为IP，在当地缓存中保存一定数量的DNS条目，下次再键入同样的web地址时，就能加快浏览速度。默认firefox将该值设置为20，建议将该值 设置为一般情况浏览web站点的数目。 13、network.dnsCacheExpiration [整数]（需创建）决定缓存的DNS条目过期的时间。默认为60秒。 14、 network.http.max-connections[整数]决定同时能够打开多少http连接。默认值是24，如果你的网络连接够快，可以尝试增 大此值，最大值为65535。但要注意的是，增大该值仅仅增大了同时打开http连接数目的可能，你并不能强迫firefox每次都打开那么多的 http连接。 15、network.http.max-connections-per-server[整数]决定在单个服务器能够同时打开的 连接数。默认值为8，你可以增大此值来加快浏览速度，最大值为255。但要注意的是，此值改的太大，一些服务器会认为你在进行DDoS攻击，从而拒绝你的 连接请求。事实上，如果所有的firefox用户都不理智的把此值改的太大，大多数站点的浏览速度不会得到提升，反而会非常慢。 16、 network.http.max-persistent-connections-per-proxy[整数]假如你使用的是代理，该值决定同时有多少 连接处于活动状态。默认值为4，可以适当增大此值加快浏览速度。但要注意的是，此值改的太大，会增大代理服务器的压力，从而影响每个使用该代理的用户的浏 览速度。 17、network.http.max-persistent-connections-per-server[整数]假如没有使用代 理，该值决定在单个服务器上同时有多少连接处于活动状态。默认值为2，可以适当增大此值加快浏览速度，最大值为255。但要注意的是，此值改的太大会增大 服务器的压力，从而有可能被该服务器拒绝连接请求。 18、network.http.pipelining [布尔值]决定是否使用HTTP Pipelining特性，建议设置为true，加快浏览速度，尽管该特性不是所有的服务器和代理都支持。 19、 network.http.pipelining.maxrequests [整数]决定使用HTTPPipelining特性时发送的最大连接请求。默认值为4，最大值为8，比8大的值会被忽略，1表示不使用 HTTPPipelining特性，建议将该值设置为8。 20、network.http.proxy.pipelining [布尔值]决定是否在使用代理时使用HTTP Pipelining特性。建议设置为true，要注意的是，该值有效的前提是network.http.proxy.keep-alive值为true。 21、network.http.redirection-limit [整数]决定接受多少连续的重定向。比如说你进入一个站点旧的网址，可能会被重定向到一个新的网址，这叫一个重定向。 22、network.prefetch-next [布尔值]决定是否使用Link Prefetching特性。建议设置为false。 23、nglayout.initialpaint.delay [整数]（需创建）决定在显示页面内容时等待多少毫秒。适当的延迟可以让firefox引导和调整各种各样的页面元素以便正确显示。默认值是250毫秒，你可以增大或减小该值，当然，这取决于你的浏览习惯。 24、plugin.default_plugin_disabled [布尔值]当浏览某个网页缺少某个插件（比如flash）时是否提示安装。 25、privacy.popups.disable_from_plugins [整数]设置为0不阻止任何弹出窗口，设置为1阻止弹出窗口的最大数目取决于dom.popup_maximum，设置为3阻止所有的弹出窗口，设置为2 仅阻止来自插件的弹出窗口\nfirefox占很大资源(内存)问题 firefox地址栏输入about:cache查询缓存位置\nfirefox地址栏输入about:config 回车\nbrowser.cache.disk.capacity 磁盘缓存容量自己适当更改 双击browser.cache.memory.enable 让它值为true 新建字符串(string) 名称为browser.cache.disk.parent_directory 值为 /tmp\nbrowser.cache.offline.capacity 磁盘缓存容量自己适当更改\n双击browser.cache.offline.enable 让它值为true 新建字符串(string) 名称为browser.cache.offline.parent_directory 值为 /tmp\n","date":"2010-12-23T21:43:00Z","permalink":"/posts/firefox-memory-optimization/","title":"firefox内存及资源优化"},{"content":"很多在学校的朋友可能因为找联想客户端很辛苦，如linux版本，还有mac os x 版本的，这里我全部打包上传，里面有详细的使用说明。\n里面包含802.1xclient联想客户端for win 7 x64、802.1xclient联想客户端for linux（ubuntu）、802.1xclient联想客户端for mac os x\n下载地址： http://u.115.com/file/f54cfec6c7#\n","date":"2010-12-17T14:09:00Z","permalink":"/posts/802-1xclient-last-down/","title":"最新802.1xclient万能联想客户端下载"},{"content":"很多时候因为搬家或者是升级导致了wordpress密码不对，其实是部分文件没有更新从配置文件更新过来。发邮件的方式是可以，但是邮件要花时间，而且要是邮箱都高忘记了怎么办呢？如何修改wordpress密码？下面给你推荐一种个人认为修改wordpress密码的最好办法！\n将下列代码保存为fliename.php.传到你得wordpress根目录，然后在网址中网页中打开上传的文件。输入新的密码。点击提交查询！\n\u0026lt;?php\n//password resetter\ninclude(\u0026ldquo;wp-config.php\u0026rdquo;);\ninclude(\u0026ldquo;wp-blog-header.php\u0026rdquo;);\nif (empty($_POST[\u0026rsquo;emergency_pass\u0026rsquo;])) {\n?\u0026gt;\n\u0026lt;form method=\u0026ldquo;post\u0026rdquo;\u0026gt;\n设置 username 密码: \u0026lt;input name=\u0026ldquo;emergency_pass\u0026rdquo; type=\u0026ldquo;password\u0026rdquo; /\u0026gt;\n\u0026lt;input type=\u0026ldquo;submit\u0026rdquo; /\u0026gt;\n\u0026lt;/form\u0026gt;\n\u0026lt;?php\n} else {\n$sql = \u0026ldquo;UPDATE \u0026ldquo;.$wpdb-\u0026gt;users.\u0026rdquo; SET user_pass = \u0026lsquo;\u0026quot;.md5($_POST[\u0026rsquo;emergency_pass\u0026rsquo;]).\u0026rdquo;\u0026rsquo; WHERE User_login = \u0026lsquo;username\u0026quot;;\n$link = $wpdb-\u0026gt;query($sql);\nwp_redirect(\u0026lsquo;wp-login.php\u0026rsquo;);\nexit();\n}\n?\u0026gt;\n把对应的用户名修改。\n","date":"2010-12-14T11:50:16Z","permalink":"/posts/wordpress-move-host/","title":"修改wordpress密码的最好办法"},{"content":"方法1.开始运行、输入%windir%\\temp;清空里面的所有内容，返回到windows目录，右键temp目录——属性，点到安全选项，如果没有你可以在窗口的上边点开 工具——文件夹选项——查看——将“使用单文件共享(推荐)”钱的勾去掉就有了;将此文件夹USER用户权限设置为完全控制就能解决。\n方法2. 在c盘windows目录下 php.ini 比如你可以找到这一行session.save_path = “某个路径” 改为 session.save_path = “yourpath” 然后要建yourpath对应的目录。\n","date":"2010-12-04T09:53:57Z","permalink":"/posts/phpmyadmin-2002-error/","title":"phpMyAdmin – 错误 无法在发生错误时创建会话，请检查 PHP 或网站服务器日志，并正确配置 PHP 安装。"},{"content":"我安装win x64,当时以为20G的分区应该够了。后面打了点补丁，通过减肥了也还是小了，经常磁盘整理，不过还是不够，用过很多工具都不能改变分区大小，因为我的系统装在最后一个逻辑分区。一般的软件支持向后扩展。于是找了一下，惊喜果然出现了。\nAcronis Disk Director 可以帮你完成所有的任务，他操作起来十分方便，功能强大。现在最新版本号是11\n官方下载地址：http://www.acronis.com/homecomputing/products/diskdirector/index.html\n软件是收费的。我找了很久的注册机，但是墙内墙外都找了很久，没有找到。\n假如你是下载飞官方最新版先用这个：\n32YMG9R8-CMKLM7RT-5QHDL3NL-JZHSC6SX-PR4MW9JA-9EYM59P7-DKNBBWFL-72P9VX7K 找到后会第一时间附上。这里建议到这里去下载。里面有注册机而且兼容我的win7X64 http://down.vista123.com/AcronisDiskDirector10.rar\n因为是只有英文版貌似汉化的容易出问题，数据无价，我们不能乱来。\n不急，我会告诉你一些简单的操作，这样慢慢的熟悉这款软件！\n——————————————这貌似是一条分割线——————————————————\nAcronis Disk Director 使用教程 安装我就不用多讲了。这个软件安装一般是因人而异的，而且选项也比较少。这个我相信你能够顺利完成！\n初次打开会出现要你选择模式，这个你选什么模式不要紧，到了里面可以更改。\n一般情况下我们不选择自动模式，我们会选择手动模式如下图。\n在手动模式下可以对硬盘的分区进行删除、创建、移动、切割、更改类型、进行编辑等等。\n我这里是因为没有未分配空间。最开始操作的时候因为忙于测试忘记了截图了。\n这里随便点击一个盘符会出现如下图可操作项目：\n不管你执行什么操作后必须点击执行就是下图的那个旗帜\n这里因为没有开虚拟机，就不一一详细的介绍。\n更改分区类型 也就是图中的转换分区也就是主要分区于逻辑分区互换（囧。这里貌似有点死板）\n在要转换的分区上点右键，选择高级选项（Advanced），再选择里面的转换（Convert），或者是选定分区后直接点左边任务条下面的转换（Convert）也可以。\n然后进入下一步\n选完后单击OK按钮。再点红旗完成！\nPs:不过这样有可能会在分区前面留出一些空间，要注意这个空间是无法合并到其他分区。\n后面主要说一下我今天改变大小。\n这是我从18G改过来的，折腾成功。\n把你的鼠标放到上图选择中的位置可以像向后移动。当然前面面也可以拖动。\n这样就可以减小现在的分区或者是放大当前的分区。一搬情况下我们就这里拖动。下面是数值不要手动去修改。\n完毕后点击旗帜提交。假如是系统盘操作时需要重启的，重启后完成了还会再重启一次方能进系统。重启的时候一定不能断电。否则后果可能比想象中跟麻烦。\n主要就是简单的说下两个基本的功能。其他的根据你需要吧！大同小异。\n软件包面还包含了一些其他的附带的功能。\n1、Acronis Partition Expert ：\n这个软件用来更改分区大小，移动硬盘分区，拷贝复制硬盘分区，硬盘分区分割，硬盘分区合并，绝对无损硬盘数据。\n2、Acronis OS Selector ：\n用它来控制多启动界面。如引导程序之类的。可以用硬盘安装系统（如在32位系统下无法直接安装64位系统），这个工具可以帮你去完成。\n3、Acronis Recovery Expert ：\n强悍的工具，用来扫描和恢复丢失的分区。\n4、Acronis Disk Editor：\n硬盘修复工具，比较专业，允许对硬盘磁盘进行高级操作，利润硬盘引导记录表操作和16进制编辑。\n","date":"2010-11-16T17:11:53Z","permalink":"/posts/best-disk-tool-for-windows/","title":"最好用的硬盘分区工具，Acronis Disk Director Suite下载"},{"content":"A记录 A (Address) 记录是用来指定主机名（或域名）对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上。同时也可以设置您域名的子域名。通俗来说A记录就是服务器的IP,域名绑定A记录就是告诉DNS,当你输入域名的时候给你引导向设置在DNS的A记录所对应的服务器\n子域名 子域名道理等同二级域名，不过比二级域名更加延伸，比如我们继续扩展该域名的主机名，设置主机名为bbs.at,那么就可以建立一个三级域名：bbs.at.abc.com，当然也可以建立四级域名bbs.at.go.abc.com，五级域名bbs.at.go.home.abc.com……，依次类推，可以建立无限级别的域名，我们统称这些域名为顶级域名abc.com的子域名。\nCNAME别名指向记录 NAME (Canonical Name)记录，通常称别名指向。在这里，您可以定义一个主机别名，比如设置ftp..com，用来指向一个主机www..com,那么以后就可以用FTP..com来代替访问www..com了。\nMX记录 MX记录也叫做邮件路由记录，用户可以将该域名下的邮件服务器指向到自己的mail server上，然后即可自行操控所有的邮箱设置。您只需在线填写您服务器的IP地址，即可将您域名下的邮件全部转到您自己设定相应的邮件服务器上。 简单的说，通过操作MX记录，您才可以得到以您域名结尾的邮局。现在很多公司都免费提供域名邮箱，你可以申请属于自己的域名邮箱，如TX\nTXT 记录 TXT 记录，一般指为某个主机名或域名设置的说明，如： admin IN TXT \u0026quot;管理员, 电话： 13901234567\u0026quot; mail IN TXT \u0026quot;邮件主机, 存放在xxx , 管理人：AAA\u0026quot; Jim IN TXT \u0026quot;contact: abc@mailserver.com\u0026quot; 也就是您可以设置 TXT ，以便使别人联系到您\nSRV 记录 SRV 记录：一般是为Microsoft的活动目录设置时的应用。DNS可以独立于活动目录，但是活动目录必须有DNS的帮助才能工作。为了活动目录能够正常的工作，DNS服务器必须支持服务定位（SRV）资源记录，资源记录把服务名字映射为提供服务的服务器名字。活动目录客户和域控制器使用SRV资源记录决定域控制器的IP地址。 此技术细节请参考相应网站\nTTL值 TTL值全称是“生存时间（Time To Live)”，简单的说它表示DNS记录在DNS服务器上缓存时间。要理解TTL值，请先看下面的一个例子： 假设，有这样一个域名myhost.abc.com（其实，这就是一条DNS记录，通常表示在abc.com域中有一台名为myhost的主机）对应IP地址为1.1.1.1，它的TTL为10分钟。这个域名或称这条记录存储在一台名为dns.abc.com的DNS服务器上。 现在有一个用户在浏览器中键入一下地址（又称URL)http://myhost.abc.com 这时会发生什么呢？ 该访问者指定的DNS服务器（或是他的ISP,互联网服务商, 动态分配给他的)8.8.8.8就会试图为他解释myhost.abc.com，当然8.8.8.8这台DNS服务器由于没有包含myhost.abc.com这条信息，因此无法立即解析，但是通过全球DNS的递归查询后，最终定位到dns.abc.com这台DNS服务器，dns.abc.com这台DNS服务器将myhost.abc.com对应的IP地址1.1.1.1告诉8.8.8.8这台DNS服务器，然有再由8.8.8.8告诉用户结果。8.8.8.8为了以后加快对myhost.abc.com这条记录的解析，就将刚才的1.1.1.1结果保留一段时间，这就是TTL时间，在这段时间内如果用户又有对myhost.abc.com这条记录的解析请求，它就直接告诉用户1.1.1.1，当TTL到期则又会重复上面的过程\n泛域名与泛解析 泛域名是指在一个域名根下，以 *.Domain.com 的形式表示这个域名根所有未建立的子域名。\n这里我推荐免费域名解析服务gogaddy,算是世界上最大的域名提供商，服务很好！\n地址：https://www.godaddy.com/\n","date":"2010-11-14T11:06:35Z","permalink":"/posts/dns-record-detail/","title":"域名记录详解 DNS记录详解 免费域名解析服务推荐"},{"content":"常用快捷键\nF1 显示当前程序或者windows的帮助内容。\nF2 当你选中一个文件的话，这意味着“重命名”\nF3 当你在桌面上的时候是打开“查找：所有文件” 对话框\nF10或ALT 激活当前程序的菜单栏\nF12在编辑好Excel 或Word文档，可“另存为”\nwindows键或CTRL+ESC 打开开始菜单\nCTRL+ALT+DELETE 在win9x中打开关闭程序对话框\nCTRL+SHIFT+ESC 打开任务管理器\n在win9x中是打开开始菜单\nDELETE 删除被选择的选择项目，如果是文件，将被放入回收站\nSHIFT+DELETE 删除被选择的选择项目，如果是文件，将被直接删除而\n不是放入回收站\nCTRL+D 删除到回收站\nCTRL+N 新建一个新的文件\nCTRL+A 全选文件夹内的文件\nCTRL+O 打开“打开文件”对话框\nCTRL+P 打开“打印”对话框\nCTRL+S 保存当前操作的文件\nCTRL+W关闭当前的窗口\nCTRL+X 剪切被选择的项目到剪贴板\nCTRL+INSERT 或 CTRL+C 复制被选择的项目到剪贴板\nSHIFT+INSERT 或 CTRL+V 粘贴剪贴板中的内容到当前位置\nALT+BACKSPACE 或 CTRL+Z 撤销上一步的操作\nALT+SHIFT+BACKSPACE 重做上一步被撤销的操作\nWindows键+M 最小化所有被打开的窗口\nWindows键+D 显示桌面\nWindows键+SHIFT+M 重新将恢复上一项操作前窗口的大小和位置\nWindows键+E 打开资源管理器\nWindows键+F 打开“查找：所有文件”对话框\nWindows键+R 打开“运行”对话框\nWindows键+BREAK 打开“系统属性”对话框\nWindows键+CTRL+F 打开“查找：计算机”对话框\nSHIFT+F10或鼠标右击 打开当前活动项目的快捷菜单\nSHIFT 在放入CD的时候按下不放，可以跳过自动播放CD。在打\n开word的时候按下不放，可以跳过自启动的宏\nALT+F4 关闭当前应用程序\nALT+SPACEBAR 打开程序最左上角的菜单\nALT+TAB 切换当前程序\nALT+ESC 切换当前程序\nALT+ENTER 将windows下运行的MSDOS窗口在窗口和全屏幕状态间切换\nPRINT SCREEN 将当前屏幕以图像方式拷贝到剪贴板\nALT+PRINT SCREEN 将当前活动程序窗口以图像方式拷贝到剪贴板\nCTRL+F4 关闭当前应用程序中的当前文本（如word中）\nCTRL+F6 切换到当前应用程序中的下一个文本\n（加shift 可以跳到前一个窗口）\nwin 7专用\n1. Ctrl + Shift + N – 创建一个新的文件夹 你需要在文件夹窗口中按 Ctrl + Shift + N 才行，在 Chrome 中是打开隐身窗口的快捷键。 2. Ctrl + Shift + 左键 – 用管理员权限打开程序 (Ctrl+Shift+Click to Open a Program As Administrator) 有些程序，需要右键选择 Windows7 的管理员权限才可以正常运行，而这个蛋疼的快捷键我没有测试成功，@sfufoet 在受限制帐户下测试的软件 AirVideoServer 可以在 Touch 上成功连接 AirVideoServer 并播放视频。 3. Shift+ 鼠标右键 – 增强版右键发送到 右键发送到 是一个很常用的功能，一般情况下可以发送到：桌面快捷方式、邮件联系人、压缩文档、移动设备等等。而通过 Shift+ 鼠标右键 的发送到，增加了 Windows7 个人文件夹内的所有内容，包括：我的文档、我的照片、我的音乐、桌面等等 4. Shift + 右键 – 在当前文件夹用命令行打开。 开始 \u0026gt; 运行 \u0026gt; cmd 就是命令行界面，传说中的 DOS 命令。最常用的可能就是 ping 了吧？用命令行来修改文件扩展名也是好办法，ren name.txt name.bat 就可以把一个文本文件改成批处理文件了。而 Shift + 右键 在当前文件夹用命令行打开的作用就是不用频繁的 cd 打开各级文件夹了。 5. Win + 空格 – 闪现桌面 效果与鼠标停留在任务栏最右端相同，松开 Win 键即恢复窗口。恩，你可以用来看看桌面背景的美女。 6. Win+ 上/下/左/右 – 移动当前激活窗口 其中，Win +左/右 为移动窗口到屏幕两边，占半屏，Win + 上 为最大化当前窗口，下为恢复当前窗口 7. 针对双显示器: Win + Shift + 左 – 移动当前窗口到左边的显示器上 针对让人羡慕的双显示器，可以很方便的移动当前窗口到另外一个显示器上，比如把视频窗口移到一边去，还可以继续上网。\n8. 针对双显示器: Win + Shift + 右 – 移动当前窗口到右边的显示器上 我认为是老外为了凑数才把这个快捷键单独列出来的。 9. Win + T – 显示任务栏窗口微缩图并回车切换 多按几次 T 可以在不同的任务栏窗口中显示，回车则切换。很方便的快捷键。切换窗口还可以用 Win + Tab。 10. Shift + 左键 – 在任务栏对已打开的程序/文件夹再打开一次 话比较绕，比如你对着任务栏里的 Chrome Shift + 左键 则会新打开一个窗口。而对着记事本按也会再打开一个记事本。 11. Win + B – 移动光标到系统托盘 针对键盘爱好者，不需要在狂按 TAB 键才切换到系统托盘了。Win + B 直达托盘，之后就可以用方向键控制了，也可以控制时间区域。 12. Win + P – 在显示器与投影间相互切换 13. Win + 1, Win + 2 – 在任务栏中快速切换程序 任务栏从左到右 1，2，3，快速切换用的。对当前窗口的作用是最小化，另外一个最小化快捷键是 Win + M。 14. Win + Pause – 打开系统属性 通过开始菜单 \u0026gt; 计算机右键属性，是一个东西 15. Ctrl + Shift + Esc – 快速打开 Windows 任务管理器 俗话说最好的留在最后，自从升级 Windows7 后，想调用任务管理器，需要先 Ctrl + Alt + Del 标准快捷键，再点击任务管理器，并且屏幕还会被锁定。而今天才知道的 Ctrl + Shift + Esc 让我泪流满面啊。。。\n","date":"2010-11-13T12:44:28Z","permalink":"/posts/key-map-for-windows/","title":"常用快捷键"}]