获取windows睡眠和亮屏时的状态

获取windows睡眠和亮屏时的状态

在某些业务需求下,Qt的程序需要感知到windows睡眠和亮屏时状态
以便程序做对应的处理动作。好在Qt为我们提供了QAbstractNativeEventFilter类
来捕获对应的windows事件。

一、步骤如下:
1、主界面MyMainWindow类继承QAbstractNativeEventFilter
2、重载virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
3、在main函数中通过installNativeEventFilter注册:
QApplication a(argc, argv);
MyMainWindow w;
w.show();
a.installNativeEventFilter(&w);
a.exec();

二、实现如下:

bool MyMainWindow::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
if (eventType == “windows_generic_MSG” || eventType == “windows_dispatcher_MSG”)
{
QDateTime current_date_time = QDateTime::currentDateTime();
MSG *pMsg = reinterpret_cast<MSG*>(message);
if (pMsg->message == WM_POWERBROADCAST)    //屏幕唤醒
{
if (pMsg->wParam == PBT_APMSUSPEND) {
qDebug() << “shui mian”;
//处理睡眠后操作
//…
}
else if (pMsg->wParam == PBT_APMRESUMEAUTOMATIC)
{
qDebug() << “liang ping”;
//处理亮屏后操作
//…
}

QString current_date = current_date_time.toString(“yyyy-MM-dd hh:mm::ss.zzz”);
qDebug() << “current_date=” << current_date;
}
}
return false;
}
其中MSG结构体如下:
typedef struct tagMSG {
HWND        hwnd;     // handle to window
UINT        message; // msg
WPARAM      wParam;     // power-management event
LPARAM      lParam;     // function-specific data
DWORD       time;
POINT       pt;
#ifdef _MAC
DWORD       lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

我们通过wParam来区分是睡眠还是亮屏。

Qt 实现读写xml

Qt 实现读写xml

 

XML(Extensible Markup Language)即可扩展标记语言。
标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。

用途

XML设计用来传送及携带数据信息,不用来表现或展示数据,HTML则用来表现数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。
(摘自维基百科)

熟悉对xml的操作,在项目开发中非常重要。
qt中提供了几种类可以对xml进行处理。本次介绍的是QXmlStreamWriter和QXmlStreamReader。
一种通过流来处理xml的方式。

写入效果

核心代码
引入

#include <QXmlStreamWriter>
#include <QXmlStreamReader>

​//写
void XmlHandle::xmlWrite(const QStringList &elements)
{
QFile file(_filePath);
file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
_xmlWriter.setDevice(&file);
_xmlWriter.setAutoFormatting(true);
_xmlWriter.writeStartDocument();

_xmlWriter.writeStartElement(“root”); //root
//写数据
for (auto element: elements)
{
QStringList listParam = element.split(“,”);
if (listParam.size() == XML_Node_Num)
{
QString name = listParam[0];
QString type = listParam[1];

_xmlWriter.writeStartElement(“Info”); //Info

_xmlWriter.writeAttribute(“Name”, name);
_xmlWriter.writeAttribute(“Type”, type);

_xmlWriter.writeEndElement(); //Info
}
}
_xmlWriter.writeEndElement(); //root
_xmlWriter.writeEndDocument();
file.close();
}


//读
QVector<Info> XmlHandle::xmlRead()
{
QVector<Info> vecInfo;

QFile file(_filePath);
file.open(QIODevice::ReadOnly | QIODevice::Text);
if (file.exists())
{
_xmlReader.setDevice(&file);
while (!_xmlReader.atEnd())
{
QXmlStreamReader::TokenType type = _xmlReader.readNext();
if(type==QXmlStreamReader::StartDocument)
continue;
if (type == QXmlStreamReader::StartElement)
{
QString name = _xmlReader.name().toLatin1();
if (name == “root”)
continue;
else if (name == “Info”)
{
Info info;

QString name = _xmlReader.attributes().value(“Name”).toLatin1();
int type = _xmlReader.attributes().value(“Type”).toInt();

info.name = name;
info.type = type;

vecInfo.append(info);
}
}
}
}
file.close();
return vecInfo;
}

多态的定义及特点

多态的定义及特点

定义:
多态是指一类事物有多种形态。
在不考虑实例类型的情况下使用实例,不同类型的实例有相同的调用方法。

特点:
1.增加灵活性

以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

2.增加可扩展性

通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

例子:
class dog:
def info(self):
print(‘hello dog’)

class cat:
def info(self):
print(‘hello cat’)

class rat:
def info(self):
print(‘hello rat’)

animal = [dog, cat, rat]
for i in animal:
i().info()

运行结果:
hello dog
hello cat
hello rat

 

如何搭建一个我的世界游戏服务器

在过去的几年里,《我的世界》成为了有史以来*伟大的独立游戏之一。你可以在游戏中做很多事情——不仅是靠它自己,还包括现在可用的大量插件。它甚至可以在任何可以想象的设备上使用,包括树莓派。有这么多人玩游戏,没有比现在更好的时间来学习如何设置一个Minecraft游戏服务器。

有很多不同的方法可以让服务器启动。例如,当您运行游戏客户端时,您可以轻松地运行一个临时的、未修改的服务器。自从开发人员改变了游戏的架构,使它创建了自己的本地服务器会话,然后连接到自己来运行一个单人游戏,这就成为可能。你可以简单地使用其他客户端,通过网络或局域网连接,这取决于物理上的可能性。

只要记住所有的端口都需要打开(并且可能被转发),如果你希望人们从互联网连接。

启动一个专用的服务器

如果您想要建立一个真正的“专用”Minecraft服务器,您需要下载单独的服务器二进制文件,它可以作为Windows机器的.exe文件或所有其他平台的.jar文件。这些文件可以直接从Minecraft的网站下载到你的帐户。

Windows用户只需双击.exe文件即可启动他们的Minecraft服务器,而其他(如Linux)应该打开一个终端,将其更改为.jar文件的相同目录,并运行该命令:

java -Xms1G -Xmx1G -jar minecraft_server。jar nogui

当然,为了整合Minecraft服务器和安装应用程序的其余部分,你应该遵循一些额外的指令将. jar文件以及创建一个特殊Minecraft服务器上的用户将只有您显式地设置的权限。通过查看Minecraft Wiki,您可以查看这些指令和相关的启动脚本。

然而,为了简单起见,这里是Ubuntu指令,因为Linux服务器通常是首选的,Ubuntu很容易设置。

树莓派搭建Minecraft我的世界服务器

搭建你自己的Minecraft服务器,以及在树莓派上搭建Minecraft服务器。

为什么要折腾这个?

为什么要自己搭Minecraft服务器呢?限制于经费,在自己的服务器上玩Minecraft,不是随便谁都可以做的。搭建在服务器上,你可以让服务器一直运行,当你不玩的时候,你的朋友和家人还可以加入到游戏中,继续建造你的世界。你可以尝试修改游戏参数,制作mod,而且还能让你体验一把GM的感觉,这在公共服务器里可是做不到的,而且也不用花很多钱去租远程主机来做服务器。对于Minecraft狂热粉丝而言,搭建Minecraft服务器已经很有吸引力了。但是在树莓派上搭则会更有吸引力。小小的树莓派耗电非常少,你可以不间断地开着服务器,一年的电费也不过几块钱而已。只要一个树莓派,一张SD卡,花上一点时间设置一下,就能有一台全天候的Minecraft服务器,月运行费用只不过一条口香糖的价格。

——张天宇

0.需要的东西
​ 一个已经烧录好系统的树莓派,一台能够联网的PC。

1.针对Minecraft优化树莓派
​ 将系统分区拓展至整个SD卡分区,选择高级操作选项,拓展分区,重启。

2.安装Java环境
​ 如果你的树莓派不是官方镜像或者没有安装Java环境,请先配置。
​ 检查方法:

java -version
1
3.配置服务器
​ 首先,用下面的命令下载一份代码(建议mkdir新建一个文件夹放置):

sudo wget http://ci.md-5.net/job/Spigot/lastSuccessfulBuild/artifact/Spigot-Server/target/spigot.jar
// 这个链接可以一直用,因为它指向的是Spigot*新的稳定版
// 如果有任何问题,可以参考SpigotMC[http://ci.md-5.net/job/Spigot/]的下载页
1
2
3
​ 下载完成后,输入下面的命令:

sudo java -Xms256M -Xmx900M -jar /home/pi/mc/spigot.jar nogui
// 参数说明:内存将从256M开始分配,*大900M
// 这里将代码放置在了mc文件夹中
1
2
3
​ 接下来服务器启动,屏幕上会出现各种进度百分比。
​ 等上大概几分钟,程序会搭建服务器,生成地图,之后的启动会快很多,大概20-30秒。在命令行用“stop”就可以优雅地关掉服务器,然后你就可以重启服务器,找出问题在哪里。
​ 在上面的流程完成后,你就可以坐在电脑旁普通地玩Minecraft,启动程序,选择多人游戏。你会看到自己建的服务器,这是属于你自己的服务器。

祝大家玩的开心!
PS:目录下server.properties参数说明,可按需修改

// 以下是Minecraft服务器设置文件,true代表执行,false代表不执行。

Sun Mar 11 18:24:34 CST 2012 此为文件生成时间
// 是否开启地狱,不开启话地狱门将无效
allow-nether=true
// 地图文件夹名称,下界与末路之地将会自动以nether,ender加上并用下划线隔开
level-name=world
// 是否开启GameSpy4协议服务器监听器,用于获取服务器信息,国内应该用不上。
enable-query=false
// 是否允许飞行
allow-flight=false
// 远程访问服务器的密码,此项可以留空或删除
rcon.password=
// 服务器端口(25565为默认端口,联机时无需输入)
server-port=25565
// 第5行对应功能的端口
query.port=25565
// 地图类型,Default=默认,FLAT=超平坦,LARGEBIOMES=巨型生物群系
level-type=DEFAULT
// 是否开启远程访问服务器控制台。技术人员可选。
enable-rcon=false
// 地图种子,在生成地图文件夹之前填入此项,可生成特定的地图
level-seed=
// 服务器IP,不输入则为默认IP,内网用户的话请填内网IP
server-ip=
// *大建筑高度,上限是256,因为Chunk的高度*大值是256
max-build-height=256
// 是否生成NPC
spawn-npcs=true
// 是否开启白名单,没有白名单的玩家尝试进入服务器会被自动拒*
white-list=false
// 是否生成动物
spawn-animals=true
// 此处填写服务器默认材质下载链接,链接必须以.zip结尾
texture-pack=
// 用于给http://snoop.minecraft.net网站发送服务器数据,这样玩家可以从客户端上获取服务器信息,推荐关闭
snooper-enabled=false
// 是否开启*限模式,玩家死亡将自动被ban
hardcore=false
// 是否开启联网模式(正版专用,盗版必须改成false)
online-mode=false
// 是否开启PVP,不是战争服就不要开了
pvp=false
// 游戏难度,与单机相同
difficulty=1
// 玩家*次进入游戏时的游戏模式
gamemode=0
// 同时在线的*大玩家数
max-players=20
// 远程访问服务器的端口号,此项可以留空或删除
rcon.port=25575
// 是否生成怪物
spawn-monsters=true
// 是否生成建筑物(包括村庄和地牢)
generate-structures=true
// 可见距离,*大值为10
view-distance=10
// 服务器欢迎信息(显示在玩家联机页面),中文需中文补丁支持和转码,推荐EmEditor文本编辑器,自带转码功能。
motd=A Minecraft Server

Gitee 使用记录

1、生成公钥

官方模板:http://git.mydoc.io/?t=154712

1.1如何生成ssh公钥

你可以按如下命令来生成 sshkey:

  1. ssh-keygen -t rsa -C “xxxxx@xxxxx.com”
  2. # Generating public/private rsa key pair…
  3. # 三次回车即可生成 ssh key

查看你的 public key,并把他添加到码云(Gitee.com) SSH key添加地址:https://gitee.com/profile/sshkeys)

  1. cat ~/.ssh/id_rsa.pub
  2. # ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc….

添加后,在终端(Terminal)中输入

ssh -T git@gitee.com


若返回
Welcome to Gitee.com, yourname!

%title插图%num
https://gitee.com/profile/sshkeys

%title插图%num

如何创建密钥对,使用密钥登录服务器

在我们平时使用Linux系统时候,通常使用的Linux SSH登录方式是用户名加密码的登录方式,但是这种密码登录的方式很容易造成密码泄露或者被暴力破解,非常不安全,下面我们采用一种相对安全的登录方式—密钥登录;

我们知道SSH登录是用的RSA非对称加密的,所以我们在SSH登录的时候就可以使用RSA密钥登录,SSH有专门创建SSH密钥的工具ssh-keygen.

 

环境:A    机器为本地机器,    B   机器为服务器机器;

实现:A  ——-(免密登录)——>     B

创建密钥对
首先登录 A 的用户目录(/root/)查看有没有.ssh目录,如果没有目录则创建目录;

执行命令:mkdir /root/.ssh

%title插图%num

接下来执行创建密钥对命令,ssh密钥的创建OpenSSL的支持,如果没有安装OpenSSL需要先安装OpenSSL,命令如下

执行命令:apt install openssl

执行命令: ssh-keygen  -t  rsa  -b 4096

%title插图%num

出现如上图形状,表明此时密钥已经创建好了,密钥生成后会在当前目录下多出两个文件,id_rsa和id_rsa.pub,其中id_rsa是私钥,id_rsa.pub这个是公钥;

 

密钥创建好以后需要将公钥拷贝到 B 中的authorized_keys中,在 B 的/root/.ssh目录创建一个文件;

执行命令:touch authorized_keys

将A中创建好的公钥(id_rsa.pub)文件拷贝到B机器(/root/.ssh目录)中:

scp /root/.ssh/id_rsa.pub root@’B_ip’:/root/.ssh/      # B_ip为B机器的ip地址

cat  id_rsa.pub >> authorized_keys

至此,完成预期的目标了,A可以无密钥完美登录B机器;

注意:在执行拷贝的时候是>>而不是>,请将私钥拷贝到本地保存好,这将是你登录系统的唯一凭证;

(个人理解,不管在哪里创建密钥,被登陆的服务器端,都需要创建.ssh/authorized文件需要将创建好的公钥拷贝进去即可;)

注意:

如果添加秘钥后,ssh另一台机器仍需要输入密码才能登录;
应当将文件的权限改为:.ssh文件夹的权限为700,authorized_keys文件的权限为600。

 

修改登录权限
下面需要修改对应的sshd_config文件,这里面有四个需要注意的地方:

PermitRootLogin yes  是否允许root账户登录,yes代表启用 ,no禁用;
RSAAuthentication yes  使用rsa密钥默认开启
PubkeyAuthentication yes  使用pubkey登录,默认开启
PasswordAuthentication no   是否启用密码登录,yes代表启用,no是禁用
默认就按照上面操作即可,需要注意的是,4暂时开启,确保可以直接用密钥对进行登录后在进行设置;

 

(补充:)

其他 方式 实现无需要   互动操作  登录远程服务器的方法:

1,expect

#!/bin/bash
ip=x.x.x.x
user=root
password=xxx
expect <<EOF >>test.log
set timeout 10
spawn ssh $user@$ip
expect {
“yes/no” { send “yes\n”;exp_continue }                # 遇到yes/no反问句的时候,发送yes
“password” { send “$password\n” }                      # 当遇到输入密码的时候,将password变量值输入进去
}
expect “#” { send “cd /home/demoProject\n” }     # 登录到远程机器后在远程机器上执行命令
expect “#” { send “sh xx.sh $1\n” }
expect eof
EOF
echo “success!”                                                 #
exit 0

2、sshpass

这个需要安装下,apt-get install sshpass

实现方式:sshpass -p ‘xxx’ root@‘x.x.x.x’

3、通过   | (仅供参考(#^.^#))

例如:echo ‘password’ | root@’x.x.x.x’

linux 生成KEY的方法与使用

服务器A: 192.168.1.1

服务器B: 192.168.1.2

 

服务器A:

配置:

ssh-keygen -b 2048 -t rsa

#这里的-b 2048 是密钥加密的长度,*好设大点,有消息称美国有黑客解决 ssh的密钥进行破解。
#http://bbs.yuloo.com/thread-860154-1-1.html

直接回车3次

key文件会保存在/root/.ssh目录下

这时候.ssh目下会多出几个文件

id_rsa   私钥文件

id_rsa.pub  公钥文件,这个文件里的内容要放到其它主机里面去。

查看 id_rsa.pub  文件

cat /roor/.ssh/id_rsa.pub

 

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIcAvh6Lz9ghftghtfghSv+kSrxVLC9UDKq27mg5vhfghAaWcgFgllZhfg2DLnGotmeL/08bp6jMW/ekSq1BY1eiouiluiliuliul2Rr84x0bB5YShhpgJwuPbwr/pymgukyukyukyuthjkiytiliunzdfkuykyuIZgVvgPTzNdN/RDwJMsafsdvgsdsfsdfdsfsdaflozStYcWjrwzYxsroDPBy4zjd0gH5zMYhj+vS4OOAZZ8rtHEfx+sTE0= root@localhost.localdomain

 

 

 

服务器B:

配置:

新建文件夹与文件

mkdir /root/.ssh

vim /root/.ssh/authorized_keys

把A服务器上查看的KEY文件内容,复制到B服务器的authorized_keys中

主要是将root@localhost.localdomain修改为root@192.168.1.1 这样方便查看是哪台服务器的KEY,可能会有多台服务器的key。

 

修改sshd 的主配置文件,关闭密码认证登陆,使用key登陆。

vim /etc/ssh/sshd_config

找到 PasswordAuthentication yes

改成 PasswordAuthentication no

service sshd restart

 

 

测试:

在A服务器上执行

ssh root@192.168.1.2

首次登陆会需要你输入YES。看是不是不需要密码就可以登陆B服务了。