2022年12月

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

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

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")
    });
}

FROM alpine:3.17
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
apk update && \
apk add --no-cache nodejs npm && \
npm install -g cnpm --registry=https://registry.npm.taobao.org && \
cnpm install -g reveal-md
EXPOSE 1948/tcp
CMD reveal-md /markdown-files
VOLUME /markdown-files
  1. 如果不是在国内,可以不修改apk源和npm源的位置。
  2. hexo等可以仿照这个文件生成

FROM hugsnow/alphine-php
RUN apk update && apk upgrade && apk add --no-cache  mysql  && \
mysql_install_db --user=mysql --datadir=/var/lib/mysql && \

EXPOSE 80/tcp
CMD php-fpm7 && mysqld_safe && lighttpd -D -f /etc/lighttpd/lighttpd.conf
VOLUME /var/www/localhost/htdocs /var/lib/mysql

这个镜像以本站的Lighttpd-PHP镜像为基础,如果使用基于Nginx,替换相应的命令即可。

在很小的时候,就听大人说过什么“甲子乙丑海中金,丙寅丁卯炉中火……”。到自己研究四柱之后,也背了一下,不过一直没理解为什么,直到前几天看到《中国方术概观——式法卷上》当中的《五行大义》一篇,才算弄清楚其中的来龙去脉。为了帮助自己积累,也希望对和我有同样疑问的人有所帮助,现把相关的知识整理如下。

首先,纳音的来源和河图有关。“天一生水,地六成之;地二生炎,天七成之;天三生木,地八成之;地四生金,天九成之;天五生土,地十成之”的生数和成数之外,还有一个“老数”,即水老于五,火老于三,木老于九,金老于七,土老于一(至于为何?参见《五行大义》里面管辂的说法)。

其次,纳音和六爻纳甲有关。具体来说,就是震纳庚子午(初爻子、四爻午,下同),巽纳辛丑未,坎纳戊寅申,离纳己卯酉,艮纳丙辰戌,兑纳丁巳亥。

纳音的具体计算方法就是:

  1. 把地支根据纳甲找到对应的天干;
  2. 求出从天干数到地支对应的天干是几;
  3. 看看求出的数是哪一个五行的老数则该干支的纳音就是该五行。

例如甲子,子属庚,从甲数到庚为七,金老于七,所以甲子的纳音是金;再比如丙辰,辰属丙,从丙到丙数一,土老于一,所以丙辰的纳音是土;又比如乙卯,卯属己,从乙数到己为五,水老于五,所以乙卯的纳音是水。

我还看到过一种计算方法,年代久远已经记不起书名了,感觉没有上面的说法有道理,具体的方法是:

  1. 把干支每两个为一组,阳前阴后。比如甲子乙丑一组,壬申癸酉一组。
  2. 根据洪范五行数为干支取数,即“甲己子午九,乙庚丑未八,丙辛寅申七,丁壬卯酉六,戊癸辰戌五,巳亥四”,并把所得的数相加。
  3. 现在又有两种说法:

    • 金木可以自己发音,所以结果为金木的纳音就为金木。水借土发音,土借火发音,火借水发音。所以算出来是水的纳音是火,结果是土的纳音是水,结果是火的纳音是土。
    • 把得到的数用“大衍之数五十,其用四十有九”来减,然后得到的数所生的五行即纳音五行。

例如:甲子乙丑加起来34数,4为金(河图数),金自己发音,所以甲子乙丑纳音是金(也可以用49来减,得5土,土生金)。丙辰丁巳加起来22数,为火,土借火发音,所以丙辰丁巳纳音是土(也可以用9-2=7火生土)。

另外,在《三命通会》中还有一种方法,也就是“隔八生子”的方法,也是两个一组,从甲子乙丑为金开始,甲子数8到壬申, 壬申癸酉也是金,再数8到庚辰,庚辰辛巳也是金,三次之后就要更换了,再数8到戊子,戊子己丑为火,丙申丁酉属火,甲辰乙巳属火;壬子癸丑属木,庚申辛酉属木,戊辰己巳属木;丙子丁丑、甲申乙酉、壬辰癸巳皆为水;庚子辛丑、戊申己酉、丙辰丁巳皆属土。地支对冲的五行相同,比如甲子同甲午,丙申同丙寅。

当然也有在民间流传的一些计算公式,不过那些公式都是为了快速计算而构造的,其中用到的数不像上面列举的方法一样有来历。

至于海中金炉中火之类的形容词,大都是根据五行的衰旺死绝来的了,其中《三命通会》里面有详细的解释,这里也不赘述了。