超凡魔力

君子善思,善假于物,而不物于物。

0%

nginx的配置

nginx的http配置,内部的一个server代表一个虚拟主机。配置server下的listen 80 git.chaofml.cn是错误的。

配置虚拟主机

假设自己在一个服务器上安装了多个网络服务。如网站、git服务器等。网站是默认与nginx搭配好的。但是本机又增加了一个0.0.0.0:8282服务。对conf/文件夹下的nginx.conf增加如下设置:

server
    {
        listen 80 ;
        server_name git.chaofml.cn;
        location / {
            proxy_pass http://127.0.0.1:8282;
        }
    }

常用命令

nginx -t

测试配置是否正确。 上面更改了配置,需要先测试一下,检查配置是否正确。

nginx -s reload

重新载入配置文件

nginx -s reopen

重启 Nginx

nginx -s stop

停止 Nginx

nginx的http配置,内部的一个server代表一个虚拟主机。配置server下的listen 80 git.chaofml.cn是错误的。

阅读全文 »

后端设计中的总结

总结

数据处理


数据处理,可以从来源到输出的方向,进行思考。主要分为以下几个流程。

  • 数据库进行处理。

    常见的,如增加一个字段,而此字段可以是常量,或经计算所得。进行排序等。

  • 后端语言进行处理。

    如果在数据库端处理,不太方便。可以使用在后端的php语言进行处理。常见的有,排序、增加额外的计算字段等。

  • 前端Ajax请求后,对数据进行处理。

    在Extjs框架下,数据load之后,可以使用fields字段的convert设置进行处理。此种方法,比较好,不会污染原有的变量。

  • 前端渲染到模板内处理。

    Extjs的columns设置renderer(v,metaAttr,record)函数。但是,请注意,如果此值不需要在后续再使用,可以这么干,如果此值还需要再使用,那么这样做,就污染了原有的变量。

加锁机制


对于一些竞争的资源,需要对数据库的访问,需要作为一个原子操作过程,进行加锁处理。

设置flag,标志


在一些常见前端的场合,可能增加flag进行处理。伪代码如下。

<script>
	var flag=0;
	//需要判断flag是否允许执行
	if(flag===1){
		{
			//系列的操作
		}
		//操作结束后,需要将标志复位
		flag=0;
	}
	
	//在其他地方,进行开启。
	/flag=1;
</script>

flag不一定总是0跟1。可以根据情况,为详细的id。一个例子是,之前设计的模板编辑器。flag为详细的操作id。还有,保存上次操作的模板。如果用户手动更换了模板,然后执行下一步的时候,清空数据,更换模板。

巧用if-return提前结束函数


我们知道,if如果嵌套比较深的话,理解起来非常的困难。如果是自己写的代码还好说,如果是别人写的代码。理解起来,难度确实较大。在这个时候,可以利用

if(条件不符合)
	return 错误值; 

来提前结束掉函数。有多个这样的if-return,将原有的嵌套if变成了线性的if了。理解起来,难度会小很多。

深入理解if

  • if的嵌套
  • if的条件组合

if的条件其实相当于切片一样(概率论也有)。条件是否是同一方面,如果是同一方面的话,是否能用数组组合。

<?php
	$roleId=4;
	if(in_array($roleId,array(1,2))){
		//对于特殊的角色id进行处理
		dosomething();
	}

另外如果条件是值同一方面,有的时候else不要省略,这样来减少无效的判断。如下:

<?php
	if(条件1){
		echo '小屁孩';
	}
	if(条件2){
		echo 'xxxxxx';
	}
	

像上面,及时从逻辑上判断,如果条件1成立了,条件2根本就不会再成立,也要加上else。这样能减少判断。有的时候,if-elseif 没有else。这也是有的。

深入理解循环


循环其实是常见的语法。必须深入理解循环。for(起始条件;终止条件;步进)这个是常用的循环结构。有些语言有高级的抽象。比如Ext.Array.each(list,function(){//代码;})等。

深入理解循环下面,数组的遍历

会议预约系统中的思考


做会议预约系统,在没有经过深入的思考,就开始编码。在实际过程中,确实遇到不少问题。这种脚踩西瓜皮,滑到哪算哪的方式,并不是一种好的设计方式。在产品成形之后,再根据用户的临时需求,临时的增加一些功能,修改逻辑,确实不是一种好的设计。

比如,最终的权限设计。本来好好的ACL权限设计,其实倒也没有什么问题。但是,运用在产品上,感觉非常的不规范,没有经过系统的设计,临时需要什么权限,临时加权限。需要屏蔽权限,临时的更改代码。其实这些权限的功能,理论上应该在后台的数据库里面进行统一管理,而不是采用更改代码的方式,去满足用户的设计。

一套系统,要上线三个客户端,而三个客户端,要维护三个前端的代码、三个后台的代码,除了个别的模块代码,共用了部分后台代码。虽然完成了用户功能,后台、手机端这种分离的代码,不能很好的形成统一的管理。更不要说后期的代码维护。基本上每个模块都是独立的设计,公用的操作,没有独立出来,而且又没有代码生成器。代码风格确实有点不统一。(如:json返回值code的表示,有的人习惯用0表示没有错误,而有的人喜欢用1。其实个人感觉,应该用0来表示没有错误。因为没有错误只有一种可能。失败,却有很多可能。)

后台的php代码,没有设计一些必要的全局变量。如根目录、调试模式等。没有设置放置运行过程中的临时变量。

虽然后台没有很大的访问题量,但是在一些不常更改的地方,应该考虑使用缓存系统。比如,部门结构,这种递归嵌套循环,是很耗时的,而部门往往是最不经常变化的,应该采用缓存。

系统,没有按照正规的模式,设计模型类,全部是静态类的方式调用。这种方式,其实只是利用了静态类的简单包装功能。并没有深入的面向对象的设计过程。其实框架提供了很多有用的功能,并不需要人为去手动添加的。合理的使用功能。如数据验证、简单的数据查询功能等。这些完全不需要手动去写。只需要new 模型的实例,或者像ThinkPHP中的那样,用D、M函数来自动生成。简化功能。

最终这个系统,就是简单的使用了$db->query的功能,连fetchCol等函数,这些框架本身能完成的功能,还需要手动编码。无疑增加了代码量。另外,手机端的会议预约系统,独立的小函数确实多,但是基本上,也没有办法复用。而且阅读代码的时候,由于函数调用的层次过多,其实并不有利于把握整体的代码。

顺便说一句,产品越着急,其实越不适合培养新人。勉强的培养出来一个,其缺少必要的知识,成长的慢。而且需要花费大量的精力。确实得不偿失。

问题总结


  • 数据验证问题

    数据删除时,应有相应的删除依赖。

  • 登录问题

    检测用户是否登录。按一般的web设计,如果用户没有登录成功。应该让用户跳转到用户登录。但是,后台却是采用了10秒轮询的方式。定期从后台访问session是否登录。如果没有登录,ajax请求到没有登录,直接跳到登录界面。
    关于这个设计,其实在code里面统一设计,如果返回某一错误码,并返回操作的附加值,让其跳转到指定的页面。针对一些需要显示内容的页面,也应该设置统一的显示界面。另外,也需要返回一些js代码,能让其动态的直接一些操作。让操作更具有灵活性。code指定了错误类型或者操作类型。

  • 数据删除依赖问题

    有些数据删除时,其实是有验证的依赖关系。这种设计,其实应该在最开始的时候,进行考虑。向这种检测,应该有个统一的功能进行负责。而不是侵入到代码。

  • 数据插入、修改时的唯一性验证问题

    其实这也是常见的功能。在数据入库之前,统一进行检测。检测的代码如:

    <?php
    	$sql='select * from table where id!=updateId and name!=name';
    	$msyql_query($sql)
    	//如果检测到资源,提前返回。
  • 操作日志

    操作日志侵入正常代码,比较厉害。其实应该统一到日志模块中。另外,这种操作日志,其实是有点丑陋。

    设计中的闪光点


最开始的时候,调用三方接口,是散布在正常的代码之中的。而且设计的是面向过程的函数调用方式。后来更改为静态类的设计。因为整个系统中的静态Utils类较多。在后来,其实有心想更换为单例模式,但是切换的代价太大,导致主观上不太想变更。而且,这个消息通知模块,功能设计的也不是特别的合理。尤其是,为所有的消息通知都写了一个特殊的方法。这是错误的。应该发送各个消息,其实过程是相通的,这个应该有一个集中处理的函数,将配置项读取,然后去调用。现在问题突出表现在:阅读难度大,增加一个发送消息,又要重复代码。(虽然发送了两类消息,其实这个也能抽象成一个。)

出现上述问题,最重要的还是,代码设计功底不强,抽象能力较差。重复做机械的操作。如果套上设计模式,可能会更好一些。这个值得以后去思考。

建议


机械的检测的代码,应设计成代码生成器的模式,或者抽象出可复用的。
代码应该独立成模块,而且相关的操作,应该放在一起。比如后台的会议预约系统,为了临时的快捷,将发布会议等功能,也放到此模块中。增加了代码的函数,不利于理解。
增加抽象能力。前端,针对一些常见的操作,应该进一步操作,如:ajax请求,消息提醒等。应该进行抽象。对于一些简单的模块,应该抽象出一个父类组件,子类只需要进行配置,即可使用。(将部分业务跟组件进行合并,进行继承。子类会很干净,整洁)

最近莫名的烦躁。感觉一切都不顺利。好像被整个世界忽略了一样。想发状态,却不知道要发什么样的状态。
(2018年12月31日手记,最近一段时间,确实过得挺郁闷的。各方面都不顺心。)

使用配置

根文件夹下面的_config.yml文件是全局的配置。设置如,部署文件deploy属性、站点的信息、主题等。另外一个配置文件是在主题下面。

但是现在遇到的问题,想设置一下网站的名称,用上了中文,结果出现了乱码问题。网上有说,配置保存成Utf-8形式的。也有说如如下配置的:

language: zh-CN

language: zh-Hans#不建议

反正以上均不奏效。懒得再折腾,以后再说吧。

另外,这篇文章保存了gbk结果文章都乱码了。

试过了重启服务、删除生成的文档、均还是乱码。搞不懂为啥了。

结果是,虽然另存了编码,但是保存成了md.txt文件。所以就不奏效咯。配置文件也是同样的问题。设置是对的。另外,语言的设置,影响到显示菜单的语音。其实可以参见主题下面的,language。zh-CN.yml文件代表的是中文菜单。

常用配置

  • 文章中设置显示摘要内容,在文章插入一行:
<!-- more -->
阅读全文 »

在github上使用hexo

安装过程,参照这篇文章,写的比较详细。安装比较顺利。之前在服务器也安装过hexo,不过从来没有更新过东西。(这里还有另外一篇文章])
介绍hexo的文章

阅读全文 »

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

$ hexo new "My New Post"

More info: Writing

Run server

$ hexo server

More info: Server

Generate static files

$ hexo generate

More info: Generating

Deploy to remote sites

$ hexo deploy

More info: Deployment

作为一个程序员,学习编程,到接触到多种多样的编程语言。其实,我也想知道编程语言是什么?下面说说自己关于编程语言的一些拙见吧。

各种语言

没有最好的语言,只有根据特定的场景,选择可是的语言,才是最佳之道。

每种语言都有自身的特点,或是用在特定的解决方案中,或是用在特点的环境中。脱离了语言的使用环境而去谈一种语言,确实不妥。比如,lua,由于自身解释器比较小巧,而且易嵌入到c语言中,所以呢,在嵌入式设备中使用的比较多。比如,路由器。试想,如果用java等语言,内存等各方便均不能使其流程跑起来。这就是lua的使用环境。比如,写网页,那么目前而言,只能选择javascript语言,别无二家。网站编程,那么php由于有丰富的类库,确实比较容易写。不需要安装太多的扩展、库,甚至直接连框架也不用,一样可以写出动态网页来。同样,java社区大、各类库、解决方法比较多,同样也适合服务企业级web开发。在大项目上,php可能略显不足。如果需要使用数据计算,由于python的panda等数学计算库积累很强大,所以,python非常适合这块。而且python自带电池,有很多库,也很方便将本地的计算用flask等暴露出api,供调用。

语言由于其主要的特性存在,往往使人们误以为只能用在这种场合。其实,抛弃那些限制,用于也能用在其他的方便。比如,javascript也能用在服务端编程,加上其特点,在配置低的服务器上,也能跑得欢快。php也能做业务处理的脚本。java也能开发ui。

javascript语言

主要特点:异步单线程、前端语言、跨平台。异步:其实主要是还是因为其是单线程的,如果在某个费时的代码处阻塞了,那么后续的代码就不能继续执行。表现在,网页会卡顿。

有人说,这个语言比较接近lisp语言。

静态词法分析,函数的作用域,在其定义位置中,决定。(怎么说比较顺口?)适合做闭包的语言。

学这个语言,我明白了异步编程的原理。另外,Ramda.js,明白柯里化的概念。高阶函数、装饰器等很容易同过这个知识点来掌握。

php

主要特点:后端渲染模板语言,天然的模板引擎,适合html嵌入脚本。对比,javascript,js主要运行在浏览器中进行解析,而php运行在服务器中进行解析。.php文件包含标签,而js不需要再包含。js也能运行在服务器中,因为node平台。(捂脸,暂时想不出来)。我目前主要的岗位语言。想起来了,php应该说是主要用来web服务应用的,所以,其本身具有天生的混合在普通文本的模板能力。当然,这个功能,其他编程语言,也能实现,比如python使用了jinjia等库,也能与普通的html进行混合编程。那么怎么看待php呢?比如,对比一下python,都是用c语言构建的虚拟机,然后解释器解释运行代码。python的中间代码为pyc,php中间代码为opcode。php除了构建web服务,也能做为脚本运行一些处理,也能通过一些扩展,做多进程、线程的处理。php的swoole框架,php的高并发、异步扩展(不是框架)。

visualBasic

主要特点:解释执行,事件机制。我上大学,学得第一门编程语言。后来也自学过c++等。

java

资源很丰富。其实也是一种解释执行的语言。但是由于其字节码进行了优化过,效率也不错。据说go也java性能差不多。

后端开发王者,非常适合开发大型的后端应用。后端框架主要有,ssh、ssm、sprintboot等。

完全的面向对象编程。所有的函数、变量都包含在类中。所以,没有全局变量的概念。但是,可但是,方法类的static、类中的static成员变量都可以作为全局变量的容器。

c

c语言确实应该算是王者。它是很多语言实现的底层。比如:php、python等。跟它并列的,还有c++、rust。它们都能算是系统级的开发。

我曾经很好奇,c语言为什么能做系统级的开发?为啥能成为别的语言的虚拟机实现语言?

我也很烦,为什么c语言这么麻烦。用个数组,提前申明就算了,但是,为啥要我申请的时候,还要指定大小?字符串操作,还需要自己来操作,内部居然没有字符串这样的类型,而只有一个低层的char数组类型。

后来,我明白了,c语言,正是因为这写看似很麻烦的地方,需要手动指定,(如手动档车一样),需要自己来控制,来实现。所以,给操作带来了很大的操作空间。

记得有类似的话,抽象程度越高,在高级的抽象中,会丢失底层的细腻的控制能力。

我没有认真学过,上大学的时候学《网络技术》考试的时候,看过一点的。上手难度并是很大,难点在指针等内容。现在,我真想说,这个语言确实很强大,系统开发、其他语言的虚拟机多数都是该语言实现的。我需要找个时间认真学习一下这个语言。其实,C能做什么,确实我也不知道。如果用来写界面的程序,确实,它能做,但是感觉并不擅长。系统有很多的api都是有c搞定。php解释器,都是由c。其实说白了,用C来开发,确实很费脑子,在此基础上进一步抽象,在内存管理等方面,语法特点等,生成特定的语言。即基于C,进一步抽象,变成高级语言。

c可接近低层,一可以往高级方面发展。

c语言的指针问题,比如函数不能返回指向局部变量的指针。为什么呢?因为函数执行完毕后,局部变量将被释放,所以不能再指向该地址。同过此联想,js里面,经常返回局部复杂变量,而这些变量通常是引用的形式。所以,导致函数的调用堆栈(暂且这样称呼吧)还保持着。

C++

在c的基础上增加了类机制,类还有友元、虚类等概念,确实让类编程难度很大。依然使用指针等,所以程序员手动释放内存空间等。

lisp

神语言,此语言看似很低级,实则很高级。如果想写新语言,lisp确实适合搞搞。

python

2021-01-22 11:31

最近几天,又开始用上python的爬虫,才发现,python并不支持static关键字,对于类而言,取而代之的是,@staticmethod。之类的。

没有深入探索,python是否支持静态变量、静态方法之类的。但是,我想,静态方法、静态变量,无非,就是全局变量、全局方法,只不过添加了一些作用域限制,本质上,感觉差不多。

语言特点

异步、事件

代表语言js。线程不会阻塞在io等耗时操作上,对于高并发,能在一个线程里面,处理多个客户端任务。由于是异步的,所以一个任务完成了,需要通过事件模式来通知。另外,python也有一些库,也能完成异步,( async / await 做异步编程)。另外javascript,是单线程的。

编程特点

回调,一个事件完成之后,回调函数,进而将流程转给其他的代码。关键字常有await、async。对象,promise。

缺点

异步编程,跟正常顺序执行的代码思维略有区别,理解难度大一些。异步通过消息机制,能避免回调地狱,但是任不简单。

协程

代表语言go。go语言语法里面本身支持 go chan等关键字,本身很适合做高并发。协程特点,创建协程比线程、进程等节省资源,所以适合高并发。

缺点

暂无。

解释性语言

多被称为脚本语言。如python、php、lua、ruby、basic等一大批语言。特点,变量使用前不需要申明,直接拿来用就好,而且也不需要制定类型,变量能存放多种类型。由于是解释执行的,并为编译到特点平台的机器码。所以呢,跨平台很好。只要在该平台实现了解释器,就能执行。但是,性能有折损。毕竟,运行的时候,需要先解释。另外的特点,脚本语言,代码一般更容易理解,上手难度小,开发周期较快。但是,由于缺乏类型的支持,开发期一些bug无法通过编译器找出来,代码提示不够好。所以呢,php7中增加了类型的支持、js有语法变体typescript。说明了,类型在脚本语言中也变得重要了。

闭包

js、php等都有这个概念。闭包的基础是,在一个函数内,能直接返回一个函数指针。那么返回的这个函数指针,其作用域能享受到其定义的位置的外层函数内的作用域。所以,就能闭包。而php,需要use关键子来显示的需要指定用到的外层变量。

作用域特点

这个其实算不上特点。

全局变量

每种语言的全局变量、及用法都不一样。

有些语言,函数内的变量,如果不申明,则会往外层变量上找。比如c、js等。在js编程中,我常会加上var来防止变量泄漏。

而另一些语言,比如python、php。如果不申明,则自动创建该局部变量。如果确实要使用该全局变量,那么,需要使用global来申明。

但是,函数是可以嵌套定义的。如果定义在外部函数的内部函数,需要访问外部函数内的变量,如何访问呢?js,不存在这个问题,因为其本身,就是层层往外找的,而c语言,也不存在这个问题,因为其不能层层定义,而php呢,它用了一个关键字use,需要用户手动的指明,用到哪写变量,而global在这个时候,是没法用到的,因为其只能指明,引用的是全局变量,而局部变量不在其管辖范围之内。python呢?

静态static

很多语言都支持static关键字。从生命周期看,它像全局变量一样,随着程序的启动,而建立,直到程序退出。但是从作用域上看,其又有点,局部变量的特点。静态变量,被限制在特定的函数内。静态方法,只不过是作用域被限制的类上。

所以呢,我突发奇想,将函数内的静态变量返回,然后,作为全局变量来使用。

怎样快速掌握一门语言

多用、多用。各种特性,都试试,多掌握细节,不能浮在表面。