Batch Scripting Help

Open command line and input help.

C:\Program Files\Oracle\VirtualBox>help
有关某个命令的详细信息,请键入 HELP 命令名
ASSOC 显示或修改文件扩展名关联。
ATTRIB 显示或更改文件属性。
BREAK 设置或清除扩展式 CTRL+C 检查。
BCDEDIT 设置启动数据库中的属性以控制启动加载。
CACLS 显示或修改文件的访问控制列表(ACL)。
CALL 从另一个批处理程序调用这一个。
CD 显示当前目录的名称或将其更改。
CHCP 显示或设置活动代码页数。
CHDIR 显示当前目录的名称或将其更改。
CHKDSK 检查磁盘并显示状态报告。
CHKNTFS 显示或修改启动时间磁盘检查。
CLS 清除屏幕。
CMD 打开另一个 Windows 命令解释程序窗口。
COLOR 设置默认控制台前景和背景颜色。
COMP 比较两个或两套文件的内容。
COMPACT 显示或更改 NTFS 分区上文件的压缩。
CONVERT 将 FAT 卷转换成 NTFS。您不能转换
当前驱动器。
COPY 将至少一个文件复制到另一个位置。
DATE 显示或设置日期。
DEL 删除至少一个文件。
DIR 显示一个目录中的文件和子目录。
DISKCOMP 比较两个软盘的内容。
DISKCOPY 将一个软盘的内容复制到另一个软盘。
DISKPART 显示或配置磁盘分区属性。
DOSKEY 编辑命令行、调用 Windows 命令并创建宏。
DRIVERQUERY 显示当前设备驱动程序状态和属性。
ECHO 显示消息,或将命令回显打开或关上。
ENDLOCAL 结束批文件中环境更改的本地化。
ERASE 删除一个或多个文件。
EXIT 退出 CMD.EXE 程序(命令解释程序)。
FC 比较两个文件或两个文件集并显示它们之间的不同。
FIND 在一个或多个文件中搜索一个文本字符串。
FINDSTR 在多个文件中搜索字符串。
FOR 为一套文件中的每个文件运行一个指定的命令。
FORMAT 格式化磁盘,以便跟 Windows 使用。
FSUTIL 显示或配置文件系统的属性。
FTYPE 显示或修改用在文件扩展名关联的文件类型。
GOTO 将 Windows 命令解释程序指向批处理程序
中某个带标签的行。
GPRESULT 显示机器或用户的组策略信息。
GRAFTABL 启用 Windows 在图形模式显示扩展字符集。
HELP 提供 Windows 命令的帮助信息。
ICACLS 显示、修改、备份或还原文件和
目录的 ACL。
IF 在批处理程序中执行有条件的处理过程。
LABEL 创建、更改或删除磁盘的卷标。
MD 创建一个目录。
MKDIR 创建一个目录。
MKLINK 创建符号链接和硬链接
MODE 配置系统设备。
MORE 逐屏显示输出。
MOVE 将一个或多个文件从一个目录移动到另一个目录。
OPENFILES 显示远程用户为了文件共享而打开的文件。
PATH 为可执行文件显示或设置搜索路径。
PAUSE 停止批处理文件的处理并显示信息。
POPD 还原由 PUSHD 保存的当前目录上一次的值。
PRINT 打印一个文本文件。
PROMPT 改变 Windows 命令提示。
PUSHD 保存当前目录,然后对其进行更改。
RD 删除目录。
RECOVER 从损坏的磁盘中恢复可读取的信息。
REM 记录批处理文件或 CONFIG.SYS 中的注释。
REN 重新命名文件。
RENAME 重新命名文件。
REPLACE 替换文件。
RMDIR 删除目录。
ROBOCOPY 复制文件和目录树的高级实用程序
SET 显示、设置或删除 Windows 环境变量。
SETLOCAL 开始用批文件改变环境的本地化。
SC 显示或配置服务(后台处理)。
SCHTASKS 安排命令和程序在一部计算机上按计划运行。
SHIFT 调整批处理文件中可替换参数的位置。
SHUTDOWN 让机器在本地或远程正确关闭。
SORT 将输入排序。
START 打开单独视窗运行指定程序或命令。
SUBST 将驱动器号与路径关联。
SYSTEMINFO 显示机器的具体的属性和配置。
TASKLIST 显示包括服务的所有当前运行的任务。
TASKKILL 终止正在运行的进程或应用程序。
TIME 显示或设置系统时间。
TITLE 设置 CMD.EXE 会话的窗口标题。
TREE 以图形显示启动器或路径的目录结构。
TYPE 显示文本文件的内容。
VER 显示 Windows 的版本。
VERIFY 告诉 Windows 验证文件是否正确写入磁盘。
VOL 显示磁盘卷标和序列号。
XCOPY 复制文件和目录树。
WMIC 在交互命令外壳里显示 WMI 信息。

有关工具的详细信息,请参阅联机帮助中的命令行参考。

编码的四个阶段

作为一个程序员,离不开编码。随着时间的积累,编码能力会逐渐提升,本文试图探讨作为一个代码编写者,需要经历的四个阶段。

重构(Refactor)

重构这个代码编写技巧,源自于我早先看到的一本书《重构:改善既有代码的设计》

refactor

重构的意思是说,代码是随着需求的增加,而不断变化的。比如,你写了个程序,输出了“Hello World”。你可能会用下面的语句:


print "Hello World"

但是如果增加需求,支持输出文本用不同的颜色展示。你可能会先封装一个函数来支持,然后用这个函数去输出“Hello World”。


def output_color_text(text, color):
    # ...

output_color_text('Hello World', RED)

然后新的需求又来了,需要支持不同大小的文本。为了满足这个需求,你可能会先设计一个类,然后在封装一些成员函数,最后只要调用相关方法即可按需求输出文本“Hello World”。


class OutText:
    def __init__(text):
        # ...

    def set_size(size):
        # ...

    def set_color(color):
        # ...

    def output():
        # ...

text = OutText()
text.set_size(24)
text.set_color(RED)
text.output('Hello World')

重构只能算是一种写代码的技巧,而且只是包含了一些基本的重构规则,无法形成一个比较完善的体系,因为重构和需求的变化有关,而且,需要程序员去思考代码改往哪个方向走。

设计模式(Design Pattern)

说到设计模式,肯定会想到这本书《计算机科学丛书:设计模式 可复用面向对象软件的基础》

design_pattern

这本书被称为经典,我看到的很多人都在看这本书。这本书里的23种设计模式,在我看来是远远不够的,因为我们看到,这里面的很多设计模式都和图形界面程序有关。而一些基本的设计模式,比如创建模式,则是为了弥补语言的不足。

语言(比如Python)通常被设计成通用的,而通用语言是可以被用在所有的场景里面。但是问题在于,我们更多的时候,是使用语言来满足特定的需求的。我们可能会用语言去写一个网站、一个数据库系统,那么在这种使用场景里面,你会发现通用语言用起来太麻烦了。所以有人就总结除了设计模式,其实也就是为了弥补语言在特定场景下的不足。

至于一些和特定使用场景相关的设计模式(比如装饰模式),则和语言的使用场景有关。语言的使用场景是无法枚举的,所以设计模式理论上应该有无限多个。

如果拿设计模式和重构来比较的话,设计模式只是满足了一个相对大一点的需求。比重构考虑的更远一点而已。

框架(Framework)

相对于前面两种技巧而言,框架能解决更大一点的需求。而且框架已经属于设计范畴,也就意味着,框架更稳定。

框架的例子,比如Python的Django,就是用来支持网站后端。除非访问量很大、并发很多,否则这个框架是一直可以胜任的。

相对而言,框架的设计和实现,需要更丰富的经验和技巧。而通常情况下,你不需要自己设计框架。

我感觉,这一块,主要是;重构+设计模式+业务需求。似乎,也没有什么可以指导的方法论。

软件架构(Software Architecture)

软件架构这块牵扯的东西太多,我经验也不多。推荐看这本书《架构即未来:现代企业可扩展的Web架构、流程和组织(原书第2版)》

softwore_architecture

软件架构可能会考虑公司未来3-5年的需求,以及公司现有的资源,将来的发展状况等等,已经不是代码层面的问题了。但即使这样,也仍然可以找到一些基本的准则,用于指导软件架构工作。

更新版本的脚本


#!/bin/bash

# Used for publish new version.
# @auth: Fred.
# @date: 2016/06/26

set -e

if [ "$#" -ne 1 ]; then
echo "Deploy a new version of branch dscapi/develop_master."
echo "Usage: $0 DIRECTORY" >&2
echo ""
echo ""
exit 1
fi

TARGETDIR=$1

git clone -b develop_master git@git.local.ybzf.com:api_service/dscapi.git "$TARGETDIR"

rm connection
ln -s "$TARGETDIR" connection

cd connection
git branch
cd ..

Nginx支持二级目录

下面是一个server配置实例,支持/和/wordpress/俩个独立的网站。


server {
    listen       80 default_server;
    server_name   liungkejin.wang;

    # Default root and index.
    root   /var/www/monbook;
    index  index.php;

    location / {
        root   /var/www/monbook;
        index  index.php;

        if (!-e $request_filename) {
            rewrite ^/(.*)  /index.php last;
        }
    }

    location /wordpress/ {
        root   /var/www;
        index  index.php;

        # rewrite ^/wordpress/(.*)$ /wordpress/$1 break;

        location ~ \.php {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}


主要有两点需要关注:

  1. location代表匹配规则:匹配分两种:前缀式、正则式。按最长匹配原则,先匹配前缀式。然后,按定义的顺序匹配正则式。location可以嵌套。
  2. rewrite规则匹配到之后,会重新location匹配,不会超过10次。break flag,则表示不再location匹配;last flag,不再实行当前的序列。

也很好理解:首先,根据请求的URI匹配一个location,当location内定义的rewrite改变了uri,则需要重新匹配。

Flask框架初探

Python的Flask框架依赖于两个库:Jinja2和模板引擎和 Werkzeug WSGI 工具集。前者是html模板,用于生成html页面;后者提供WSGI的Server功能。WSGI教程参考这里

我们先看下Hello World程序

# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello World! 欢迎,世界!"

if __name__ == "__main__":
    app.run()

注意看第6行,这一句是先生成装饰器函数,再在加载main定义hello函数的时候调用装饰器函数。此时,会向Flask对象注册url和url处理函数之间的映射关系(路由)。

在Flask框架里,Flask类代表了app,Werkzeug包提供了server的支持。网站服务端实际上就是处理HTTP请求,并给予响应。而server则是仅仅处理分发和响应,不处理应用逻辑。所有的应用逻辑都交给application来完成。Flask的作用只是方便我们写这个application。

下一步请参考:网站框架功能要点。按照这个思路去研究Flask。

Apache配置文件代码段

配置DocumentRoot

# 定义变量
Define WEB_ROOT "E:\workspace\php\MonBook\website"

DocumentRoot ${WEB_ROOT}
<Directory ${WEB_ROOT}>
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks Includes ExecCGI

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

二级目录解析

Alias /simple_blog "E:\workspace\php\simple_blog"
<Directory "E:\workspace\php\simple_blog">
	Options Indexes FollowSymLinks Includes ExecCGI
	AllowOverride All
	Require all granted
</Directory>

二级域名解析

<VirtualHost local-wxadm-test.dymfilm.com:80>
    ServerName local-wxadm-test.dymfilm.com
    ErrorLog "D:\web_root\tmp\local-wxadm-test.dymfilm.com.log"
    CustomLog "D:\web_root\tmp\local-wxadm-test.dymfilm.com-custom.log" combined
    
    DocumentRoot "E:\workspace\php\weixin_backend\wxadm"
    <Directory "E:\workspace\php\weixin_backend\wxadm">
        # AllowOverride All      # Deprecated
        # Order Allow,Deny       # Deprecated
        # Allow from all         # Deprecated

        # --New way of doing it
        
        #Options Indexes FollowSymLinks Includes ExecCGI
        Options All
        AllowOverride All
        Require all granted
        
        # 定义URL重定向规则,不是文件,则指向index.php,源自Php的Yaf框架
        # 也可以配置到网站源码的.htaccess文件中
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule .* index.php
    </Directory>
</VirtualHost>

为什么坚持,想一想当初!

截屏2024-11-05 22.14.36

标题是周星驰说过的比较著名和深刻的一句话。我认为至少表达了两点:坚持、理想。

坚持是目前这个浮躁的社会所欠缺的,你所有的犹豫、观望、试图走捷径,都是在浪费时间,能做到坚持的人,少之又少。

理想对你而言,并不稀缺,关键是你行动了吗,你让自己觉得不堵了吗,没有。有理想很容易,实现起来就太现实了。

生活中有很多坚持理想的人,无论他们最终的结果如何,我们都应改尊敬他们,因为坚持这件事情不是普通人干的事,但实际上又是普通人能干的事。

2024年11月5日,更新:

没想到这次更新在9年之后,回头看看自己走的路,还是想对自己说,再坚持一下,你可以的!!!