作者归档:jinzhao

Python ctypes获取当前所有打开窗口title

Python pywin32获取当前所有打开窗口title

import ctypes
 
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
 
titles = []
def foreach_window(hwnd, lParam):
    if IsWindowVisible(hwnd):
        length = GetWindowTextLength(hwnd)
        buff = ctypes.create_unicode_buffer(length + 1)
        GetWindowText(hwnd, buff, length + 1)
        titles.append(buff.value)
    return True
EnumWindows(EnumWindowsProc(foreach_window), 0)
 
print(titles)

同理访问所有内部窗口

def foreach_window(hwnd, param):
        if IsWindowVisible(hwnd):
                length = GetWindowTextLength(hwnd)
                buff = create_unicode_buffer(length + 1)
                GetWindowText(hwnd, buff, length + 1)
                titles.append(buff.value)
        return True
win32gui.EnumChildWindows(mainwnd, foreach_window, None)
print(titles)

Win32 Python: Getting all window titles

pycharm 2018.2 debug remote docker超级慢

开始以为是app的问题,排查后发现是新版pycharm 有问题。退回2017.3

问题环境是:Flask latest版本,docker-compose运行在远端。flask在pycharm开启debug运行后会卡在第二次reloader中。

其它运行等都没有影响

对Flask 初始化过程的 profile

如果是普通的flask页面profile建议使用WSGI Application Profiler

它会自动分析每一个页面,并profile,内部也是cprofile实现。

针对初始化过程只能手动使用cProfile:

python -m cProfile -o profiling run_web.py

等到初始化完毕再进入python ide:

>>> import pstats
>>> stats = pstats.Stats(‘profiling’)
>>> stats.sort_stats(‘time’).print_stats(10)

 

Flask Debug模式下总是初始化两遍

这个如果是在debug模式下出现一般是跟reloader特性有关系,WERKZEUG提供的这个特性主要是方便实时监测到开发中修改的文件,比重启app要快很多。但是有的时候我们希望app或者部分代码指启动一遍,可以用下面的环境变量来监测是否是第二次reload中的初始化。

if not app.debug or os.environ.get(“WERKZEUG_RUN_MAIN”) == “true”

组件初始化我们也希望初始化一遍,flask对此有一个专门的事件:

@app.before_first_request
def initialize():
print “Called only once, when the first request comes in”

docker network 网络服务发现和内嵌的dns系统

docker-compose的启动会默认创建一个bridge类型的网络,当然它跟默认的bridge是继承关系。最近升级ide和docker后发现服务之间出现了个现象,服务能ping的通但是别名就不可以。而更改的地方就是网络模式network_mode  设置为了bridge。

原来当使用default bridge network的情况下,docker container使用宿主机的resolv.conf,当然不会解析服务名了。从1.10开始docker对自建的网络默认启用embedded dns,这个dns会自动更新新分配的服务。

docker network create mynet  //不指定网络模式时默认是bridge

用mynet替换原先的bridge即可。如果在一个网络内可以用服务名来访问比如ping service_name,如果不是可以通过ping service_name.devnet

mysql docker 日志输出时区修正

docker通常修改 -v /etc/localtime:/etc/localtime就可以修改系统时间,但是mysql日志输出时间还是没变,因为它的时间默认是UTC时间,修改需要更改mysql的配置。增加启动参数:–log_timestamps=SYSTEM

完整示例:

docker run -e MYSQL_ROOT_PASSWORD=root -v /etc/localtime:/etc/localtime:ro  -d mysql:5.7 –log_timestamps=SYSTEM

wordpress 用WP-CLI解决更新慢的问题


wordpress的升级非常方便,就是不适合国情,之前多试几次总会成功的,最近老是失败,删除了几次lock后发飙了。

对了如果没有安装SSH SFTP Updater Support的话,请先装好他,wp原生的太弱,还不加密,咱升级的重要原因不就是因为漏洞太多么,还没侵入性,因为ssh肯定有啊。win OS请走开,xx空间请走开。

然后就是主角WP-CLI了,这个东西太好了,有了它就算上面的升级失败也有终极方法了,命令行终究是万能的,甩UI几条街。安装请移步:WP-CLI

 wp plugin install 插件名

 wp core update #wordpress升级
奇怪的就是这种升级非常快,如果下载慢重来一次,如果实在下载不了可以拷贝下载链接用迅雷下载后直接安装。
 wp plugin update --all #wordpress 插件升级
 wp media regenerate --yes #重新生成wordpress多媒体文件

PHP 7.1开始放弃mcrypt

PHP7安装mcrypt失败。

最近更新docker镜像发现这个问题,搜索半天居然没有解决,原来从7.1开始mcrypt就被放弃了。因为它的依赖10年前就停止更新了。好吧放弃需要他的组件即可。