分类 程序设计 下的文章

本学期我得有上《计算机安全管理》课程,其中在上到Hydra暴力破解时,为了方便学生练习,需要生成若干账号。其中账号和密码都要从指定的字典文件中生成,所以就有了从文本文件中随机读取一行的需求,于是我就写了这样一个脚本:

# 获取文件的行数
LINECOUNT=`wc -l rkolin.txt|awk '{printf $1}'` 
# 随机选第LINE行
LINE=$(( RANDOM % $LINECOUNT ))
# 输出前LINE行的最后一行
head -n $LINE rkolin.txt|tail -n 1 

这个脚本是能够完成任务的要求的,不过我想知道chatGPT怎么看,于是有了下面的对话:

Q:BASH: get a random line from a text file

A:You can use the shuf command in Bash to shuffle the lines of a text file and then use head to get the first line. Here's an example:

shuf -n 1 < filename.txt

This will shuffle the lines of filename.txt and then output the first line. The -n option specifies the number of lines to output, in this case just one.

简直就是最好的老师啊!如果这个东西普及了,对于我们的学习多么的方便!新时代真的要来了,现在担心的就是互联网上的语料用完之后能不能有创造性的答案出现,如果真的能,那就真的是一个新时代了。

本期末,省里面组织一次了考试,考前下发了复习材料。为了在练习的时候快速查询,排除干扰,我准备用网页做一个查询程序。

材料中只有单选和多选两种题型,材料大致如下。

2.普遍开展项目教学、()、模块化教学,推动现代信息技术与教育教学深度融合,提高课堂教学质量。
答案:C
A.仿真教学  
B.模拟教学  
C.情境教学  
D.场景教学
3.职业培训包括()及其他职业性培训,可以根据实际情况分级分类实施。
答案:ACD
A.就业前培训
B.学校职业培训
C.在职培训
D.再就业培训

具体思路如下:

首先、把文本转换成HTML网页。但是直接转换有点麻烦,所以我准备多一个步骤,从文本到Markdown,再把Markdown导出到网页。

文本到Markdown

  1. 每个试题前面加一个回车,这样每个试题就是一个单独的段落。使用支持正则表达式替换的编辑器即可。查找目标 ^(?=\d+\.),替换成 \n。意思是:查找后面是连续数字加点的位置,替换成回车。
  2. 每个选项前面加上一个- ,这样选项变成了列表。同样用正则表达式替换完成,查找目标 ^(?=\s*[A-E]\.),替换成 - 。和上面的类似。

完成后即可用Markdown编辑软件导出到HTML

HTML的处理

为了方便处理,最好把试题和选项列表包围起来。这个就简单了,直接查找替换。

  1. 删除</p>
  2. <p>替换成<div>
  3. </ul>替换成</ul></div>

剩下的就是网页编程了,很简单,相关程序如下:

部分网页:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>考题查询</title>
    <script src="jq.js"></script>
    <script src="main.js"></script>
    <link rel="stylesheet" href="main.css">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
</head>
<body>
<form>
    <input type="text" id="keyword"> 
    <label><input type="checkbox" id="chkOne">单选 |</label>
    <label><input type="checkbox" id="chkMore">多选</label>
    <button id="btnQury" type="button">搜索</button>    
</form><hr>
<div>二十大报告指出,从现在起,中国共产党的( )就是团结带领全国各族人民全面建成社会主义现代化强国、实现第二个百年奋斗目标,以中国式现代化全面推进中华民族伟大复兴。
答案:A

<ul>
<li>A.中心任务</li>
<li>B.指导思想</li>
<li>C.工作要求</li>
<li>D.年度任务</li>
</ul></div>

<div>二十大报告提出,建设现代化产业体系,坚持把发展经济的着力点放在( )上,推进新型工业化,加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国。
答案:A

<ul>
<li>A.实体经济</li>
<li>B.虚拟经济</li>
<li>C.股票经济</li>
<li>D.网红经济</li>
</ul></div>
</body>
</html>

样式表:

div {
    display: none;
}
div.show {
    display: block;
}
li.ok {
    color: #F00;
}

由于开始想用原生js,后面发现不变,又使用了JQ,所以程序风格不统一,也没有修改。Javascript文件:

function init(){
    //标记正确答案
    var paras = document.querySelectorAll("div");
    for(var i in paras) {
        var txt = paras[i].textContent;
        if(!txt)continue;
        txt.match(/答案:([A-H]+)/);
        var answer = RegExp.$1
        var c1 = answer.length > 1 ? "more" : "one";
        var lis = paras[i].children[0].children;
        for (var j=0;j<=4;j++) {
            var c = String.fromCharCode(0x41 + j);
            if (answer.match(c)) lis[j].classList.add('ok')
            
        }
        paras[i].classList.add(c1);
        
        
    }
}
$(function($){
    init();
    $('#keyword').on("focus",function(){this.select()});
    $('#btnQury').on("click",searchHandle);
    $("form").on("submit",function(){return false})
    $("#keyword").on("keypress",function(e){
        if(e.keyCode == 13)searchHandle(e);
    });
});

function searchHandle(e){
    $('div').removeClass("show");
    var key = $("#keyword").val();
    if(key.match(/^\s*$/))return;
    var range = '';
    if ($("#chkOne").get(0).checked && !$("#chkMore").get(0).checked) {
        range = '.one'
    }
    if (!$("#chkOne").get(0).checked && $("#chkMore").get(0).checked) {
        range = '.more'
    }
    $('div'+range).each(function(index,elem){
        if(elem.textContent.match(key))
            elem.classList.add("show")
    });
}

作为编程的初学者,无论是是学校和培训机构的学生,还是编程爱好者,第一门语言的意义是不言而喻的,选择了一门语言,就选择了一种思维方式。

在八、九十年代,计算机相关专业选择的入门语言一般是C和Pascal,业余入门一般选择Basic。进入新世纪之后,专业的入门语言变成了Java,而业余的选择就是五花八门了,但是基本都是选择一门脚本语言如Python等入门。但是在笔者看来,无论是专业也好,业余也好,用Javascript入门都是一个不错的选择。

Javascript最初的设计意图是为了在浏览器(网景的导航者)端载入的Web页面和后台服务器端的应用程序之间提供脚本化的借口。由于这项技术产生于1995年,加上后来微软的IE浏览器也加入了对Javascript的支持,所以时至今日,Javascript不光已经成为Web开发的关键组件,还逐渐的拓展到越来越多的方面。

笔者为什么建议使用Javascript作为入门语言呢?主要是从语言学习的层面和应用范围的层面来考虑的。

从语言学习的层面来说:

首先, Javascript的开发调试环境配置及其简单。只要有文本编辑器和网页浏览器即可,且这两种软件在任何主流的操作系统中都是自带的。其中文本编辑器用于输入包含Javascript的HTML源代码,浏览器用于调试和运行这些文件。对于学习Javascript的语法而言,HTML的知识也不是必需的——只需要把源代码输入在<script></script>之间,把文件保存为.html或.htm格式,然后用浏览器打开即可。并且主流的浏览器都支持Javascript代码的单步调试。当然,这仅仅是说Javascript 可以马上上手,要更好的使用 Javascript,还是需要更优秀的编辑器的。

其次,Javascript的基本语法和主流的C/C++/Java类似,有利于学习类似的语言。例如 C 语言的赋值(如基本赋值、连等赋值、自运算赋值等)语句、运算符(如算术运算、逻辑运算、位运算、三目运算等)、流程控制(如if、for、while)等均可在Javascript中使用,所以在学习Javascript之后如果需要学习这些类似的语言也能平滑过渡。作为入门来说,由于Javascript是脚本语言,语法比较宽松,比如变量不需要预先定义,又比如在大多数情况下,行尾的分号可以省略,这些特性相比C/C++/Java对于初学者来说都更加的友好。

第三,Javascript支持目前主流的编程方式——面向对象编程。虽然Javascript采用的原型继承的方式和C++/Java不尽相同,但也支持继承、多态和封装。了解这些概念后如果需要转向主流的面向对象编程语言也会很轻松。

第四,在Javascript中,函数也是基本的数据类型,所以在Javascript要实现匿名函数,函数作为返回值,闭包等功能都是很方便的。因此,在Javascript中也能实现函数式编程。

第五,Javascript的网上资源非常丰富,有利于自我解决学习过程中出现的问题。就目前来说,在github中Javascript的项目以及在编程问答网站StackOver中Javascript的问题都名列前茅。

第六,随着 ES6的定稿和 ES7的即将推出,Javascript 也越来越规范化和模块化,比如可以使用“use strict”使用严格模式,这样就和很多静态类型的编程语言一样,变量使用之前必须初始化,有助于培养良好的编程习惯;在学习这些最新规范的过程中还能了解 Generator、Promise 等新的编程理念。

第七,Javascript中对象的写法已经成为现在一种通用的数据存储和交换格式JSON,以后转到其它语言时,也会接触到这种格式的数据。

综上所述,用Javascript作为入门语言,可以了解编程的基本要素,为学习其他主流编程语言打下必要的基础。

如果要深入的学习Javascript,可不可以以它作为唯一的语言?它又能用在什么地方?下面就列举一下Javascript目前的一些应用场景:

首先,Javascript在WEB开发方面扮演重要的角色。

在Javascript的“本职工作”前端开发方面,随着Ajax技术的发展,Javascript已成为当前的Web开发的关键组件。最初的网页都是静态的,服务器程序呈现的是什么内容就只能浏览什么内容, 有了Javascript,浏览者就可以和网页进行简单的交互。再后来出现了Ajax技术,可以在不刷新网页的情况下更新网页的内容,这就使得网页从单纯的呈现内容的载体发展到了Web应用的容器,为各种B/S程序提供了坚实的基础。在这之前,B/S的程序要么使用Flash,要么使用ActiveX,要么使用JavaApplet,而这些技术都有各自的缺陷,所以Ajax技术出现之后,特别是随着jQuery等框架的流行,使得前端开发更加的便利,于是这些“过时”的技术都淡出了B/S应用的舞台。而Ajax中的“J”,就是Javascript的缩写。

其次,Javascript支持跨平台的移动开发。

随着HTML5标准的定稿,Javascript也越来越重要,在HTML5中新增的Canvas、本地存储等功能必需结合Javascript才能真正发挥作用。另外,HTML5还可以进行跨平台的移动开发,如国外的PhoneGap、React Native等就是利用HTML5开发苹果、安卓、Windows Phone、黑莓等平台的移动程序;国内也有阿里巴巴的 Weex、数字天堂的HBuilder等移动开发工具和平台;特别是最近腾讯推出的微信小程序,更是让 HTML5的移动开发火上添油!

第三,Javascript可以用于服务器端的应用程序开发。

在原来的ASP时代,虽然使用VBScript的人更多,但是也可以使用JScript开发服务器端的应用程序,在微软停止支持ASP以后,仍然可以在ASP.Net中继续使用JScript,而JScript就是微软的Javascript。

对于用Javascript服务器端应用程序设计而言,现在有了更好的选择,那就是Node.js。Node.js是基于Google Chrome的Javascript解析引擎V8建立的一个平台,用来方便地搭建快速的 易于扩展的网络应用。Node.js 借助事件驱动,非阻塞I/O 模型变得轻量和高效,非常适合运行在分布式设备的数据密集型的实时应用。V8引擎执行Javascript的速度非常快,性能非常好。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。特别地,针对服务器端的WEB编程,产生了Express.js、koa等应用框架来简化开发。

第四,Javascript可以作为操作系统的管理工具。

如前文所言,Node.JS既然可以在非浏览器环境下运行,那么自然可以作为系统管理的脚本语言,特别是在分布式设备的数据密集型的实时应用,例如各种网络程序和各种NoSQL数据库。

在Windows下还可以使用WScript.Shell来执行操作系统常见的外壳操作,如读写注册表、环境变量等,可以说是DOS下BAT的升级替代品。JScript就是WSH内嵌支持的两种语言之一。

受到Node.js的启发,出现了基于V8的phantomjs和基于火狐解析引擎的slimerjs等语言,这两种语言都是一个基于Javascript的Webkit/Gecko内核无头浏览器,也就是没有显示界面的浏览器,这样访问网页就省去了浏览器的界面绘制所消耗的系统资源,比较适合用于如爬虫等网络测试等应用 。

第五,Javascript可以开发桌面应用程序。

在Windows操作系统中直接将HTML保存成HTA的格式,就是一个独立的应用软件,不但可以使用通常的HTML技术,还可以使用系统自带的各种ActiveX控件(当然,这些都得用我们今天的主角Javascript或VBScript来操控),是一种很方便快捷的桌面应用程序设计方法。

时下也出现了一种新的基于HTML的新的桌面应用开发方式:使用的WebKit来渲染界面,用Node.js来和系统通信。有跨平台的Electron、NW.js、腾讯推出的AlloyDesktop等。例如 GitHub 的 Atom 和微软的 VS Code还有Adobe 的Brackets等软件都是使用这种技术开发出来的。

所以,如果想成为“全栈工程师”,学习Javascript也是一个不错的选择。

综上所述,如果选择Javascript作为入门的语言,既容易学习,又能找到很多的应用场景,还可以很容易的过渡到其他的语言。所以,笔者建议选择Javascript作为入门的编程语言。

我弄了一个排八字的程序,操作系统 OSX 10.9.2,用西元时没问题,用农历时在火狐浏览器中会快一小时,但是在 Chrome 中没有问题,很是奇怪。经过跟踪源代码发现,火狐在处理民国的时间时,是按民国的标准来处理的。我在贵州,现在使用的是北京时间(GMT+8),但是在民国时期,贵州属于陇蜀时区(GMT+7),所以一个现在的时间和民国时期的时间相减,就会快一个小时。而我在转换的过程中,是以1921-02-08(正月初一)为起点的,所以日期相减的时候,就多了一个小时。而 Chrome 则不管,把所有时间都当成了北京时间。为了避免这个问题,需要修正代码,下面的代码在两种浏览器中都能正常工作。

CalendarOfChinese.firstDate = function(){
        var d = new Date(1921, 1, 8);
        var dm = -480 - d.getTimezoneOffset() ;
        d.setTime(d.getTime()+dm*60000);
        return d;
}();

另外我发现,在别的语言中也有这样的问题,比如 Perl、 Ruby。Ruby最奇怪,1980-05-01后的日期才换成GMT+8,以前一直是GMT+7,不知道是为什么?另外,在SWI-PROLOG中,也是统一按GMT+8处理的