安装环境

环境选取:Nignx + MariaDB 。

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt-get install php7.4 php7.4-fpm php7.4-bcmath php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-xml php7.4-zip php-redis nginx mariadb-server

启动 Nginx

sudo service nginx status     //查看 nginx 进程状态
sudo service nginx start      //启动 nginx 进程
sudo service nginx stop       //停止 nginx 进程
sudo service nginx restart    //重启 nginx 进程

启动并配置 MariaDB 数据库

sudo service mysql start  
sudo mysql_secure_installation  

联动 PHP × Nginx

cd /etc/nginx/sites-avaiable
sudo vim default

找到下面几行,去掉注释

root /var/www/html;
index index.html index.php index.htm;
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

测试

cat >> /var/www/html/test.php << EOF
<?php phpinfo(); ?>
EOF

浏览器访问http://localhost/test.php,看到PHP 7.4.22 - phpinfo()页面即成功安装。

自启动

我们可以在 Windows 桌面上设置一个.bat批处理脚本达到自启动的目的。

首先在合适的位置放一个启动服务的脚本,这里我选择/home/hsiaofeng/start.sh

service nginx start
service php7.4-fpm start
service mysql start

接着编写.bat脚本文件。

wsl -d ubuntu -u root /home/hsiaofeng/start.sh
rem 将后面的改为你自己的路径

之后需要运行Web服务器的时候直接双击脚本就可以了。

参考资料

  1. Win10 下的 WSL (Linux 子系统) 开发环境搭建 (PHP+Nginx+MySQL+Composer+SSH) | PHP 技术论坛
  2. Nginx启用php支持 | 稻草人·正
  3. Ubuntu Nginx中启用php支持_Csdoker的博客-CSDN博客
  4. WSL 服务自动启动的正确方法 - 知乎(评论区 @楚石)

客户端准备

以下操作在本机(客户端)进行,教程使用客户端操作系统为 Windows 10 。

打开终端,键入

ssh-keygen

根据提示生成密钥和公钥(.pub文件),记住他们的位置。

.pub文件上传至服务器,这里上传至~/.ssh以方便后续操作。

服务端准备

以下操作在服务器端进行。

找到文件/etc/ssh/sshd_config,对以下行取消注释,若没有则在新行添加即可。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

转到~/.ssh目录,并将.pub文件写入authorized_keys文件。务必使用cat写入,不然可能会引发奇怪的问题。

cd ~/.ssh
cat id_rsa.pub >> authorized_keys

变更目录及文件权限。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

重启sshd.service

systemctl restart sshd.service
service sshd restart #若上述命令不能生效,执行此条

将终端命令设置如下。

ssh -i 私钥位置 服务器用户@服务器地址 -p 端口号

ssh -i ~/.ssh/id_server root@example -p 22

大功告成。

本文为虚构作品。

半夜,我穿着一身黑色的衣服,乘上了去往阿那沃都的客运汽车。

我逃离了城市的灯光,去往阿那沃都。

我找到了一个靠窗的位置坐下,城市的璀璨和万家的灯火在我身后愈行愈远。路上没有什么灯光,随着愈来愈远,周围大抵只剩下了时隐时现的光。

车上的乘客约莫都是第一次去那里。乘客们的表情时而能被前车的尾灯照亮,映着那惨白色的灯光,有的表情严肃,有的睡了起来。

偶尔,会有稽查员上来把一些乘客带下车——尽管车一直在高速行驶着,看起来和蔼可亲的稽查员不知是怎么上的车。我望向对面车道,亦有风驰电掣一般的面包车在往回开,散发着霓虹灯红蓝色的色彩,那是路上惟一所熟悉的样子。我并不想下车,我扎紧了安全带——尽管那些稽查员看起来慈眉善目。

稽查员们身上穿着白色的衣服,只能看清他们的眼睛。我揣度了很久,却依旧没思想得出他们是怎样在路上上的车。而随着车的远行,稽查员也终究不怎么来了。

我只知道周围的景色已经过于陌生了,那是城市里不所见到的景色。

穿着黑色的衣服,我逃离了灯火通明的城市,在去往阿那沃都的路上。

(完)

阴雨的天气是值得赞美的,尽管这令许多人感到沮丧。没有太阳,空气中弥漫着潮湿的味道,雨打在板子上乒乓作响。

我喜欢雨天。在闷热的午后,微开窗,吹进一股凉风。呷一口清茶,细细回味。在雨天,人是放松的,是易睡的。若大的雨打在窗上,弄得砰砰作响,便在这交曲中安然入睡。

小雨是可以淋着享受的。伫立于静僻之地,静得只留下雨声。自然之露降于肌肤,滋润万物。难得清静,难得清凉。一点一滴,汇成一场盛宴。正若《潜夫论·释难》语,“大鹏之动,非一羽之轻也;骐骥之速,非一足之力也。”究竟要蒸发多少水,才得以凑讫一场大雨?又只惜无人所注,无人所思。现代的社会不免浮躁,大抵是无人关心日常之琐事罢。

诗人对雨也寄寓了太多情感。有单相思的“隐约雷鸣,阴霾天空。但盼风雨来,君能留此地”(《万叶集》语),也有那一抹哀愁于“悠长而寂寥的雨巷”(《雨巷》语)。约莫是雨天引发了太多太多的感想罢。雨不同于晴天,她比晴天优柔。而她优柔的性格,也造就了诗人在雨天的哀愁罢。

陆游所描写的“小楼一夜听春雨,深巷明朝卖杏花”的情景已有几百年之久远了,而我何尝未在寻着雨巷里,那撑着油纸伞的姑娘?彳亍着,徘徊着。我静静地,让雨天永驻我心。

二〇一九年四月廿一日

n&(n-1)用到了按位与运算符,这一算法的用途是判断此数字二进制是否只含有唯一一个1。当满足该条件时,此式值为0

按位与正如字面意思,按二进制的每位进行与运算。

例如,n = 1000(Bin)的情况下,

  1000 // n
& 0111 // n - 1
------
  0000 // n & ( n - 1 )

此时n&(n-1)=0

n = 1100(Bin)

  1100 // n
& 1011 // n - 1
------
  1000 // n & ( n - 1 )

此时n&(n-1)≠0

【作者】北京医学院教授 叶恭绍

【来源】《父母必读》1983 年 4 期

记得一九六三年,在人民大会堂召开全国卫生科技规划会议期间,一天,我们有十来位同志突然接到通知:周总理要来同我们见面、座谈。大家真是高兴极了。稍许,总理来了,很亲切地招呼大家坐下,然后就侃侃而谈起来。

在这次座谈中,我们始料未及的是:周总理指示我们医务工作者,一定要把青春期的性卫生知识教给男女青少年,让他们能用科学的知识来保护自己的健康,促进正常发育。在我国,由于复杂的原因,这个问题一直被视为禁区。然而,我们的好总理却高瞻远瞩,把普及性卫生知识的重要性及时地提了出来,而且谈得是那样恳切,竟比我们多年来从事专门研究的人看得还要透彻,还要深刻,不禁使我们当时在座的人们都十分感动。虽然时间已经过去了整整二十年,我们的心中却总是不曾忘却这次幸福的会见。

记得总理在强调对青少年进行性教育的必要性时,曾颇有感触地回忆了他老人家当年在南开中学读书时的一件事。那时,学校曾组织过几次卫生讲演,他自己感到终身获益不浅。总理嘱咐我们要在女孩子来月经以前,男孩子发生首次遗精以前,把科学的性卫生知识告诉他们。有些人有顾虑,怕孩子们懂得了性卫生知识会变坏。总理指出:这可能会有,但毕竟是少数,我们要相信大多数的青少年是好的。他老人家还说:女孩子把月经叫“倒霉”,一提怀孕就脸红。因此,要普及性卫生知识,就不单纯是讲讲科学的问题,要想收到良好的效果,就一定要把它当作一件破除封建思想和移风易俗的大事来抓。首先,要求我们讲的人就要破除封建思想。在向青少年传授性卫生知识时,男女学生要一道听讲,不要分开。要很自然地做好这件事,不要试图回避,更不要搞得神秘化。

总理对青少年的关切就是这样细致入微,这些指示又是多么中肯啊,他老人家的一席话给我们进行性教育指明了正确的方向,本来嘛,人体九大解剖系统,其他八大系统都可以讲,为什么单单生殖系统就不能讲呢?其他八大解剖系统的功能、卫生都可以教,为什么单单性的功能、性的卫生就不能教呢?难道不讲或者设法遮盖这些科学知识,就对青少年身心的健康有益吗?就能导致高尚的文明和进步的道德么?答案显然是否定的。听了总理的指示,我们算是有了主心骨啦。于是,在一九六三年我们就着手在报刊上介绍了一些有关男女青少年生理解剖发育的特点,适合结婚年龄的生理解剖基础知识以及性发育、性卫生知识等。结果,反响十分强烈。在文章发表后的一年多时间里,我们先后收到了来自全国各地青少年的一千多封信。他们结合自身的情况,询问有关性的卫生知识。使我们感到意外的是:男孩子提出问题的竟比女孩子还多。这可能是因为女孩子遇到月经初潮、手足无措时,有些会主动去问问妈妈;而男孩子发生遗精等现象时,却很难向父母启齿,这也是封建思想造成的。过去一般人总认为手淫是一种见不得人的行为,这样,就使得有些男孩子感到自己在进行一种不道德的甚至是犯罪的活动,这种性生理的需要与犯罪行为的恐惧心理给予不少青少年极大的折磨,有时甚至造成严重悲剧。例如,曾有一位因遗精而卧轨自杀的青年,在遗书里写道:我得了不治之症,只好卧轨一死了之。这种情况当然只是极个别的,但是从来信中所反映的问题,却有力地说明了周总理指示要进行性教育和公开宣传性卫生知识的重要性和必要性。

周总理关心性教育,可以说是一贯的,而且是一抓到底的。一九七三年,总理又向有关部门的同志询问实施性卫生教育的情况,再次谈到这个问题,并且要求不仅在教材上要有这一章,而且在讲课时应有大幅彩色男、女性器官的挂图,便于形象的说明。直到一九七五年,他老人家病危时,还一再嘱咐我们:一定要把青少年性卫生教育搞好。

周总理关于要把性卫生教育当作移风易俗的大事来抓的指示,是具有很现实、很强的针对性的。这里只提两件事就足以说明问题了。记得一九七二年,编写中学二年级的《生理卫生》课本时,由我负责写“生殖器官”一章。当编写人员一起商量时,竟有一半人反对写这一章,于是发生了激烈的争辩,直到我谈出了周总理的指示,才算肯定了这一章。可是接着又在是否插图的问题上发生了争执,虽然,最后插图还是要了,但却深刻地说明了不彻底破除封建思想,周总理的指示是很难贯彻好的。

另一件事发生在一九七三年,教育部门召开《生理卫生》教材会时,主持会议者嘱咐教育局的同志把教科书带着赴会,结果该同志心中忐忑不安,还以为教材内包括了生殖器官这一章要在会上进行批判呢!可见,要进行性卫生知识的教育宣传,阻力有多大,成见有多深!

现在情况好得多了。但是,对青少年进行科学的性卫生知识教育的主张和实践,还经常受到种种公开和隐蔽的非议,而且在种种压力下,公开谈论这个问题还没有能很好地做到,这个关系到青少年一代身心素质健康发展的问题,还没有受到普遍的重视。有些报刊虽然发表了一些介绍性卫生知识的文章,但还不能谈得很具体、很清楚。明确提问、明确回答性卫生知识的文章至今还很少见。因此,很有必要加强和改进。例如最好在卫生部门开设一些咨询门诊,让青少年可以随时和医务人员谈心,解决各种卫生知识方面的问题,包括性卫生知识的问题。

再者,从我国青少年生理发育的情况来看,身高已经比过去发育得早了,性发育也有了提前,性卫生知识的教育自然也应该随之提前。以女孩子为例,现在有的在十岁左右就来了月经。因此,提前给孩子讲讲性卫生知识,无论对生理保健和心理健康的发展都会有好处。依我看,这不光是科学、教育工作者的责任,也是广大父母不可忽视、不可推卸的职责呢。
(本刊记者金马记录整理 李德凯题图)

扫描版:周总理关心性教育.pdf,来自超星期刊。

安装

pip install Jinja2

使用

大致思路如下:

Jinja2 生成思路

创建模板文件base.html如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
    </body>
</html>

其中{% block title %}{% endblock %}是期望被替换掉的部分,title可以自定义成你想要的名字。
同目录内,创建内容文件content.html如下:

{% extends "base.html" %}
{% block title %}Index{% endblock %}

第1行,其引用上述base.html作为模板,第2行,使用文本Index替换掉原文中的 Block title
同目录内,编写 Python 程序如下:

# -*- coding: utf-8 -*-
from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('./'))
template = env.get_template('content.html')
with open("result.html",'w+') as fout:   
    html_content = template.render()
    fout.write(html_content)

执行,生成文件result.html如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Index</title>
    </head>
    <body>
    </body>
</html>

完毕。
更多使用方法可参考 Jinja2 文档

$ wget https://tar.goaccess.io/goaccess-1.4.6.tar.gz
$ tar -xzvf goaccess-1.4.6.tar.gz
$ cd goaccess-1.4.6/
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ ./configure
$ make
$ make install

安装完成后,运行

$ goaccess

会提示配置文件目录,在最后添加:

time-format %T
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

转到日志所在目录,运行

goaccess -f 日志名.log -a > report.html

下载该 HTML 打开即可看到报表。

一、在表格中以“地区”为列标题,依次写出城市名称。

选中这些单元格(不要选中整个A列),点击插入 - 三维地图 - 打开三维地图(O)

第一步

二、找到右边“数据”折叠卡,将“位置”字段中的地理类型设置为“城市”(不要设置为县/市),在上方选择合适的展示类型(点状图、热力图等)。

第二步

三、调整主题图层选项等美化外观。

第三步

应在不瞒报的前提下使用自动化健康打卡程序。

您应当知晓使用自动化程序可能造成学校处分等后果。

流程概览

抓包流程

抓包

使用软件 Fiddler 4 进行抓包。

前期具体步骤:

Android 用户可参考:使用fiddler实现手机抓包 - 简书

iOS 用户可参考:fiddler抓苹果手机上app包的方法... - CSDN

值得注意的是,许多浏览器已不支持 TLS1.0/1.1,因此需要手动在 Tools - Options - HTTPS 中修改 Protocols

<client>;ssl3;tls1.2

HTTPS-ver.png

配置好后,试着进行打卡,发现向服务器传送了数据。

POST https: //▇▇▇.▇▇▇.edu.cn/v1/temperatures/ HTTP/1.1
Host: ▇▇▇.▇▇▇.edu.cn
Content-Type: application/json; charset=utf-8
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Accept: application/json
User-Agent: ▇▇▇
Authorization: JWT ▇▇▇▇
Referer: https: //servicewechat.com/▇▇▇/▇▇/▇▇▇.html
Content-Length: 234

{
    "value": "36",
    "condition": "A",
    "home_condition": "A",
    "watched": false,
    "watched_location": "",
    "stayed": false,
    "stayed_contacted": false,
    "family_conditions": "",
    "is_contacted": false,
    "contacted_health": "",
    "personid": "",
    "notes": "",
    "location": {}
}

我们可以看到,关键的信息是 Header 中的 Authorization 和 JSON。

JSON 当中是填报的表单,其中 value 是体温值(摄氏度)。

试着退出打卡系统重新登录,发现向服务器传送数据如下。

POST https://▇▇▇.▇▇▇.edu.cn/▇▇▇/▇▇▇/login/ HTTP/1.1
Host: ▇▇▇.▇▇▇.edu.cn
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Accept: application/json
User-Agent: ▇▇▇
Referer: https://servicewechat.com/▇▇▇/▇▇/▇▇▇.html
Content-Length: 59
Accept-Language: zh-cn

{"username":"▇▇▇▇▇▇","password":"▇▇▇▇▇▇","type":""}

其中 usernamepassword 均为明文,不需要做改动。

响应后返回的 JSON 为

{
    "token": "▇▇▇",
    "token_expiration_datetime": "2021-07-09 21:12:38"
}

这里的 token 加上前缀 JWT 即为上文中 header 内的 Authorization 的值。

至此,抓包部分结束。

程序设计

由于之前没有学过 Python ,但是觉得 Python 应该可以简单实现并在服务器上部署,决定用 Python 试一试。

在网上查阅资料后,相关设计步骤如下。

需要引用 requestsjson 包,用于发送 POST 请求和解析 JSON 数据。

程序如下。

import requests
import json
url = 'https://▇▇▇.▇▇▇.edu.cn/v1/temperatures/'
datas = {
    "value": "36",
    "condition": "A",
    "home_condition": "A",
    "watched": 0,
    "watched_location": "",
    "stayed": 0,
    "stayed_contacted": 0,
    "family_conditions": "",
    "is_contacted": 0,
    "contacted_health": "",
    "personid": "",
    "notes": "",
    "location": {}
}
headers={"Authorization": "JWT ▇▇▇"}
morning =requests.post(url,data=datas,headers=headers)
print(morning)
print(morning.text)

也可以设计成填入账号密码就可以自动获取 token 打卡的形式。

import requests
import json
url_morning = 'https://▇▇▇.▇▇▇.edu.cn/v1/temperatures/'
url_login = 'https://▇▇▇.▇▇▇.edu.cn/▇▇▇/▇▇▇/login/'

#下文中的学号和密码自行修改
datas_login = {"username":"▇▇▇▇▇▇","password":"▇▇▇▇▇▇","type":""}

datas_morning = {
    "value": "36",
    "condition": "A",
    "home_condition": "A",
    "watched": 0,
    "watched_location": "",
    "stayed": 0,
    "stayed_contacted": 0,
    "family_conditions": "",
    "is_contacted": 0,
    "contacted_health": "",
    "personid": "",
    "notes": "",
    "location": {}
}
login = requests.post(url_login,data=datas_login)
print("登录状态",login)
dic = json.loads(login.text)
token = "JWT "+dic['token']
headers={"Authorization": token}
morning = requests.post(url_morning,data=datas_morning,headers=headers)
print("---------------------")
print("晨报状态",morning)
print("晨报返回值",morning.text)

自动运行

对于服务器,可以配置好 Python 后设置定时任务。注意安装对应的包。

个人电脑来讲,每天手动运行或者用其他方法令其自动运行即可。

代码参考:windows .bat批处理实现进程监控确保程序运行 - 百度经验

程序预期

可以自动检测某程序是否运行并予以打击制裁。

代码

@echo off 

rem 下面的AppName是进程名字,AppPath是路径,修改等号后面的内容就行

set AppName=swap.exe

set AppPath=D:\code\cpp

title 进程监控

cls

echo.

echo 进程监控开始……

echo.

:startjc

   rem 从进程列表中查找指定进程

   rem  下面语句也可写成 qprocess %AppName% >nul (经验发布后补充)

   qprocess|findstr /i %AppName% >nul

   rem 变量errorlevel的值等于0表示查找到进程,否则没有查找到进程

   if %errorlevel%==0 (

         echo ^>%date:~0,10% %time:~0,8% 发现进程,正在制裁
         
         taskkill /f /im %AppName%

         exit

    )else (

           echo ^>%date:~0,10% %time:~0,8% 没有发现程序进程
    )

   rem 用ping命令来实现延时运行,下方(1,1,4)中的4可以修改为想要的秒数

   for /l %%i in (1,1,4) do ping -n 1 -w 1000 168.20.0.1>nul

   goto startjc

echo on

自 PHP 7.2.0 开始,函数 creat_function() 由于安全原因被弃用。而在一些老版本的插件中仍在使用此函数,我们只需对其进行稍微改动即可正常使用。

例如

creat_function(__A__ , __B__);

只需将其更改为

function(__A__){
   __B__;
}

即可。