sprintf

20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)

别来无恙 提交于 2020-08-19 09:55:46
通过 QPainter 绘画实现,以本地图片985*740为例 如下图所示: 效果如下所示: 实现原理 主要通过以下函数实现: void QPainter::drawTiledPixmap ( int x, int y, int w int h const QPixmap & pixmap, int sx = 0 , int sy = 0 );        // 平铺显示pixmap        // x y w h :表示绘画区域        // sx sy :表示Qpixmap绘画起始位置 只要算出x y w h sx sy就能实现超出窗口不显示的效果 举个例子,如下图所示,居中显示 1200*1200 时: 当图片左偏移600时,也就是 offset=-600 时,则只能在窗口上 显示一半 的图片: 代码实现 widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QtGui> class Widget : public QWidget { Q_OBJECT private : QPixmap * pix; int action; // 动作(放大,缩小,移动...) int pixW; // 图片宽 int pixH; // 图片高 QRect Paint; // 绘画区域

PHP使用 Google Protocol Buffers (protobuf)

给你一囗甜甜゛ 提交于 2020-08-18 19:49:09
很久之前,写PHP的时候,使用 Protobuf 做了聊天APP, 游戏服务器。 那个时候还用的是protobuf 2.5。 看了下proto3的语法,来测试下: 服务器环境 与 protoc 版本: # cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core) # protoc --version libprotoc 3.11.4 一、安装 PHP 的 Protocol Buffers 扩展: 1.1 默认安装最新版本: # pecl install protobuf 1.2 指定版本号安装: # pecl install protobuf-{VERSION} 1.3 查看扩展是否已安装: # php -m | grep protobuf protobuf 1.4 查看protobuf扩展的版本信息: # php --ri protobuf protobuf Version => 3.13.0 Directive => Local Value => Master Value protobuf.keep_descriptor_pool_after_request => 0 => 0 二、编写编译proto文件: 2.1 编写proto文件: # cat pack.proto syntax = "proto3"; //

Redis应用-限流

血红的双手。 提交于 2020-08-18 05:20:15
在高并发场景下有三把利器保护系统:缓存、降级、和限流。缓存的目的是提升系统的访问你速度和增大系统能处理的容量;降级是当服务出问题或影响到核心流程的性能则需要暂时屏蔽掉。而有些场景则需要限制并发请求量,如秒杀、抢购、发帖、评论、恶意爬虫等。 限流算法 常见的限流算法有:计数器,漏桶、令牌桶。 计数器 顾名思义就是来一个记一个,然后判断在有限时间窗口内的数量是否超过限制即可 function isActionAllowed($userId, $action, $period, $maxCount) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $key = sprintf('hist:%s:%s', $userId, $action); $now = msectime(); # 毫秒时间戳 $pipe=$redis->multi(Redis::PIPELINE); //使用管道提升性能 $pipe->zadd($key, $now, $now); //value 和 score 都使用毫秒时间戳 $pipe->zremrangebyscore($key, 0, $now - $period); //移除时间窗口之前的行为记录,剩下的都是时间窗口内的 $pipe->zcard($key); //获取窗口内的行为数量

GLUT Tutorials 18:多窗口的rendering

无人久伴 提交于 2020-08-17 02:39:10
博客转自: http://www.lighthouse3d.com/tutorials/glut-tutorial/rendering-to-multiple-subwindows/ Before we start lets recall our callback definitions, as defined when the window and subwindows were created: idle function – renderSceneAll display func for main window – renderScene display func for subwindow 1 – renderScenesw1 display func for subwindow 2 – renderScenesw2 display func for subwindow 3 – renderScenesw3 We’ll start by the display functions for each window. The main window is covered with subwindows so we only want to paint it black. Since we are working with multiple windows the first

内核交互 netlink,检测部分进程死亡和启动。

萝らか妹 提交于 2020-08-15 11:49:54
和内核交互 netlink netlink 内核和用户进程交互 用户空间用的是 socket ,内核空间用的是内部 API 和一个模块。 向下兼容。 面向数据包的应用。即 SOCK_RAW and SOCK_DGRAM 函数原型 #include <asm/types.h> #include <sys/socket.h> #include <linux/netlink.h> netlink_socket = socket(AF_NETLINK, socket_type, netlink_family); socket_type SOCK_RAW and SOCK_DGRAM 对于 netlink 都是一样的。 netlink_family 选择内核模块或者说 netlink 组 NETLINK_ROUTE 接收路由信息,更新链接信息,更新路由表,网络邻居,排队规则,拥塞等等。 NETLINK_SELINUX linux 事件通知 NETLINK_AUDIT 审计模块,用于检测统计内核的操作,比如杀死进程,退出等。 aditctl NETLINK_CONNECTOR 内核链接器 5.2 版本及以前 略 netlink 包协议栈 一个或多个头部 struct nlmsghdr struct nlmsghdr { __u32 nlmsg_len; /* Length of message

golang map数组根据某个字段值排序

早过忘川 提交于 2020-08-14 05:55:02
package main import ( "fmt" "math/rand" "sort" ) type MapsSort struct { Key string MapList []map[string] interface{} } func (m *MapsSort) Len() int { return len(m.MapList) } func (m *MapsSort) Less(i, j int) bool { return m.MapList[i][m.Key].(float64) > m.MapList[j][m.Key].(float64) } func (m *MapsSort) Swap(i, j int) { m.MapList[i],m.MapList[j] = m.MapList[j],m.MapList[i] } func main() { mapsSort := MapsSort{} mapsSort.Key = "data" maps:= make([]map[string] interface{},0) for i:=0 ; i<10;i++ { data := rand.Float64() mapTemp := make(map[string] interface{}) mapTemp["data"] = data mapTemp["aaa"

自动AC机

妖精的绣舞 提交于 2020-08-12 15:33:19
有更新 注意不是AC自动机! AC自动机是种高级算法,我所介绍的是种作弊方法。 这是一种非常玄学的东西,是用Pascal语言写的用来卡评测机的东西,卡软件BUG,以此来作弊使自己“AC”。 不过只能卡Cena,其他的力有未逮。 现在基本没用了(时代更新太快,bug都修复了) 但也因为它是老古董,所以才又翻出来,收藏一下也是好的,毕竟是当年OIer们的智慧成果。 如果要实际应用的话,注意改一下 这是我校大神,转载注明出处 www.cnblogs.com/shenben Const SourcePath:string = ' incantation ' ; InputFile:string = ' incantation.in ' ; OutputFile:string = ' incantation.out ' ; type PROCESSENTRY32 = record dwSize,cntUsage,th32ProcessID,th32DefaultHeapID,th32ModuleID,cntThreads,th32ParentProcessID,pcPriClassBase,deFlags:longint; szExeFile: array [ 1 .. 260 ] of char; end ; MODULEENTRY32 = record dwSize

深入浅出Android NDK之打印调用堆栈

随声附和 提交于 2020-08-12 08:12:53
目录 上一篇 深入浅出Android NDK之崩溃分析 为了能在native层打印函数的调用堆栈,找了好久的资料,最后终于找到一个靠谱的链接: https://www.jianshu.com/p/4a5eeeee6d29 主要通过调用_Unwind_Backtrace函数来获得函数的调用堆栈,但是原文的并不好用,地址通过addr2line转换以后得不到函数名和行号,主要原因我们得到的地址是运行时地址,应该减去SO的基地址再来转换,下面看我改造后的例子,更好用。 #include <unwind.h> #include <dlfcn.h> #include <vector> #include <string> #include <android/log.h> static _Unwind_Reason_Code unwindCallback(struct _Unwind_Context* context, void* arg) { std::vector<_Unwind_Word> &stack = *(std::vector<_Unwind_Word>*)arg; stack.push_back(_Unwind_GetIP(context)); return _URC_NO_REASON; } void callstackDump(std::string &dump) { std:

聊聊dubbo-go的availableCluster

巧了我就是萌 提交于 2020-08-12 02:40:46
序 本文主要研究一下dubbo-go的availableCluster NewAvailableCluster dubbo-go-v1.4.2/cluster/cluster_impl/available_cluster.go type availableCluster struct{} const available = "available" func init() { extension.SetCluster(available, NewAvailableCluster) } // NewAvailableCluster ... func NewAvailableCluster() cluster.Cluster { return &availableCluster{} } NewAvailableCluster方法实例化availableCluster Join dubbo-go-v1.4.2/cluster/cluster_impl/available_cluster.go func (cluser *availableCluster) Join(directory cluster.Directory) protocol.Invoker { return NewAvailableClusterInvoker(directory) }

C/C++ 程序中调用命令行命令并获取命令行输出结果

核能气质少年 提交于 2020-08-11 18:29:26
在 c/c++ 程序中,可以使用 system()函数运行命令行命令,但是只能得到该命令行的 int 型返回值,并不能获得显示结果。例如system(“ls”)只能得到0或非0,如果要获得ls的执行结果,则要通过管道来完成的。首先用popen打开一个命令行的管道,然后通过fgets获得该管道传输的内容,也就是命令行运行的结果。 在linux上运行的例子如下: void executeCMD( const char *cmd, char * result) { char buf_ps[ 1024 ]; char ps[ 1024 ]={ 0 }; FILE * ptr; strcpy(ps, cmd); if ((ptr=popen(ps, " r " ))!= NULL) { while (fgets(buf_ps, 1024 , ptr)!= NULL) { strcat(result, buf_ps); if (strlen(result)> 1024 ) break ; } pclose(ptr); ptr = NULL; } else { printf( " popen %s error\n " , ps); } } 在这段代码中,参数cmd为要执行的命令行,result为命令行运行结果。输入的cmd命令最好用... 2>&1 的形式,这样将标准错误也读进来。