1. Excel 保留行号的去重

    注:本文方法同时适用于 Excel 和 Numbers。 问题 对 Excel 中一列已经排序的数据,如何去重,且保留最终留下的值的行号? 例如: 110 110 151 163 163 163 888 888 999 这样一列数据,进行普通的去重之后结果为: 110 151 163 888 999 而现在想要的效果是: 110 151 163 888 999 分析 遇到这个问题第一个念头是用脚本来做,虽然 VBA 编辑很方便,也肯定能解决,但是总觉得还是不如 Excel 本身提供的操作方便。 第二个念头是使用公式,数据已经排序,需要保留第一次出现该值的那一行,那么可以比对本行值与上一行的值,如果相等则说明不是第一次出现,应删除,如果不等则说明是第一次出现,应保留。沿这个思路很简单地用一个 IF 就解决了问题: =IF(A2<>A1,A2,"") 效果 总结 自从几年前学了点 VBA,遇到一些利用 Excel 进行数据处理的问题首先就想到使用脚本去做。可以想见步骤: Alt+F11 打开脚本编辑器。 查并不熟悉的 API 然后写出逻辑。 执行之后拿到结果。 保存的时候可能还得复制到另一份纯净的 Excel 文档里去,免得带脚本的 xls 文件在别人的机子上打开会报安全隐患之类的。 略繁琐,而像本问题则很合适就由 Excel 自带的公式来做,一行公式干净利落。 题外话 前面都是浮云,重点其实在这里,说这么多其实想说的是这样一句话: 做事情选对方法和工具很重要。 比如我周末看了优酷排行第一的蛙泳教学视频,然后有意识地调整了一下呼吸节奏与动作,前后对比如下: # 调整前 调整后 最远距离 1km 2km 50m 划水次数 33 26 呼吸 急促难持久 平稳易坚持 个人感觉 速度慢,累 速度一般,不怎么累 由此可见一斑。

    2015/12/02 Excel

  2. Vimscript 中的坑

    本文内容为学习 「笨方法学 Vimscript」 过程中,觉得 Vimscript 语法中与所掌握的其它语言的定义有明显区别,需要特别记忆的内容。 使用 == 进行字符串比较是否忽略大小写与用户的设置相关。 比如 "foo" == "FOO" 在 &ignorecase 为 1 时,结果为 True; 在 &ignorecase 为 0 时,结果为 False。 最佳实践:总是使用 ==? 与 ==# 来指定忽略还是不忽略大小写。 当字符串转换为整形时,以数字开头的字符串会转换为整数,非数字开头的将转换为 0。 比如 10.10 将被转换成 10。 没有作用域限制的函数名必须以大写字母开头。 传给函数的参数需要带作用域前缀才能使用。 function FunA(name) echom 'Your name is ' . a:name endfunction + 不能用来连接字符串,它们将被转换为整形然后相加。 比如 "1flower" + "1world" 的结果为 2。 所以有连接字符串需求使用连接符 . 吧!另外注意 10.1 . "hello" 会报错 using Float as a String,有这种需求的话建议写成 "" . 10.1 . "hello" 列表和字符串的切片操作代表的下标区间是 [m, n],而不是像 Python 那样是 [m, n)。 比如 ['a', 'b', 'c', 'd'][0:2] 在 Python 里结果将为 ['a', 'b']; 而在 Vimscript 里结果将为 ['a', 'b', 'c']。 如果一个 Vimscript 变量要引用一个函数,即它的类型为 Funcref,它就要以大写字母开头;引用函数的列表的命名不受此限制。 "let myFunc = function("len") let MyFunc = function("len") 如果像注释掉的那行那么写会报错 E704: Funcref variable name must start with a capital: myFunc

    2015/10/31 Vim

  3. 断网之后

    「壮哥,你那能上网吗?」 「不能。」 「窝,我去把路由重启一下。」 过了一会儿。 「壮哥,你那有下好的电影没?」 「没有,你那有吗?」 「也没有。」 这是出租房里的路由器坏掉之后,我在洗衣服的时候发生的两段简短的对话,然后我和室友就各自回屋了。 没网的周末,闲着也是闲着,洗完衣服洗被子,洗完被子刷鞋子,刷完鞋子打扫房间,整理书桌,然后翻开 RMBP,习惯性地打开浏览器,然后等待我的是这么个画面: 既然如此,那么干点啥吧,打开 OneNote 里的 Todo 页,挑了个拖了很久的任务做一下,高效地将一段困扰了好久的 Smali 翻译成了 Java 代码,后来感觉有点乏了,躲到被窝里点亮 KPW 去看前一阵同事推荐的《从清末到民国》。 等等等等……我不是天天自我标榜是个「拖延癌」患者吗?上面这完全不像啊,妥妥一个行动派生活家的状态啊! 那么,今天发生了什么事?思考片刻我就找到了最大的原因——没网。   有网 没网 做点啥呢? 看个视频先! 看会书吧~ 扫不扫地呢? 玩会儿再扫! 闲着也是闲着,扫吧! 整理下房间? Oh, no! 好滴! 看看这段代码? 玩会儿再看! 好滴! …… …… …… 以上就是我拍脑袋想了三秒就总结出的在有网与没网状态下思考问题方式的不同。 有网的时候,总也停不下来,不是在手机上刷朋友圈刷知乎刷微信就是在电脑上看视频看电影,当然也有搞学习写代码的时候,但是也容易被打断不太能长时间静下心来。 反观断网之后,生活节奏似乎一下子慢了下来,老觉得没时间做或者需要下好多次决心才能去做的事情也能轻松开始、从容不迫了,能安静地坐在这里看一段难懂的代码或者看一本闲书,不太会分心去刷社交网络了。 当然其实我并不是来讲互联网有多坏的,它的出现极大地方便和丰富了我们的生活,让获取知识、联络与交流变得更加容易,它正在深入地影响和改变社会的方方面面,颠覆我们的生活习惯,可如果对如此好的一个东西不善加利用,形成一些不好的习惯,那它对某个人也可能是毁掉充实度、幸福感和生活情趣的调皮鬼。 不要等到断网的时候才停下来去过生活家的生活,偶尔主动离线吧! 我想应该静下来想一些话 我想应该静下来走一段路 我想应该静下来看一本书 我只想静下来反省自己 我想应该静下来睡一个觉 我想应该静下来想一个人 我想静下来忘掉那些事情 我只想静下来反省自己 当一切都开始静下来的时候 静的可以让我听到平和安静的心跳 静的象云 静的象空气 静的我开始渐渐的适应 ——by 大乔小乔《静下来》

    2015/10/25 Blog

  4. Mac 遇到问题集锦

    在桌面和 Finder 底部出现的神秘白条是怎么回事,如何消除? 它可以拖动,可以拉伸改变形状,并不知道它属于哪个程序,一旦出现在 Finder 底部和桌面都会存在。 经过尝试,发现它出现的步骤是这样的: 在 Finder 中点击一下空白区域,然后使用中文输入法打字。 在文字还没有上屏时出切换到英文输入状态。 用鼠标点击空白区域。 目前试验了「搜狗五笔」和 Mac 自带的「五笔型」均是如此,看来应该是系统的 Bug。 消除方法:点击白条后 Esc。

    2015/10/25 Mac

  5. 爱你就像爱生命

    这是一本书的名字,书里记录着王小波与李银河的爱情。 最初对王小波感觉亲切,也许只因他是半个同行;后来读过几本他的书之后,逐渐淡忘了他程序员的一面,开始被他在那个时代背景下表现出来一切所吸引,然而却并不能准确地描述那具体是什么;在这本书里,李银河告诉了我答案:他是一位浪漫骑士,一位行吟诗人,一位自由思想者,吸引我的,也许正是他毕生追求的自由、平等和智慧,还有那不着痕迹的幽默感。 而正是这样一个人,在爱情里也是一个战战兢兢的少年,给爱人写信的时候除了偶尔蹦出「但愿我和你,是一支唱不完的歌」这样浪漫无比的诗句,更多的却也是平凡的絮絮叨叨,直白且语无伦次的「爱你啊」。 从你的《绿毛水怪》手稿被李银河看到开始,她就隐隐觉得你们之间会发生点什么;而你在第一次和李银河单独相处的时候,一句「你看我怎么样?」,然后你们开始通信和交往了,浪漫,率情率性,胜却万千一见钟情的故事。 你最初也有着刚开始恋爱的人的傻气,「我爱你爱得要命,真的。你一希望我什么我就要发狂。」,「说吧,和我好吗?」,「也许我是个坏人,不过我只要你吻我一下就会变好呢」。 李银河也有过怕你的热情过去的时候,「你该用你的速度来带动我,用你的火来燃烧我,用你的欢快的浪花把我从死水潭里带走」,怕配不上爱人的时候,「我不会安静的,因为我是一个十分不安静的、过于敏感的、甚至有点儿神经质的灵魂」。 你们也曾经历过女方家人不同意的时候,然而一路坚持了下来,虽然也许并不像那些传世的爱情悲剧里那般艰险。 「不管我本人多么平庸,我总觉得我对你的爱很美」,「我不爱让别人知道我是怎么想的,不过我永远不怕对任何人承认我爱你」,这应该算得上是最动人的情话,倾注了真情才能说得出来吧。 「爱也许是神秘的想象力的发作」,都有过质疑爱情的存在和意义的时候吧,但是你们的沟通是那么顺畅,不同的见解最终也能被相互的阐述和理解化解掉。 最后你们变成了对方生命里的光明与幸福,「只会互相带来人生最宝贵的礼物」,「静下来想你,觉得一切都美好得不可思议」。 你们的爱情,平淡而且真实,没有好些其它人的故事里的那么婉转曲折,所以生活里你其实也是一个凡人啊,这平凡却并不能教你在我心目中的地位降低半分,而且还要嫉妒起一个平凡的你经历过的那二十年完美的爱情。 我喜欢鲜活的凡人,不爱那冰冷的圣贤。

    2015/09/02 Blog

  6. 你忙得踏实吗?

    所有生活的美学旨在抵抗一个字——忙。忙就是心灵死亡,不要再忙了——你就开始有生活的美学。 这是前不久在豆瓣看到的一句话,乍一看,挺有道理的,然后若有所思其实脑中啥也没想地点点头,在某一次低头之后不再抬起,继续看代码。这句话呢,也许混杂在记忆的角落跟朋友圈的鸡汤放在一起等待被时间风干去了。 直到前些天自察好像经常被手边的几件事催得喘不过气来,在一个卧听风吹雨的夜,躺下开始忧愁何时能自救摆脱这个状态的时候,这句话就又冒了出来。搜肠刮肚想了想带有「忙」和「闲」字的成语,竟然惊惶地发现似乎自小接触到的语言里这两个字其实是自带褒贬的: 「手忙脚乱」当然让人看不出一点生活的美学,「气定神闲」却能让人想起面对千万曹军谈笑自若的诸葛亮;「忙中有失」自然不是什么好事,而「闲庭信步」则可以教人脑补出巅峰时期从容干拔的麦迪…… 细想之下,忙倒也并不可怕,程序员对忙一般是不那么恐惧的,因为猿媛们知道,忙碌程度会随着项目的进度、产品的版本发布而起起伏伏,犹如一根高架电缆,总有夏天的松弛,冬天的紧绷,纵使要在闲暇时默默苦练内功,那时间和计划也在自己掌控之中。 可怕的是不知所谓的忙,这通常是没有明确的目的,却把自己置于一刻不得闲的境地,绵绵无绝期,但又仿佛一停下来,就会落于人后,就会在那消停的一段时间里,丢失了生活的意义。 大学毕业以后,我在制造业待过一年多,刚进车间实习那会儿,几个夜班下来干得手腕都抬不起来……那时候虽然每天下班都在群里跟小伙伴们玩笑说「我又活着回来了」,但其实心里还是踏实的——这样的日子又忙又累,可忙说明产量好,到手的工资自然就高,累有所值;身体的酸痛固然难熬,可看着屏幕上剩下的工作量,把那干完就是一个小的「尽头」,不难等到。 而在开始北漂之后,最该苦逼最该努力最应该活得充实的这几年里,来到北京首当其冲的一点感受就是身边优秀的人总是很多,学历高,聪明,关键的是,也都很勤奋。这应该是身处一线城市的显著特征之一,是压力,也是免费的鸡血——于是我也时时感觉到,应该努力,才能不掉队。 所以我也花了不少时间在学习,在小伙伴们学习的时候,在小伙伴们 Wow 的时候,在挤地铁上下班的路上……我甚至给自己定了一条规则,来鉴别某个时间段我是应该学习还是应该休闲娱乐:有人一起时好好玩,没人一起时好好学——当然貌似一直没有好好执行过,只是用它来说明我确实至少曾经计划过要忙着好好学习天天向上的。时间没有少花,成效却不如想象中的好,时至今日我也并不能特别自信地说我在哪个领域比同一起跑线的小伙伴懂得多多少,掌握得好多少。 究其原因,是有些时候会陷入「不知所谓的忙」之中,它有几个特征: 没有目的性。 比如学习编程语言,今天看到 Python,觉得做数据分析与网络请求好方便,赶紧学一下它的基本语法;明天看到科技新闻上鼓吹函数式编程,于是拿起 Lisp 的入门教程啃几天……最后学会了写多种语言的 Hello World,然而这并没有什么卵用。 相对更好的做法应该是以工作业务所涉及的技术范围为主,以个人兴趣为辅,集中精力往精深了学。能够在一个领域深入钻研是一种能力,基于此种能力上积累的经验能在你需要快速掌握另一门新技术时助你轻车熟路,相较之下,即使学会写所有 Lisp 方言的 Hello World,除了也许能成为吹牛的资本,并不能给你以后学习别的东西带来什么实质的帮助。 对于如何在一个领域深耕,可以看一看知乎盐系列之《深度学习的艺术》。 低效。 一整天不专注的工作,比不上一个小时注意力高度集中的产出。因为没有给自己安排专用于娱乐休闲的时间段,长时间低效的学习带来的收益有限,成就感的缺失会造成容易对学习感到疲劳和排斥,注意力更易分散,然后需要更长的时间去完成本该快速完成的学习任务,恶性循环。一个各方面条件都一般的人,如果想要脱颖而出,一个行之有效的途径就是让自己比别人更专注,更能死磕,可如果陷入这种恶性循环之中,专注力怕是要大打折扣。 对此,我们可以利用一些效率工具管理好自己的时间,有免打扰高度集中注意力时间段,有休闲娱乐段,有放空段,玩的时候完全放开,学习工作的时候全身心投入。 当然这可不是想要就能做到的,需要根据一些方法进行一段时间刻意的训练,可以参考戴维.艾伦的《尽管去做:无压工作的艺术》。 扯了这么多,「不知所谓的忙」与「有目的性高效踏实的忙」,也许仅仅一步之遥,视角和理解不同可能就归于不同的阵营了,能够随时自察状态,不断优化迭代,达到自我认可的充实自信的状态,那就是踏实的。 我有一个奢望,希望自己在这浮生忙碌的柴米油盐酱醋茶里,忙得踏实,偶尔能活出闲情逸致的琴棋书画诗酒花来。

    2015/07/23 Blog

  7. 定制 Fiddler 之按设备过滤请求

    需求 在开发/测试过程中有多台设备(PC/手机/模拟器)通过 Fiddler 代理上网时,如何方便地从满屏纷飞的 Session 中筛选出自己关心的那台设备的请求? 设想 通过 FiddlerScript 扩展,在 Session 的右键弹出菜单中添加一项,作为「查看所有设备请求」和「查看单个设备请求」的切换开关。 设计操作流程: 找到自己关心的设备发出的某一条请求,在它的右键弹出菜单里有我们添加的菜单项「开/关过滤单设备请求」。 点击该菜单项后: 若当前状态为「查看所有设备请求」,则切换为「查看单个设备请求」状态,该设备为此条请求的发送者,并清除当前已显示的所有不关心的设备的请求。 若当前状态为「查看单个设备请求」,则切换为「查看所有设备请求」状态。 实现 实现思路: 通过修改 CustomRules.js,在右键弹出菜单上添加一个菜单项来切换请求筛选状态。 每一条请求都带有 ClientIP,它在没有网络切换之类的情况发生时能较好地唯一标识一台设备。 筛选规则是将非来自该 ClientIP 的请求隐藏掉。 实现步骤: 打开 CustomRules.js。 启动Fiddler,依次选择菜单 Rules > Customize Rules… 在 OnBeforeRequest 前添加如下代码: // 是否过滤单设备请求标志 public static var gs_FilterDevice: boolean = false; // 显示请求的设备的 ClientIP public static var gs_FilterClientIP: String = null; static function IsUnMatchClientIP(oS:Session):Boolean { return (oS.m_clientIP != gs_FilterClientIP); } public static ContextAction("开/关过滤单设备请求") function ToggleDeviceFilter(oSessions: Fiddler.Session[]){ if (gs_FilterDevice) { gs_FilterDevice = false; return; } var oS: Session = FiddlerApplication.UI.GetFirstSelectedSession(); if (null == oS) return; if (!gs_FilterDevice) { gs_FilterDevice = true; } gs_FilterClientIP = oS.clientIP; // 删除当前已显示的非所关心设备的请求 FiddlerApplication.UI.actSelectSessionsMatchingCriteria(IsUnMatchClientIP); FiddlerApplication.UI.actRemoveSelectedSessions(); } 在 OnBeforeRequest 函数里添加如下代码,用于在「查看单个设备请求」状态时将不关心的设备产生的新请求隐藏: if (gs_FilterDevice && oSession.m_clientIP != gs_FilterClientIP) { oSession["ui-hide"] = "true"; } 最终效果如下图: 筛选前 筛选后 缺陷 当前做法有如下缺陷,尚未想到好办法解决: 菜单项并不能标明当前的状态,不知道筛选是开是关,这可以通过查看当前 Session 列表里是否有多种设备的请求来判断。 当设备有网络切换时,比如重启了路由或者离开又回到某 Wifi,ClientIP 可能发生了变化,需要关闭筛选后在设备以新的 ClientIP 产生的请求上右键再次开启筛选。 附注 我使用的完整最新的 CustomRules.js 文件我上传到了一个 Gist 里,详见:https://gist.github.com/mzlogin/3c5f9781c5bedff3fcfb,如果想直接使用可以复制脚本内容后放置到「我的文档/Fiddler 2/Scripts/CustomRules.js」,也可以在此目录下使用 git 抓取我的最新定制 js 文件。

    2015/07/08 Fiddler

  8. 为 Vim 添加 Smali 语法高亮和 Taglist 支持

    Smali 相当于 Dalvik 虚拟机的汇编语言,语法可以参考 Dalvik opcodes。 本文介绍的是如何使用 Vim + Ctags + Taglist(或 Tagbar) 来实现如下需求: 目录 Smali 语法高亮 跳转到定义 Taglist/Tagbar 支持 使用 Taglist 使用 Tagbar 后话 参考链接 最终效果图: 当然因为现在 Android 应用打包时都会做不同程度的混淆,最后配置完后在 Taglist 下看到的可能是一堆 a,b,c 之类的名字。:-P 我的最终配置托管在 GitHub 上可供参考:https://github.com/mzlogin/config-files。 以下内容假设读者已经配置好 Vim + Ctags + Taglist(或 Tagbar) 环境,掌握了安装 Vim 插件的方法。 Smali 语法高亮 方法: 安装 Vim 插件 https://github.com/mzlogin/vim-smali。 如果你也跟我一样使用方便的 Vundle 管理插件,那你只需要在你的 _vimrc 文件里添加 Plugin 'mzlogin/vim-smali',然后 so % 重新加载配置文件,再 :PluginInstall 即安装完成。 如果是手动安装插件,那么可以点击插件链接页面右下角的「Download ZIP」按钮下载插件文件然后安装。 跳转到定义 方法: 为 Ctags 添加 Smali 语言支持。 新建文件 ~/.ctags 并将如下内容复制进去: --langdef=smali --langmap=smali:.smali --regex-smali=/^\.field (public |private |protected )?(static )?(final )?(synthetic )?([^:]*):.*/\5/f,field/ --regex-smali=/^\.method (public |private |protected )?(static )?(final )?(varargs )?(bridge )?(synthetic )?(declared-synchronized )?(.*)\(.*/\8/m,method/ 打开 Smali 文件后使用 :!ctags -R . 生成 tags 文件,对解析到的变量和方法等就可以 Ctrl-] 跳转到定义了。 注:~ 是指用户目录,Linux 和 Mac OS X 用户应该都明白,Windows 用户可以在 Vim 下 :ec $HOME 查看该目录所在,比如 Win7 下是 C:\Users\用户名。 Windows 下无法直接新建以 「.」 开头的文件名,可以先新建一个 txt 文件,然后在命令行下 rename file.txt .ctags。 Taglist/Tagbar 支持 Taglist 和 Tagbar 是两个同类插件,任选其一即可,我以前使用 Taglist,最近切换到 Tagbar。 使用 Taglist 方法: 为 Taglist 添加 Smali 语言支持。 在 _vimrc 文件里添加一行即可: let g:tlist_smali_settings = "smali;f:field;m:method" 使用 Tagbar 方法: 为 Tagbar 添加 Smali 语言支持。 在 _vimrc 文件里添加如下内容即可: let g:tagbar_type_smali = { \ 'ctagstype' : 'smali', \ 'kinds' : [ \ 'f:field', \ 'm:method', \ ] \ } 到此,我们要实现的三个目标就已经完成了。 后话 对于实现 Taglist 支持这一步,我在网上搜索良久未找到有效解决方案,最后是打开 taglist.vim 文件,看到有如下代码段后才知道能这么做的,所以以后遇到问题找不到方法而有源码的时候,读它吧! 切换到 Tagbar 之后的解决方案与此类似。 " ... " php language let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' " python language let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' " ... " Skip files which are not supported by exuberant ctags " First check whether default settings for this filetype are available. " If it is not available, then check whether user specified settings are " available. If both are not available, then don't list the tags for this " filetype let var = 's:tlist_def_' . a:ftype . '_settings' if !exists(var) let var = 'g:tlist_' . a:ftype . '_settings' if !exists(var) return 1 endif endif " ... 当前解决方案 Ctags 只解析、Taglist/Tagbar 只显示了 field 和 method 两类 tag,我对此的原理不是很懂,但是猜想应该是上面 .ctags 文件里的 --regex-smali 里我们只告诉了 Ctags 如何解析这两种 tag,本来考虑后续有时间把 class 等更多内容做进来,但转念一想,一个 smali 文件里也就一个类,这种需求似乎不那么强烈,遂作罢。 参考链接 让Vim和Ctags支持smali语法 让tagbar支持markdown

    2015/06/23 Vim

  9. Win7 下部署 Discuz!

    需要在开发机上部署 Discuz!,结果在根据官方文档 Discuz! X 系统部署 操作时遇到了一些坑,有些是因为使用的组件版本不一样,有些是官方文档有谬误,所以在此将自己从零开始到部署成功的步骤记录下来,供备忘和参考。 操作系统环境 Win7 64 with sp1 目录 使用软件 详细步骤 安装 IIS 配置 PHP 配置 MySQL 检测环境是否准备好 安装 Zend Optimizer 部署 Discuz! 部署 phpMyAdmin(可选) 常用入口 让 Discuz! 局域网内可访问 使用软件 Discuz! X3.2 我们要部署的目的程序。 下载地址:http://www.discuz.net/thread-3570835-1-1.html 我选的 GBK 版本。 IIS 7.5 Web 服务器。 下载地址:可直接在系统设置里安装,无需下载。 如果使用 IIS 7 以下的版本,可能需要额外安装 FastCGI,下载地址 http://www.iis.net/expand/fastcgi。 PHP 5.4.42 因为 PHP 5.2.10 开始已经不再提供 php5isapi.dll,也即在 IIS 上只能使用 FastCGI 而能使用 ISAPI 方式了,所以选用 Non Thread Safe 版本。关于 PHP5 的 Non Thread Safe 与 Thread Safe 的区别参见 http://zhidao.baidu.com/question/2075132638027071628。 下载地址:http://windows.php.net/download/#php-5.4-nts-VC9-x86 MySQL 5.5.44 数据库。我选用的 winx64 版本。 下载地址:http://dev.mysql.com/downloads/mysql/5.5.html#downloads Zend Optimizer 用于提高 PHP 应用程序的执行速度。详见搜狗百科 http://baike.sogou.com/v7557079.htm。 下载地址:http://211.162.54.70/dl.softmgr.qq.com/original/System/ZendOptimizerwindows.exe phpMyAdmin 4.4.9 (可选) 用于可视化管理 MySQL 数据库。 下载地址:http://www.phpmyadmin.net/home_page/downloads.php 详细步骤 安装 IIS 打开「控制面板」–「程序」–「打开或关闭 Windows 功能」,勾选「Internet 信息服务」,确认「万维网服务」–「应用程序开发功能」–「CGI」是勾选状态,然后点「确定」安装。 配置 PHP 解压前面下载的 PHP 的 zip 包,放在合适的地方。 比如我放在 D:\discuz\PHP。 修改 php.ini。 将 D:\discuz\PHP 文件夹内的 php.ini-development 拷贝一份为 php.ini,找到并修改下列内容如下: fastcgi.impersonate = 1 cgi.fix_pathinfo = 1 cgi.force_redirect = 0 cgi.rfc2616_headers = 1 extension_dir = “D:\discuz\PHP\ext” date.timezone = Asia/Shanghai 找到并打开以下模块的支持(删掉模块配置前的分号) php_gd2.dll php_mbstring.dll php_mysql.dll php_mysqli.dll php_openssl.dll php_sockets.dll php_xmlrpc.dll disable_functions disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server 据称 IIS 7 以下需要将 php.ini 复制到 C:\Windows\php.ini。 另外,官方文档上显示的需要找开的模块比上面列出的多,但是在配置文件里并没有找到。 添加 FastCGI 模块映射。 打开「控制面板」–「系统和安全」–「管理工具」–「Internet 信息服务(IIS)管理器」–「处理程序映射」,点击右方的「添加模块映射」,填写如下并确认: 配置 MySQL 如果需要安装 MySQL,首先确认有没有 MySQL 的历史残留文件,C:\ProgramData\MySQL 目录如果存在,删除之。不然 MySQL 的安装有可能总是在最后一步失败,提示 error Nr. 1045 和 Access denied for user 'root'@localhost'(using password:No) 之类的问题。 安装 MySQL 运行前面下载的 MySQL 安装程序安装到 D:\discuz\MySQL 目录下,安装过程如下(没有贴图的部分保持默认就好): 选择 Custom 自定义安装。 更改安装路径。 选择 MySQL 运行模式:Server Machine。 选择 MySQL 数据库默认存储方式:Non-Trans Only (MYISAM)。 设定 MySQL 的最大连接数,一般设置为 128 - 512 之间的整数。 设定网络参数,注意:勾消掉「Enable Strict Mode」。而「Add firewall exception for this port」仅在需要外连 MySQL 的时候勾上。 设定默认字符集,我根据官方文档选择了 gbk。 将 Bin 目录添加到 PATH。 设置 root 用户密码,推荐设置复杂一点。 测试 MySQL 工作是否正常,在 CMD 运行 mysql -u root -p 输入密码后,若能顺利进入 MySQL 控制台,表示安装正常。一定要是输入密码后,不然使用以下命令重置 root 用户的密码。 mysqladmin -u root -p password 新的密码 更改 MySQL 数据库存放目录 在 CMD 运行 net stop mysql 若提示权限不足,请使用管理员权限的 CMD。将 MySQL 服务成功停止后,找到 D:\discuz\MySQL\my.ini,将 datadir 修改为你想要放置数据库文件的地方,比如: datadir="D:/discuz/Database" (当然据说最好应该是把数据库文件和程序不放在同一个地方。) 将 C:\ProgramData\MySQL\MySQL Server 5.5\data 下的内容复制到 D:\discuz\Database 里,然后删掉 C:\ProgramData\MySQL。 重新启动 MySQL 服务看是否正常工作。 net start mysql 配置 LibMySQL 将 D:\Discuz\MySQL\lib\libmysql.dll 复制到 C:\Windows\System32 目录下。 检测环境是否准备好 在「Internet 信息服务(IIS)管理器」中右击「网站」,选「添加网站」: 然后在新建的网站的「默认文档」里添加 index.php。 在 D:\discuz\wwwroot 下新建 phpinfo.php 文件内容如下: <?php phpinfo(); ?> 打开浏览器访问 http://localhost/phpinfo.php,如果能显示如下网页表示环境已经准备就绪。 安装 Zend Optimizer 运行 Zend Optimizer 的安装包,安装到 D:\discuz\Zend,安装过程中需要指定你配置的 php.ini 的目标位置为 D:\discuz\PHP,指定 IIS 网站根目录位置为 D:\discuz\wwwroot。 安装时会重启 IIS 服务。 部署 Discuz! 将前面下载的 Discuz! 包解压,把 upload 文件夹里的内容复制到 D:\discuz\wwwroot下,当然你也可以新建子目录来放置。 然后在浏览器里访问 http://localhost/install,按提示进行安装,除了需要填上你的 MySQL 管理员密码和设置 Discuz! 管理员密码外,其它保持默认就行了,分分钟自动给部署好。 安装完成后直接访问 http://localhost 就能看到熟悉的界面了: 配置确认 打开 D:\discuz\wwwroot\config\config_global.php 确认数据库密码正确: $_config['db']['1']['dbpw'] = '你的数据库密码'; 打开 D:\discuz\wwwroot\config\config_ucenter.php 确认数据库密码正确: define('UC_DBPW', '你的数据库密码'); 打开 D:\discuz\wwwroot\uc_server\data\config.inc.php 确认数据库密码正确: define('UC_DBPW', '你的数据库密码'); 部署 phpMyAdmin(可选) 将下载的 phpMyAdmin 文件解压到 D:\discuz\wwwroot\phpmyadmin 下,将 config.sample.inc.php 更名为 config.inc.php,找到 blowfish_secret 并为它设置一个值,比如: $cfg['blowfish_secret'] = 'hello'; 打开 http://localhost/phpmyadmin 用你的 MySQL 管理员账户密码登录就行了。 常用入口 打开论坛 http://localhost 论坛管理 http://localhost/admin.php 查看数据库 http://localhost/phpmyadmin 打开UCenter http://localhost/uc_server 让 Discuz! 局域网内可访问 完成如上步骤后,在局域网内使用 http://ip:port 并不能访问我们装好的 Discuz!,完成这个需要两个步骤: 在防火墙添加 80 端口入站规则 打开「控制面板」–「系统和安全」–「Windows 防火墙」–「高级设置」,(若之前没有启动防火墙的请先开启)。 此时实际上是打开了「高级安全 Windows 防火墙」,右键「入站规则」,选择「新建规则」,规则类型选「端口」,协议和端口选择「TCP」和「特定本地端口:80」,操作选择「允许连接」,配置文件保持默认的全部勾选,然后取个名称后保存即可。 为网站添加本机 IP 绑定

    2015/06/14 PHP

  10. 去看特立独行的猪

    2015 年 6 月 6 日,雷雨降兮,待初霁,去看你,满腿泥泞,天空却如洗。 我此时还远算不得王小波门下走狗,最简单的例证就是墓前总是烟酒不断,而我却只带了一本《沉默的大多数》,还是在 Kindle 里。 我对他的了解其实很有限,书翻过几本,从没读完过;最早知道有这么个人是因为大学有个老师的 QQ 昵称叫「沉默的大多数」;后来在朋友圈里流传他其实是以作家身份为幌子的中国第一代程序员云云,顿时感觉异常亲切了起来。然而这样的交情就要来看看他,要是早些时候,我这样的人在某迅笔下估计也就是一名爱看热闹的围观群众。不过墓主人对此应该是毫不在意的,这个我倒挺有把握。 其实想去看看这个墓的缘起,在于从简书的一篇文章里读到一段话: 年少的我有一个心结,那便是惧怕活得放肆的人,因自己的日子太过苍白。无故事可讲的我,怕被这些过得声色十足的生活家取笑了去。 俨然当年的我。 在三年前,我还跟自己说,「如果那些谨慎并无用处,我愿意旁若无人地活着」。 一年多以前,我还在劝解想变外向的内向朋友们,「心底安静,世界就不令人拘谨」。 如今当然是有了些变化,现在我常说的是「不要在意这些细节」,而对生活家的态度也由惧怕变成了羡慕,还暗自养成了一套方法去涂涂抹抹日子的苍白。脸皮倒是依然有些时候薄得紧,曾经在大学英语课上表演过的窘起来瞬间脸红到耳朵根的技能怕是要伴我更久了。 虽然已经历过这许多变化,回头看看自己走过的路,分明还是特立独行的人的对立版本,循规蹈矩,个性全无,所以特别想去结识一位那样的人物,去探知他心里是否常常洋溢着我想象中的那种幸福。 这时突然想到昌平就住着一位呢,他相信和追求自由与尊严,而且绝不会在你耳边啰嗦,想了解他曾经想过些什么,只需抽空看看他的书,便可知何谓《一只特立独行的猪》。 想贴两张图编得这么辛苦,我猜应该会先被人骂是一只花样作死矫情晚睡的猪。

    2015/06/12 Blog