远离底层

要为actools添加用户收藏功能。按照原来的开发方法的话,要完成这个功能大约是2~3天的时间,不过我并不急于开发出这个功能,而且受到以下事件的影响:

  • bilibili.us强势开张,证件齐全还提供rss,而acfun的管理现状让人担忧,不想随意地投入精力到里面;
  • 本地的开发和调试环境,包括eclipse PHP、LAMP等最近才配置好,在配置好之前,无法实现增量开发,导致开发动力下降;
  • 在思考OO的过程中不断产生疑问,对现有的代码感到不满,并花费了大量时间去修改;
  • 发现了一些奇怪的php语法(例如@和&),然后受到打击停滞不前;
  • 毫无压力,喜欢就做一下,不喜欢就玩一下。

于是一拖再拖。作为一个业余得不能再业余的web编程人士,我试图通过看别人的优秀设计来获得长进;我深知不可能看几篇速成就能成为经常鄙视别人和被人鄙视的砖家,不过我也不计划成为那样的人,去和别人争论效率啊思想啊什么的,只要能过自己心里认为过得去就行而目前的设计方法连自己都看不下去,所以才会有动力去研究,去思考。

目前的情况就是,我不敢轻易地从底层的东西开始写,而打算在一个足够开放的轻量级框架下拼凑他人写好的代码;拼凑不只是简单的c&p,我还是有把握拓展他人的代码使其和现有框架接合的,但总体来说,除了独特的功能例如fetch之外,通常的工作例如用户管理和一般的数据库操作,我都希望尽可能用别人的东西,因为,例如数据库查询,我只能想出『传递sql返回查询结果』这种级别的封装,从思想上就很难做到Active Record级别的考虑。

于是远离底层。

基于CI框架的ac娘工具

http://actools.tk/

终于完成了,基于CI框架的php版的ac娘工具,功能和原来的python版是一样的。

开发心得:

  1. php的array有一个好处:有各种各样的array操作函数。在查阅到这些函数的之前,我的大部分精力都花在研究如何处理数据结构上了。
  2. 写这个程序使我对MVC的认识加深了很多。在写search功能的时候其实还没有很好地区分开来,以至于代码非常的混乱;到了写fetch的时候就已经区分得很凌厉了,写出来的代码看着非常的自豪XD。
  3. 与python版相比,php版降低了查询数据库的次数(得益于array操作);不过在试图放在一个免费空间上运行的时候,似乎会由于SQL语句执行时间过长而无法运行fetch功能。发生这件事后,我修改了一个SQL语句,尽可能减少查询的规模。
  4. php的错误竟然不能直接try-catch,还要定义一个handler来将其抛出,不知道是出于什么考虑。像数组越界这样的错误,为什么只是给出Notice呢?我觉得足以使得整个程序crash了。

最终把ac娘工具也放在博客的空间了;原先为它准备的一个加拿大免费空间空闲出来了,弄成twitter站传教用好了。

.tk域名挺不错的,我搜了一下,有36w个中文站搜索结果,太可怕了,记得co.cc被人拿来钓网监钓得整个域名被封杀,希望.tk能够一直安然无恙。

果然还是要php化

heliohost又挂了,尽管对于免费空间我们不能够期待太多,不过放在上面的ac娘工具变得不稳定,而且域名又不美观,促使我考虑为它寻找绑定一个免费的二级域名,外加一个稳定点的免费空间。

在寻找的过程中,我惊讶地发现,原来heliohost确实很强大,支持python+mysqldb,这种程度的配置原来不是每个free host都支持的!我找到了vps-hosting.ca,打算搬过去的时候才发现,python cgi中居然没有MySQLdb模块。

于是我想,能运行当前的ac娘工具的环境真是少之又少,heliohost是一个很不错的新技术实验平台(估计因此而经常当掉)。无论如何,为了让它到处可用,继续我的CI化ac娘工具的计划。

推上有人介绍一个网站,可以加密字符串:http://fliptitle.com/

ac娘工具:数据库从sqlite移到mysql

想来想去,与其先把sqlite数据库搞下来、再找个奇怪的转换工具转为mysql再弄上去,还不如直接在远程服务器上弄,注意备份就是了。

于是赶紧写了个python去搞,参考了一些资料很快就写好了。由于先前很少接触mysql,所以很多设置例如引擎啊、字符编码啊都没设置好,后来在出现乱码、又发现不能按照事务方式执行的时候,才知道应该选InnoDB引擎,然后所有地方都设置成utf8。

mysql比起sqlite真的是好太多了:习惯了用access的我,一直都以为mysql啊mssql啊这种不能作为文件随便挪的数据库非常不方便,可是现在才发现,有phpmyadmin这种强大的存在的话,mysql比要写python脚本才能好好地访问、还要设计现实界面不然就只是显示出一堆难懂的数组的sqlite好用多了;而且在有cpanel的情况下,备份也比sqlite方便。最重要的是,sqlite还分2和3,而python用的是3、php的CI用的是2,移植相当麻烦,哎。

另外,我又开始犹豫到底要不要做php的ac娘工具了:用python做出来的程序感觉快很多,特别是换了mysql后更快了,这也许和python脚本的执行效率有关,毕竟py要755权限才能执行,而php只要644。作为别人的网站的辅助工具,其实能用就行吧。

移植的时候对数据结构进行了重新设计,充分利用了mysql的特殊数据类型:分类字段就用了enum代替smallint,date和time也用了标准的时间和日期格式,所以原来的python程序除了改变数据库接口和表名之外,还有很多地方要修改,总体来说整个程序又优化了一点,而且还有优化的余地;此外,对自动抓取数据的cron也进行了修改,通过sys.path.append的方式来实现自建库的复用(原先是将几个库的代码全部拷到同一个文件中用:这已经超越了面向过程的编程,达到了汇编语言式的编程了。豆知识:cron,Linux中的时钟守护作业,其中一个特点是从根目录开始执行程序,所以不能够简单地import程序同目录下的其它库)。

折腾到这个程度,相当有成就感。

php版ac娘工具的进展

目前对用户页面(搜索页、重定向页)已经完成,只要完成了最关键的update模块,再把原来sqlite的数据导过来,就可以放出去给人用了。

遇到的问题:

  1. CI架构的库和辅助函数是比较全面的,而且想着越来越通用的方向努力地发展着,可是我还是不得不打破了它的一些基础设定,例如search功能最终还是使用了CI不推荐的get方法;在做这个决定之前,我参考了许多大型应用,如豆瓣、google和百度,它们都是用get方法进行搜索,看来这个是无法避免的问题。
  2. 库和辅助函数的最佳载入点应该在哪里?我现在是需要的时候才载入,这样可以使得一个模块对其它模块的依赖性降低,但是整个程序变得挺难看的,东一块西一块。
  3. 对MVC架构将模型和视图分开的考虑还不够,数据查出来就直接放到view中使用了。
  4. 目前是将每个view的内容全部用echo命令输出,但事实上view应该写成html中嵌入php代码还是全部用echo好呢?尽管html模板的可读性更强,可是php程序的效率应该高一些;如果学习某种模板语言,也许像分页功能这种就又成为一个新问题了。
  5. 比起原来的python程序,php速度变慢了很多,暂时未知瓶颈在哪里。

博客搬运完了

剩下一些小修小改工作。

在搜索blogbus2wordpress的方法的过程中,我了解到许多人都是从blogbus搬到独立博客当中的;而我也是其中之一。blogbus确实有很多的优点:其可定制性已经可以媲美wordpress,不过毕竟还是处于某个大环境之下,很多东西都让人忌惮;至少,还是不得不担心说错话被跨省。

huky.org这个域名挺早就入手了,可是godaddy的nameserver竟然被墙了,这是何等的悲哀啊,这个域名就像一出生就无家可归的弃儿般可怜,而申请的一个免费空间又有许多奇怪的问题(免费的代价就是经常被人拿来当白老鼠XD)。现在处于考研前几天的关键期,本来不应该“搞搞震”的,不过无所谓了,twitter api也需要有一个相对稳定的空间来放置。

很早之前不知道是谁推荐了Hostours,支持cPanel(正好在免费空间里面实践过),支持支付宝(对我来说其实无所谓),关键是有很便宜的小型空间(和dreamhosts比=.=),如果一次买2年还能便宜,不过考虑到白名单的可能性就没有这样做。嘛,就算要挪窝,也只是拷拷数据库那么简单的事情而已。

这个博客,估计也不会有很多人关注,所以能用就行,关键是里区要能用。说来感觉挺奇怪的,在blogbus我已经连续几个月没有收到过任何评论了,人缘真的已经糟糕到这个程度了吗555。空间并没有显式地说明支持python,所以ac娘工具不打算挪过来(何况是自己写的程序,不知道会不会严重损耗资源),仍然放在免费空间好了。最近的目标是用php的CodeIgniter架构重写ac娘工具,如果搞定了的话会放过来也不一定,但肯定不会用相同的域名。

python会继续学习,不过是作为一个提供便利的脚本语言而不是php的替代方案。

无论如何,国外空间的愿望已经达成了。我还有很多很多的愿望,也许这辈子都实现不完,可是只要不浪费光阴的话就不后悔。

Alter to PHP and CI

As I went into django, I realized a problem that not all the webhosts support python, let alone django. So even if I build the whole perfect AcTool by django, I was not sure it would work when ported to the planing paid-host.

PHP must be available everywhere, so I think I should turn to PHP. There have been many PHP frameworks, I’d like to use a light-weigt and config-free one, and found CodeIgniter.

As a matter of fact, I’m not good at C-based scripts, one of which is PHP (I have ever put all my enthusiasm on ASP, but it’s been proved not worth investing in). But to spell over the PHP script isn’t difficult, so I’d like to try. I hope the CI framework can ease some of my work, since it’s well-designed.

Anyway, it’s better to read some articles about disadvantages of a develop tool before learning.

信息集装箱

[JSP]requese中文乱码解决方案

今天上课老师提到jsp中的GET变量传递时中文会变成乱码,这里提供一种解决方案:
String param = new String(request.getParameter(”param”).getBytes(”iso-8859-1″));
另外,强烈推荐用utf-8编码代替gb2312编码,这样可以避免更多的乱码问题,同时便于数据在不同的数据库之间的搬迁。

[PHP]日记本修好了

这两个星期,我把所有的空闲时间都用在修理自己的日记本上面,说白了就是把基于asp的日记本改造成基于php的,然后把IIS删掉,直到刚才总算是完工了。
改造完毕的日记本基本功能已经完备,但是耦合度还不是很好,通过对它的继续改造,将会更加深入地领会跨语言的面向对象思想。

[JAVA]一道国外的JAVA题目

这是一道很简单的Java题目而已,模拟剪子石头布的游戏,但是我感觉到题目的描述很形象地阐释了Java的OO思想。
想起那本Java2实用教程里面的题目,我还是有很大感触的,这里和大家分享一下~~ (more…)

“愤青”作品

关键词:PHP,MVC,模板,OO,……

注释:文章中的黑体字都是一个叫Diky的人无聊时标注上去的。

发信人: diogin (diogin),
板面: WebDev
标 题: 考,这番话真是爽透了!
发信站: 飘渺水云间 (Wed Jun 14 01:06:10 2006),站内信件

说明:虽然比较“愤青”,不过此人的确非常强悍,值得好好品味下他的话

模板不死,很难走进设计,看着一个一个初学的,老鸟的,死在这上面,悲哀阿。

网页的显示,DIV+CSS就足够了,结合PHP,循环/判断就OK了。

一个小看法,可以一眼就看出这guy是初学的,还是有段基础的:

初学的:很喜欢把html插入php代码中 print(”<a>”);
有基础的:把php插入html中
再进阶:发现已经不屑于在php文件中看到任何htm标签。
再再进阶:发现没有function裸体的在外面了,几乎被包含进类,如果你还认为function很好的设计,而且速度比class快,那我可以告诉你:这个fucking php的速度,就算是按照顺序写,一个function也没有,速度还是跟垃圾一样。在function和class的选择不是速度的问题,也不是更快完成任务的问题,这些问题都太小了,以至于不是问题了,是关系到你能否把能力再提高一个档次的问题。
再再再进阶:看看你的文件目录,是不是有add.php,delete.php,a.page.php,b.page.php。如果还是按照动作来命名的话,那还是很低档次的修养。多学学怎么高内聚,低耦合

目录/文件名起名也需要艺术的,比如这个fucking页面就是:post.php?action=…….discuz的技术就可窥一斑,太蹩脚了吧?哈?!能不能艺术点的来个/?action=post&……

技术的强是远远不够的,会分析/组织才是真正的强,一个code怎么写的发展空间在现在这个年代是在太小了。

… …也许到最后我们可以换成画代码,不是写代码了。那才是设计的艺术。

编码的艺术,排版的艺术。这两个基础功学好了,后面的路好走了,也不会踏入模板这个沼泽

其实我也不只是想针对模板这个,但是这个绊脚石实在太大了,对于php是在是个怪圈,当然对于我来说这个怪圈不存在,只是看不惯,也是心疼一些人不长进把。

模板,没有这个概念,之前应该是一些标签,用一堆数据来替换一个特定的标记,因为一堆数据,一次又一次的写实在麻烦,所以用了function来模块化, 用for,while循环来减少重复的劳动量。甚至与可以用递归不惜牺牲/空间/效率来简化。标签就是类似define之类的,定义宏而已。

这里的模板特指php的所谓php类,诸如smarty,phplib的template,好像pear雷库也有

之前我也是把,用过模板,幸好只是用用了,后来就写了一个模板类把,自作聪明的写了一个,然后每次就煞费心思的处理html页面,用php模板类不得不学会点自慰,在html处理模板标签之后,还要在php里面大量的梳理数据,来和html页面匹配起来。然后美其名曰美工什么的,还什么彻底分离了代码和设计,shit.

当然,我针对的是那些会采用dreamweaver或者其他的能编辑html/xhtml的,那些手写html并且引以为自豪的就不在之列,也不屑讨论这类。

学过C,就不得不佩服其灵活,而没听说过用c/c++来自己写另外一个自定义的for循环,制造标签就有,但是制造自己的解析还没听说,编译器不是那么容易制造的,不要太自作聪明了。

如果是以打乱了页面结构为理由,那么你是真的掌握了dreamweaver么?

但我实在不想在谈论这个问题,浪费时间。模板只是一个很小很小的部分。只是拿它来开刀比较爽,MVC的V在php交给include+html就可以了。你要做的只是M和C,而C是REQUEST的提取,所以大部分的精力就是在M方面。设计

如果不能接受别人的思想或者自己的错误,可以采用这样,说别人偏激来对付,或者有这样一句话:要打倒一个伟人,可以拿伟人和傻瓜比较下就可以。当然,我不是什么伟人。

另外一个题外话,你会CVS么?会设计么,了解重构么,会单元测试么?

看过大肠经,70集,看的我麻木了,内容什么忘记,有个场面都是很清楚:那个医官上课的第一句话就是:从今天开始,你们之前所学的都是垃圾!

其实还不明白我要表达的是什么?

是关乎自己的发展方向的,不是关乎一个模板,一个什么鸟项目。而像模板这样的东西就把你卡在这样一个低级的层次。

什么是低级,什么是高级,总是有这样的意见:看情况吧,也许你看是低级,他看是高级。马克思这鸟人还真是害人不浅阿?没能力把握方向就拿辩证出来挡下?什么叫做见风使舵?

说个笑话吧,认为模板能分离美工和程序的,很大部分是页面是别人做的,然后呼呼的跑过去告诉那个美工,这里有个变量“放”,他会被替换成“p”。

和直接把这个“p”给放出来,中间差价是什么?时间+精力+和。。。。一些要需要长久时间才能认识到的东西。

关于discuz,什么pwind。。。。我只能说他们会设计数据库。知道怎么组合可以达到比较优化的速度。对sql精通。

但对于代码设计来说,跟小P孩差不多。下面这行是Discuz的:global $db, $table_failedlogins, $onlineip, $timestamp;

莫非我们还真的需要还原到goto的设计去?好像php6有这个准备?听不懂没关系,可是要知道用了global,是代表什么。

至于为什么会有sql攻击的出现,这个问题可以从代码的写法看到,这段是logging.php的:

$query = $db->query(”SELECT m.uid AS discuz_uid, m.usernameAS discuz_user, m.password AS discuz_pw, m.adminid, m.groupid, m.credit,m.styleid AS styleidmem, m.lastvisit, m.lastpost, u.type as usertype, u.creditshigher, u.creditslower, u.allowinvisibleFROM $table_members m LEFT JOIN $table_usergroups u USING (groupid)WHERE username=’$username’ AND password=’$password’ AND secques=’$secques’”);

WHERE username=’$username’ AND password=’$password’变量是直接套进去了,不管前面做了什么防范。

@extract(daddslashes($_POST), EXTR_OVERWRITE);
@extract(daddslashes($_GET ), EXTR_OVERWRITE);

这样的写法跟设计的艺术相差N光年而已。

这样流程,一抓一把,透露点给你,看看printf这类在写代码的艺术表现,至于怎么写,自己学去。

至于phpwind,没看到代码,不评价。

另外,我可以更你讲解下基础的东西,等于号不是等于号,是赋值计算。所以呢,我们来看看discuz的一段取IP代码(commom.php):

if(getenv(’HTTP_CLIENT_IP’)){
$onlineip = getenv(’HTTP_CLIENT_IP’);
}
else if(getenv(’HTTP_X_FORWARDED_FOR’)){
list($onlineip) = explode(’,', getenv(’HTTP_X_FORWARDED_FOR’));
}else if(getenv(’REMOTE_ADDR’))
{
$onlineip = getenv(’REMOTE_ADDR’);
}else{
$onlineip = $_SERVER[’REMOTE_ADDR’];
}

判断的计算是在赋值计算之后的,也就是(A=B),先把B的数据复制给A,然后再扩大到()之外去进行。而这里明显没有判断的语句。so,这样写如何?

if($onlineip = getenv(’HTTP_CLIENT_IP’)){
}elseif(list($onlineip) = explode(’,', getenv(’HTTP_X_FORWARDED_FOR’))){
}elseif($onlineip = getenv(’REMOTE_ADDR’)){
}else{
$onlineip = $_SERVER[’REMOTE_ADDR’];
}

不服气我也没每办法。打击您对discuz 的崇拜了。

识货的BOSS不看证书的。一个人的php水平怎么样,绝对是聊一会就知道的,在内行人眼里,web技术是吹不出来的

这句话说说就可以,可以当真那个傻X打心眼这样认为(说傻X为引起注意而已),等哪天时间到了,别哭出来就可以。

程序当然是条件不变性和结果固定性,确定性。我不写人工智能。

oo不是区别在桌面或者web吧,一种思想在具体上能区别么?难道还能有符合中国特色的oo?或者最近oo出了3个代表了?

解释型,不驻留内存,这点不敢苟同,php同样可以在内存运行,至少我写了这么个,一个月了,还在内存中运行,只是没有线程控制,不得不sleep(1)一下,效果还是不错,没有被apache杀死。

只能是“增加可维护性,结构清晰”之类,愿听在桌面程序上oo还能体现出更多的什么?而在web上什么无法实现?

OO不谈实际的好处,内存的重复利用不是OO,思想/想法的重复利用才是。

恩。不谈具体的编码。据我所知道的。身边的那些从编码开始的,也曾极致的追求高效率,把指针,算法弄得翻天覆地的。也就成了高手了。也只是高手了而已。如今都毕业这么久了,我们不都还只是高手而已么?

几天前晚上,一个朋友说,大叔对他说,美工/程序员都是高级民工,我嗯了下。其实我知道他很想哭,实事就是这样,别人我可能会讨论一番,可是对他我不需要,1:他知道高级民工不是件好事。2:这家伙前途无量,不需要我废话。

而大部分时候,和别人在一起的时候,哪个敢起先讨论下这个编码/算法怎么实现最好,都会被我一杆给打回去:本人不感兴趣程序,对计算机极其厌恶!

凡是和电脑有关的,都觉得及其恶心,就算哪个女生再装可怜着说电脑系统又不行了。帮帮小妹吧。大部分也会被我打回去,没空,不如去吃顿饭,看场电影,然后我帮你找个民工来修修?

早在2年前,有很多人把我当偶像来看待了。可以说凡是有php存在的地方,就有我的偶像。没有大言不惭,哈哈。几何时喜欢和别人争论这个,争论哪个的。现在想想,正是可悲。很多时候要的是虚心学习,不是去炫耀那点小小的技巧,不过说回来,越是不会技巧的,他就越会去炫耀。

很多时候,跳不出高手的范围,只是你最高目标只是第二高手,那没什么好玩的。很多时候,都喜欢讨论,哪个女的胸大屁股小,哪个比较影响市容?最近那张专辑 出了,十一月的肖邦还算可以吧,孙燕子不行了,唉,王菲要是看上咱多好,很久没去电影院烧钱了,tmd的小日本,两个月前cd的菲典知道么,看来sony快没救了!去下酒吧吧……

那来论坛的是想学习吧,恩,那是一些技术还不怎么行的,或者技术比你高了,可是看到的范围不大。那,去哪学,说实在的书这么多,你怕没有学的么?你怕书上 的东西写的不如你在这里学的?国内的却是不怎的,国外经典的多的去,在这里谈论算法有哪些书来得深刻/经典?书看电子书好么?那我没话了。

1:你视力看来比我好。抵抗辐射能力强2:扫描出来的书比实际的书似乎差了那么些,而且很多时候你看到的是看到见摸不着的书,学到的大部分也这样3:很多还是消费者,钱确实是个问题。不过,书带来的和你花出的钱不是一个比例的,真正会学习的就清楚这个比例。

看书真的会成为高手么?如果你的目标定在高手,那你永远成不了高手。如果你的目标定在php,也只能在这里打转了。多看下高级的,比如C++,软件工程。。。。

看懂书了,就可以超过高手么?亿万富翁买的起法拉利么?我不知道。

总有一天你会讨厌编码的,我坚信这点。还有一个,在我面前喜欢说“不一定,具体问题具体分析”的人,我大概知道他们的层次去到哪里。

坚信了就会正确,青霉素之前,人们坚持放血是正确的,于是他们对病人一律放血。。。坚持就了就知道,不坚持,“不一定”永远也不知道。

拿放血来说明坚持的意义,我也不知道为什么,反正当放血死的人越来多的时候,他们就越来越走向正确。今天就没人敢放血治病了。

–※ 来源:•飘渺水云间 freecity.cn•[FROM: diogin]

终于把interface啃透了,趁着兴奋写点感受

关键词:接口,多重继承,接口继承,私有接口,构造器与初始化

这种东西不仅要看过和编过,还要知道究竟有什么用,才能够真正啃透。《Thinking in Java》果然是一本很有思想的书,每重看一次就有许多新的感受。

下一个要啃下来的就是内部类、潜套类和所谓的彻底隐藏具体实现。

上Java课的时候看了许多同学演示的他们自己的大程序,感触是,他们都很喜欢在上面放漂亮的图片的,另外,他们认为外观和功能都非常重要,而程序本身的结构往往是一笔带过——这里就不发表自己的看法了,怕板砖。

不知道我像现在这样不停深入研究Java的特性,将来能够有什么用,也许学管理的人都很注重实用性,而我的确不适合学管理吧。但我始终认为,没有对那些特性的理解,还是很难说掌握一门编程语言的;而且对于Java这种注重结构或者模式的语言来说,如果要把它与现实的管理体系结合来开发信息系统,恐怕需要了解很多特性。

diogin@88师兄近来在探讨php下的MVC,我想,要不花点时间去看看php吧,总比困死在asp中要好,而jsp又是那么的遥远……

注:以上并不能算是我的心得体会,充其量只能是我用来安慰自己处于奇特的学习动机中的话语而已。