Jump to Navigation

Welcome!

  NullGet是使用Qt编写的,运行于多种平台的GUI界面的多线程多协议断点续传下载软件。  使用NullGet可以轻松下载网络的多种协议的数据流,加快下载速度,支持断点续传,目前支持的协议有:HTTP,HTTPS,FTP,MMS,RTSP。而且它能运行于当前大多数流行的操作系统,包括Windows,Linux,FreeBSD等。     下载NullGet

  NullFXP 是一个基于Qt 4 开发的SFTP/FTP 客户端软件。目前已经实现基本的多文件上下传功能。详细信息查看本站项目说明页面。     下载nullfxp

  我们的目标是打造一个开源的,跨平台的,多线程的,运行稳定的下载软件,另一个就是整理Qt库开发跨平台GUI应用程序的相关资料。欢迎各位朋友对本站开源项目提供意见及建议,欢迎有兴趣的朋友参与本站开源项目,请联系 drswinghead at gmail dot com

thrift-php暴内存深坑填坑

thrift-php暴内存深坑填坑

起因

项目中一次偶然的端口错误配置,导致thrift-php的客户端请求到了http的端口上,然后fpm进程内存超限异常退出。

至于如何查到这个问题,在一个大项目中定位也不容易。不过再此不多展开,多看nginx日志,php日志还是管用的。

复现

在更短的代码中复现问题能够更容易的定位问题。

拿git.apache.org/thrift.git/tutorial/php/PhpClient.php示例代码稍微改一下即可。

修改的部分:

use Thrift\Transport\TFramedTransport;   // 开始位置添加一行

 $socket = new TSocket('10.88.128.15', 8000);    // 在原$socket之后直接添加一行,这里的端口是http协议的

  $transport = new TFramedTransport($socket, true,true);  // 在原$transport之后直接添加一行

这时候执行就等着进程暴内存崩溃吧。php PhpClient.php:

Category:

笔记软件https协议逆向汇总

笔记软件https协议逆向汇总

为啥现在就记录未完成的工作

从现在看,预期工期特别长,先记录,再继续后续工作。

起因

最近使用evernote,更新到6.6发现不能正常同步笔记。

然后突然想自己做的笔记软件,就不会出现这种问题了。

但是,毕竟对GUI客户端开发也不熟悉,遇到UI的开发还是很头痛的。

而且如果一个笔记软件的GUI客户端做的不顺手,那是没法用的,达不到随手快速记录的目的,也就没有什么意义。这个想法基本放弃了。

后来,想起来为知笔记客户端有个开源版本,考虑着也许可以在这个开源客户端基础改一个自己的版本出来,配合自己的笔记服务端使用。

这个想法看起来不错,然后动手改为知笔记开源客户端源代码中的HTTP API 地址,用go语言的martini+xorm写了个模拟的笔记server端(当然只是个壳子),发现可行。然后从代码和试验中实现了一些为知的API模拟版本,基本实现的笔记创建,修改,删除,以及附件的功能,功能上后面再说。

同时支持RPC与Pub/Sub的系统选型

可以说这是两种使用方式,同时支持的系统并不多。简单看一下选型。

dbus

一个项目,两种功能同时支持。而且支持的很好,很稳定。

Linux 桌面程序必备。

grpc + NATS/NSQ

grpc 实现的 RPC 非常好。

NATS/NSQ 实现的 Pub/Sub 非常好。

结合使用,效果还是可以的。

grpc 的进一步封装

grpc 首要功能是 RPC 调用,对 Pub/Sub 没有显式的API支持。

但是可以在 grpc streaming 的基础上扩展实现一个 Pub/Sub。

当然,那就是要开发一下子了。

其他

还有其他一些项目,也未能很好的融合这两个功能。遇到再更新本文吧。

如果希望能够更好的替换,可以三种方式都实现,再抽象成一个统一的接口。

Category:

由windows上链接现象不同引出的golang CGO跨平台用法总结

由windows上链接现象不同引出的golang CGO跨平台用法总结

在开发一个项目时,碰到一种用法,是在C++中调用go编写的静态库,而在go中又需要回调C++函数。

1、第一种解决办法,简单方式(后来证明windows上不支持)

这种方式,就是在C++中实现了这个函数之后,在go中extern一下这个函数,

在go源代码中就可以直接调用这个函数了。

注:当然这里的函数签名要用extern "C"声明的,否则在go中无法调用到。

这种有一个问题,不能用在windows上,windows上在链接静态库时,必须要所有的符号都存在,

而前面提到的是extern方式,实际符号并不存,导致编译失败。

2、第二种办法,通用方法,但比较繁索一点。好像这是唯一可行的跨平台的通用方式了。

在go代码中声明一个函数指针,和一个设置该函数指针值的函数,和一个调用该函数指针的函数,例如,

Category:

msvc2017编译Qt5.7.1(支持Windows XP) (mingw-x64 gcc-6.3/7.1 qt5.7.1)

msvc2017编译Qt5.7.1(支持Windows XP) (mingw-x64 gcc-6.3/7.1 qt5.7.1)

最近做了点Qt + Windows程序,对最近的Qt情况的一点总结。

Qt也不准备继续支持Windows XP了,Qt5.7.0是官方公开支持的最后一个版本,包括Qt5.7.1都不行。

这里我标题说的没错,本文指的确实是Qt5.7.1,由于同为Qt5.7.x系统,源代码树变动不大,做了个小的调整,能够像Qt5.7.0一样支持Windows XP。

新版本兼容Windows XP宏定义

从vs2012 update4开始,发布了支持Windows XP的解决方案,

vs安装包的名字为:对 C++ 的 Windows XP 支持

msvc2017, USING_V141_SDK71

msvc2015, USING_V140_SDK71,

msvc2013, USING_V120_SDK71,

msvc2012, USING_V110_SDK71,

两个socket相关问题

检测socket关闭

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <time.h>

int isclosed(int sock) {
  fd_set rfd;
  FD_ZERO(&rfd);
  FD_SET(sock, &rfd);
  struct timeval tv = { 0 };
  select(sock+1, &rfd, 0, 0, &tv);
  if (!FD_ISSET(sock, &rfd))
    return 0;
  int n = 0;
  ioctl(sock, FIONREAD, &n);
  return n == 0;
}

close a running process's socket

sudo gdb -p 10029 --batch -ex 'call close(4)'

Go 语言 select代码块的执行过程:(译)

Go 语言 select代码块的执行过程:(译)

1、求值所有的channel和可能会发送的值,从上到下,从左到右。

2、随机排序所有的case分支(默认分支当作特殊case)。The corresponding channels of the orders may be duplicate. 默认分支总是放在最后的位置。

3、排序所有的channel以避免下一步的死锁。排列列表中不存在重复的channel。

4、锁定上一步中涉及的所有的channel。

5、以随机的case分支顺序轮循每个分支:

1、如果对应的channel操作是“发送值到关闭的channel”,解锁所有的channel并panic。进入12步。

2、如果对应的channel操作是非阻塞的,执行该channel操作并解锁所有 的channel,然后执行对应的分支。
该channel操作可能唤醒另量个阻塞的goroutine。进入12步。

3、如果分支是默认分支,那么解锁所有的channel并执行分支。进入12步。

macos+linux启动修复

grubx64.efi 拷贝到 /dev/disk0s1/EFI/BOOT/BOOTX64.EFI

启动时OPTION,进入EFI BOOT菜单,即为grub界面了。

这种方式没有使用refind启动管理器。

或者也可以把refind_x64.efi拷贝到/dev/disk0s1/EFI/BOOT/BOOTX64.EFI,

重启动时OPTION,进入EFI BOOT菜单,即为refind界面了。

好像 不太管用啊?
2017-02-16 05:03:32 https://bbs.archlinux.org/viewtopic.php?id=171883&p=16
I've found a workaround for the "HC died" issue is to add "usbcore.old_scheme_first=1" as boot kernel parameter.

grpc与http2的关系

grpc与http2的关系

grpc client 发送包到原生的http2 server

client收到报错:

panic: rpc error: code = 9 desc = transport: received the unexpected content-type "text/html; charset=UTF-8"

server端输出:

输出正常,包括了http2的所有信息,默认情况下响应了404。

golang CGO FAQ & TIPS : cgo 从 C 传递 slice 到 go

cgo 从 C 传递 slice 到 go

这里一般会用在c的callback中。

需要加一个wrapper,比直接调用go函数中间多了一个转换步骤,但方便了许多。

执行流程为,c调用发起 -> c wrapper -> go export

.go:

//export a_function_callback
 func a_function_callback(args []C.astruct) {}

.c:

页面

订阅 www.qtchina.tk RSS


Main menu 2

by Dr. Radut