2020-10
10

当年,为什么

By xrspook @ 10:20:34 归类于: 烂日记

不知道从哪里看来这么一个评价,中国的程序员在实用技术上的开发是一流的,但美国的程序员在基础理论上的研究生一流的。可能原话不是这么表述,但大概是这么个意思吧。我也是一个专注于使用技术上的人。我没有一个确切精通的东西,但要做到精通某个东西其实已经是一个很高的境界了,显然起码暂时来说我不是那种人。我会偏向于用某些思路去解决问题,但当某些思路是在不能解决某些问题的时候我的脑洞会再次打开,慢慢地转移到别的地方去,之所以有这种转变,是因为我发现别的东西在解决某个问题的时候更加靠谱好使。所以,总的来说我并不局限于只用某个工具解决问题。

大学的时候我不知道为什么我们要学C语言而不学习其它编程语言。大概理工科的学生都要学习编程语言这种东西吧,不知道学设计的要不要呢?反正农学和经管的好像不用。至今我都不知道为什么非得在我们的大学课程里安排这么一个必修课。学计算机的学生也必须学C语言吗?还是说他们学的是其它?又或者他么是在学了C语言以后再学其它?为什么我搞不懂必须学C语言最根本的在于C语言必须在DOS下执行,还得先编译再运行。除了在软件里写码以外,我最经常用的写码工具是Windows自带最传统的记事本,要不干脆不在电脑上写,直接在草稿纸上写。如果当时已经流行像VSCode那样的编辑器,大概我就不用走那么多弯路了。编辑器能够提醒你语法有否出错,即便语法不错,程序能不能运行最根本的是整体的思路。跟python比起来,C语言的语法更为严谨,之前没有声明过的东西不能用,花括号这种东西必不可少。后来我明白到大概当年要求我们必须学习C语言不是要我们真的懂得用那个东西搞出些什么,而是让我们对编程思维这种东西有所了解。因为是在DOS这种环境下运行,学习的时候就自然不会带入太多额外的脑洞,让东西写着写着就跑偏到别的事情上。如果当年学习的是python,大概我的很多同学就不会觉得编程语言除了用来应付考试就一无是处了。编程能快准狠地解决我们平时遇到的很多问题,但体会到这个又是过了好多年后的事了。话说回来,如果一开始就让我们知道那么多,是不是好事呢?

有时我挺庆幸我读书的时候网络远没有现在发达,起码智能手机还没有。没有随手拿来的智能手机就不会有假期拍照和录小视频的作业,同时也没有每天限定多长时间得在某个app上完成某些作业的任务。对成年人来说,游戏是消遣,对孩子来说,手机app完成作业是学校作业的无限延伸。从前,离开学校就算解放了,但现在,因为有app的约束,哪里都是天眼的管辖范围。app上的数据家长在看,老师在看,虽然其实完全遵照那个去做实际上也不会太难,但哪个孩子没有叛逆心。手边没有智能设备,的确让我的从前少了很多照片和视频记录,但也正是因为从前的照片都在胶卷上,需要晒到相纸上,重新掏出实物让人更容易触摸到从前,岁月的颜色和味道都留在了那里。

我的人生让我有了我去选择的权利,而不只是成为别人想我成为的那个。

2020-09
19

我喜欢Excel

By xrspook @ 20:53:41 归类于: 烂日记

Excel的一般公式,我比较熟练,一些高级公式的叠加,我需要找教程套用,但起码我知道那是可以做到的。一般的数据透视表,是我一直以来用得相对来说最顺溜的东西,至于高级的数据透视表,也就是超级数据透视表我几乎不了解它的高级用法。在数据的筛选查询方面,之前我用的是公式,而近期,我知道了有Power Query这种神器。在这之前,我已经知道可以SQL语言查询。去年我开始系统学习了Excel VBA。这让我大大提升了某些工作的效率。当然这是非常有针对性的。对我来说,要开发一个VBA脚本需要好些时间,并不是一写就能用的那种类型,期间要经过不少修改。所以其实总的来说,对Excel的了解我还是比较全面的。

也正是因为有这样的经历,所以当我遇到某些综合性的问题的时候,当别人把目光主要集中在某个他们很熟悉的版块的时候,我会凭借我的直觉找问题,而不局限于他们觉得出问题的那个地方。比如在把SQL查询跟VBA结合的时候,别人会把精力放在SQL查询有没有写错上面。SQL有没有写错,其实我根本没看,对我来说那些东西太长了,看不懂,而且那个人写的VBA脚本缩进很有问题,看得我很郁闷,所以我就更加没有心情在那里琢磨。那既然能计算出一个正确答案,说明那个查询语句应该没什么问题。也正是因为写脚本的人的那堆东西格式比较混乱,所以我有理由怀疑那是拼凑起来的脚本,因为居然在脚本的开头连变量的定义都没有。为什么VBA里没有进行规范的变量定义,后面也居然可以照样使用呢?这让我有点惊讶,毕竟这是个VBA,不是python。C语言里,如果不先进性变量定义,后面根本用不了。在我记忆之中,VBA的变量在使用之前是需要先定义的。最终我发现是那个人的脚本之所以出错,是因为某些语句的套用搞错了,为什么他会把那个东西放在里?我觉得大概是因为他没有明白他一开始做的那个with是什么意思。但如果你问我为什么他把那堆东西套在里面会出错,而且是某些地方出错,不是全部出错,我回答不出来。理论上这种错误能在恰当的调试中体现出来,但实际上,VBA的调试句子我还用得不算很熟练。或者你会说,这是因为我的VBA学习还不够系统化,但我觉得我已经用了学习VBA最靠谱的那本书了。可以肯定的是,一些很基础的调试方式我还没掌握,如果我学会了那些东西,我可以大大提升我的调试效率,把错误定位得更精准。VBA脚本这种东西,我觉得最根本的是必须得理解。如果纯粹是各种套用,基础功能的确可以快速实现,但是当遇到的问题比较综合的时候,就会出现一些他们完全料想不到的状况。那种状况有可能与脚本本身的内容无关,与脚本的结构有关。

相对来说,Excel里我用得最弱的是高级公式的套用。如何用一个非常复杂的公式解决一些高端的问题是我一直以来都不大上心,或者说记得不够好的部分。非常复杂的公式,尤其是数组公式,虽然能解决一些神一般的问题,但问题是,其实那些公式需要耗费大量资源,所以在处理大数据的时候,非常有可能出状况。我是一个实用主义者,能做到某个功能,但是做起来的效率不高不好,我为什么要选择那种只是看上去很炫酷的方式呢?情况就像用VBA解决同一问题的时候,如果只是在工作表层面处理和先用内存数组处理再在工作表层面表达,效率千差万别。

Excel对我来说,除了要最终结果,过程也得追求高效和方便。

2020-08
14

垃圾评论,滚!

By xrspook @ 10:33:52 归类于: 烂日记

习惯了用python以后要我写php的代码,我各种不习惯。为什么变量前面要加个“$”?为什么要写“{}”这种东西?为什么居然可以乱七八糟不缩进?python估计是不用数组表示东西的,但实际上,在历遍的过程里有数组,而php这东西貌似不像python那样分列表和元组,字符串是肯定有的,字典可能也有,但这个我不确定。在计算某个东西长度的时候还得纠结到底我要分解到什么程度,我不就是要计算一下数组里元素有多少嘛。可能是我使用的方式不对,print_r的确把数组表达出来了,但一坨东西各种嵌套,你给我个缩进好不好,我都分不清谁是谁了。python里计算长度用len(),我已经用得很熟练很爽了,到php里变成了count(),如果数组里还有数组,也要算出长度还得加参数。不得不说,数组这个东西挺让我头痛。记得从前学C语言的时候我就挺烦数组这个东西,我感觉自己一直没学好。当我接触了python,让我明白到其实数组不就是那些东西,为什么就非得用索引号把他们定位表示呢?直接把数据按照数组的排列方式直接表达出来是可以,json就是这么玩的,那是一个混合长度的数组,同样的事情也可以发生在python的列表、字典和元组里。好像在C语言里数组的长度得一开始就设定好,现在看来,我觉得这样不好,因为有些东西的确是很难一开始就想清楚的,搞太小了,放不下,搞太大了浪费空间。学习各种编程语言让我明白到原来某些我觉得参不透的东西其实可能没必要一定用那种思路。

之所以要死磕php,因为我有点讨厌WordPress里的垃圾评论。虽然官方自带的Akismet插件已经免去了我很多烦恼,但还是会有些漏网之鱼,所以我的垃圾评论列表里总有东西,看着心烦。那些垃圾评论虽然不在前台显示,但是在导出数据里会看到,浪费我的空间。对付垃圾评论的方法有很多,插件大法是最适合小白使用的,WordPress自带的规则也能让评论不被摆上台面,但我想做到的是根本不让那些东西写入我的数据库,没有写入就不需要删除,不适合的东西直接滚,减轻数据库的负担。虽然呢,我的小网站向来没什么流量,不会负载超标之类,但每当网站很慢,发布个文章都等半天都开不完的时候我就会暗暗觉得是不是被垃圾评论拖累了。综上所述,所以我选择的垃圾评论对抗大法是“Akismet + 自定义代码”。Akismet这个东西是安装完WordPress以后自带的官方工具,启用、填API就好。自定义代码需要在WordPress模板的functions.php里加入一些东西。网上有很多教程,但哪个才最适合自己得自己试过才知道。评论里可控的参数可以参考comments.php。我的防垃圾评论自定义代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function refused_spam_comments($incoming_comment) { 	
	preg_match_all('/http/', $incoming_comment['comment_content'], $link); // 有两条或以上超链接的,滚!
	if(count($link[0])>1) {
		wp_die("垃圾评论!!!"); 		 
	}
	$ruattern = '/[А-я]+/u'; // 俄语的,滚!暂时我还没见过大批量日语、泰语、阿拉伯语的
	if(preg_match($ruattern, $incoming_comment['comment_content'])){
		wp_die( "垃圾评论!!!" );
	}
	$name = '/Henrylix/i'; // 中文广告
	if(preg_match($name, $incoming_comment['comment_author'])){
		wp_die( "垃圾评论!!!" );
	}
	$mail  = '/(jjgfqijpo)|(.ru)/i'; // 其它广告
	if(preg_match($mail, $incoming_comment['comment_author_email'])){
		wp_die( "垃圾评论!!!" );
	}
	return($incoming_comment);
} 
add_filter('preprocess_comment', 'refused_spam_comments');

WordPress自带的评论规则里有超链接超两条就自动不显示,自动落入待审核的垃圾评论,但这样我还得去清啊,直接不让进更好,貌似我没有在其它防垃圾评论代码里见过这条。很多教程里“wp_die”那里用的是“err”,我不知道其他人怎样,反正“wp_die”我用得挺好,前台后台都正常,但“err”前台后台都不行。有些人这样,有些人那样,是不是跟不同的WordPress版本有关呢?这个自定义代码只是暂时的,我还得根据垃圾评论继续调整,debug的过程永无止境。

我感觉会了代码,人生才算是有了主动权。

2020-08
13

喜欢VS Code

By xrspook @ 11:30:56 归类于: 烂日记

我感觉自己越发喜欢VS Code了,这个东西的确就是我想要的写码工具,如果早点认识它,从前我就不需要走那么多的网路了。用VS Code写过代码以后,我对它是一发不可收拾的喜欢,但我始终不习惯在暗黑界面码中文,毕竟写代码和码中文不一样,写代码的时候思路是自己的,但积木的类型是固定的,这就意味着写码的时候如果有Emmet会相当便捷快速不出错,但如果在写blog的时候,尤其不是写代码技术类的时候,Emmet会变得毫无用处。同样我不需要额外纠结的还有中文语法。写blog是很自由的事,试想一下满屏的各种颜色波浪线,侧面和下面还有各种数字圈圈那将多么的恼人,当然了,貌似VS Code还没有厉害到可以有中文语法自动检测这种功能,我估计英文可能已经有了,Office几百万年前就已经有的功能VS Code可能天生就内置了,即便没有,让你绝对想不到的插件也肯定能实现。Offcie有中文语法检查的功能,但那个东西,笑而不语就好,别当真。

写码为啥要VS Code呢?不仅仅是Emmet功能,写过的函数,设定过的变量往后再用的时候,敲几个字就能有提示,就更不用说,使用默认的系统函数时能马上显示出详细的函数说明。自己写的变量一个颜色,系统函数一个颜色,保存以后还能自动语法检查,妈妈再也不怕我会犯格式上的错误。但话说回来,格式不错,不代表代码就一定可以运行出你想要的效果。毕竟代码的核心仍然应该是你的思路。

我不知道为什么大家都说暗黑模式写码护眼,护不护眼我不知道,但我知道白色界面看五颜六色的高亮会刺眼,相对来说,背景主色调是深色就没有这种不和谐。是不是因为这样,所以一开始的电脑都是黑屏白字而不是反过来呢?因为他们完全可以把那个东西做成计算器那样白屏黑字。现在我的习惯挺奇怪,写码的时候我用黑屏,写blog或者写其它文章的时候用白屏。我感觉自己用白屏的时候字体大小得设定到起码是黑屏的1.5倍。

去年我第一次接触R语言,觉得那个东西实在太伟大了!今年年初我的计划是学习R语言,但结果Python捷足先登了。VS Code搭配Python那是爽得一逼的节奏,因为Python是很大路的程序语言,所以很多东西已经非常完备了,相对来说R语言小众一点。无论是官方自带适配的还是第三方插件都比较弱。我用过R语言写码,那个东西简直是太难写了!一大串东西写好,要修改其中的一些,还不能鼠标快速插入,只能用键盘光标移过去,实在太逆天!当时我用的不过是系统函数,很多参数的位置和写法都是固定的,无数次我运行失败都是因为我手贱敲错了。试想如果这放在VS Code,有自动的语法提醒纠正,这种烦恼根本不存在。同样比较烦人的写码还有Excel VBA。运行的时候他们会弹出一个代码告诉你出错了,代码到底什么意思呢?到底是哪里卡死了呢?他们明明都得出代码了,却不直接告诉你到底是什么意思,很多时候,运行卡住是因为我手贱把一些系统参数的名字写错了…… 又是参数名字写错!如果在VS Code,这种事情根本不会发生啊!

写代码的方法千万条,但能边写边提醒你不犯低级错误的通常都不是某个程序语言自带的编辑器……

2020-07
21

改进

By xrspook @ 9:18:56 归类于: 烂日记

当我把电子书的列表从800多KB改成几个以后,整个静态网站的生成速度就从之前的120秒降为20多秒。20多秒的生成速度跟生成markdown文件没什么区别了。准确来说,生成速度更快了,因为少了一个markdown转换的过程,我猜可能是这样吧。虽然我已经绕了一个大圈又重新做了一个判断,如果我直接从点点转换成静态网站,而不是先格式化为wordpress标准的XML格式,估计速度会更快,但可以肯定的是,如果那样的话,我还是得做不少的判断,因为点点的文件里面不同类型的核心内容是不一样的。其实最简单的方法,是我生成wordpress格式文件的时候把分类继续放在分类,不把博客的名字放在分类,不把分类作为其中一个标签,相对来说这样的改动是最简单的。其实现在我绕了一个圈再回去,也没麻烦多少,因为那个标签是第1个,而我的判断是,如果找到了某个标签,就马上停止循环,所以虽然每篇日志的标签有n个,但判断第1个以后就结束了。就循环来说,没耗多少时间,只是代码会显得又长又臭。

近段时间我一直在纠结如何把手动输入的字典搞得好看些。除了好看,也要容易维护。最明白的方式当然是自己写键值对,但是那么多的引号,那么多的冒号,那么多的逗号,想想都觉得好疯狂。最整齐最不容易出错的方式是一行一个,但那样的话,好像有点奢侈了。所以有时我也搞不懂自己,到底是想节省空间,还是维护容易。

昨天晚上,我纠结一个问题,如果某个单词被我用作变量,在字典里那个单词又是一个key,同时这个单词也是个文本。有没有某个函数能把某个变量只当作是某个名字的字符串呢?如果这样,我的某句话就可以写得很简洁。否则的话,当我调用函数的时候,我就要把这个单词写一遍,当作字符串再写一遍。或者你会说,我直接把这个变量等于这个字符串不就好了吗?显然,我之所以把那个单词当作变量,肯定是因为其内涵跟字符串不一样。所以我试试是不是自己挖了个坑给自己跳呢?我明明不应该把这两个东西命名成一样。

有些时候我会问一些很弱智的问题,明明我是知道的,但是一下子就是想不起来。归根到底,我觉得是我的基础还不够扎实。在完成了静态博客的部署以后。我还没想好我是继续把Think Python那本书从我中断的地方继续看下去,还是应该从头开始,复习一遍,加深印象,因为那些很基础的东西在用着用着的时候,我觉得自己已经忘光了。所以到用的时候,我又得翻箱倒柜。那些东西,我明明应该已经掌握的。

现在的静态网站转换,我是用很低端的字符串连接整出来的。有些字符串是一成不变的,有些字符串是变量。我就在变量的之前之后把静态字符串断开,储存在某个文件里。最后就像穿珠子一样,把动态和静态的东西连在一起,最终合成一个网页。实际上,这是一种模板的思路。接下来,我要利用python的模板引擎,把静态的东西写在模板里,把动态的东西放在某些参数中。这才是我的网页转化应有的方式,但我不确定,这样的转化效率会不会比我现在的低端做法还要低。对我来说,那是一个未知的世界,我非常想,立马通过实践得出答案。

人在求知的路上会越发明白到自己的无知。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress