[已解决] windows 编译 C 报错 error mutex in namespace std does not name a type

Windows 下 编译C/C++ 程序报错:error: ‘mutex’ in namespace ‘std’ does not name a type 怎么解决,换MinGW

问题

编译C++程序时,报错:

error: 'mutex' in namespace 'std' does not name a type

解决否

以解决

方案

这个是 Windows 安装的 MinGW 多线程选择问题,这里需要的是posix版本,而不是win32的多线程方案。

在使用 mingw x64 install 程序时,选择

install

参考

  • https://www.jianshu.com/p/c3411fe5b19c
  • https://stackoverflow.com/questions/14191566/c-mutex-in-namespace-std-does-not-name-a-type

[已解决] golang go test 是遇到报错 call has possible formatting directive %v

golang 运行 go test 时 遇到报错 call has possible formatting directive %v 怎么解决

Println call has possible formatting directive %v

go test 中使用 fmt.Print(“%v”) 报错

问题

Println call has possible formatting directive %v

go test 中不能使用 fmt.PrintLn(“%v”, v)

解决否

已解决

方案

使用 fmt.Printf(“%+v”, v)

[待解决] gRPC 访问 Nginx 时 access_log nginx PRI * HTTP/2.0

gRPC 访问 Nginx 时 access_log nginx PRI * HTTP/2.0 怎么调整策略呢

nginx PRI * HTTP/2.0

问题

通过Nginx 代理 gRPC 服务,其他 client 通过 Nginx 访问后端服务时,后端的 gRPC服务没收到任何请求,发现access_log 是如下信息:

10.0.2.2 - - [24/Sep/2000:08:14:31 +0000] "PRI * HTTP/2.0" 400 173 "-" "-"

检查你的 nginx/conf.d/grpc_proxy.conf 是这样的:

server
{

    listen 443 ssl http2;
    server_name _;
    index index.php index.html index.htm;
    root  /usr/share/nginx/html/;

    ssl                     on;
    ssl_certificate         /etc/nginx/cert/server.pem;
    ssl_certificate_key     /etc/nginx/cert/server.key;
    ssl_session_timeout     5m;
    ssl_protocols           TLSv1.2;

    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES2...';

    location / {
        proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "keep-alive";
        proxy_set_header    X-Real-IP $remote_addr;

        if (!-f $request_filename) {
             proxy_pass http://127.0.0.1:8080;
        }
    }

解决否

已解决

方案

我估计你的证书没有被信任,你可以去掉证书试试, 调整后的 nginx/conf.d/grpc_proxy.conf 的配置如下

server
{
    listen 443 http2;

    root  /usr/share/nginx/html/;

    access_log  /var/log/nginx/access_grpc_proxy.log;
    error_log /var/log/nginx/error_grpc_proxy.log;

    location / {
        # Replace localhost:50051 with the address and port of your gRPC server
        # The 'grpc://' prefix is optional; unencrypted gRPC is the default

        # grpc_pass grpc://127.0.0.1:8080;
        proxy_pass http://127.0.0.1:8080;
    }
}

这里我们去掉了nginx的ssl封装。这样就好了。

client 证书

或者你检查下 gRPC client 是否使用了正确的证书,nginx 拦截了流量没到proxy端,估计就是请求认证有问题。

参考

  • https://www.nginx.com/blog/nginx-1-13-10-grpc/

记一次PHPStorm Xdebug Docker PHP 调试问题

记一次PHPStorm Xdebug Docker PHP 调试问题

背景

在这之前一直在用 Virtual Box 上的 Ubuntu v16.04.4 虚拟机在做测试环境,随着项目增加,12G硬盘大小的虚拟机会经常报磁盘已满,不断的删日志才能维持工作。于是我就想着再开一台虚拟机,硬盘设置个20G,(还是这么小气)。用的 ubuntu1 v16.04.10,(为啥不上ubuntu18,这个虚拟机软件太老装新系统,发现有性能问题,估计有指令不兼容问题)

我的是Mac环境,(之前也用过Windows)Virtual Box(后简称vbox),装好Ubuntu后,配置NAT网络,就开始装Docker软件,安装步骤是严格按照官网的步骤来的。
https://docs.docker.com/v17.09/engine/installation/linux/docker-ce/ubuntu/#install-using-the-repository

好吧,我承认我的环境有点非主流。这是有历史原因的。

开始造

安装好vbox、ocker,配置好Docker mirror,就开始用docker-compose 拉起测试环境。

Docker Remote API

开始在PHPStorm配置第二台Docker。这里遇到了很多次connection refused。我参考这为老哥的方法一,配置怎么都不生效。换第二个方案就好了。这是第一个坑。

将ubuntu那的 docker Daemon API 端口映射到Vbox nat网络上,我就不细讲了

得到Connection Successful的结果后。开始进行下一步。

PHPStorm php 运行环境

开始配置 PHP :: CLI Interpreter.

选择远程 Docker, Server 选择我们刚刚配置好的 server,在选择我们要调试的 php容器,(这个容器是在 php:7.1.21-cli-jessie 基础上构建的)。

然后就遇到这个问题:

 failed to parse validation script output

phpstorm_helper

当时出问题,没截图,这是网上找了个报错信息一样的图

通过搜索发现需要一个phpstorm_helper docker镜像。

于是在另外一台Ubuntu虚拟机上 docker save, 再到现在Ubuntu 上 docker import 搞定。

再点击刷新还是 failed to parse validation script output
然后,就又是在百度,谷歌,必应~~~
~~~

PHPStorm<->Docker 抓包

还是无果,去洗了下脸,想起网上有人用抓包定位这个问题。我这本地的PHPStorem和vbox里面的Docker Daemon通信就是用的tcp啊。

打开Wireshark,抓包。

通过抓包发现,PHPStorem 与 Docker 之间的请求就是:1.获取当前所有镜像,2.基于你选择的PHP镜像,来创建一个容器。3.运行容器,4.获取容器输出,5.删除容器。根据那一行红色的报错信息,我估计是在运行容器时,输出的内容不是phpstorm预期的,导致报错。由于最后一个操作是删除容器,我就不好调查这个创建的容器到底咋回事了。

于是就抓包,并模拟请求,在删除命令前止住。这样来调查这个创建的容器。

创建容器请求

转换为curl命令:

$ curl -X POST --header "Content-Type:application/json" http://127.0.0.1:52376/v1.24/containers/create -d '{"AttachStdin":true,"OpenStdin":true,"Env":["JETBRAINS_REMOTE_RUN=1"],"Cmd":["-dxdebug.remote_enable=0","/opt/.phpstorm_helpers/phpinfo.php"],"Entrypoint":["php"],"Image":"sha256:292111a5a867f13da8759d3388908b376cf455ecaece86785ea97e9b46f5255f","Volumes":{},"ExposedPorts":{},"HostConfig":{"Binds":["/Users/paulxu/Jumei/compose/portia/php/phpspider:/opt/project:rw"],"Links":[],"LogConfig":{"Type":null,"Config":null},"VolumesFrom":["abeb0f2ead37c672b838726ff9bef51bb1011235c8712dc687f7b7135610cbb2:rw"]}}'

这里的image的id是,作为PHP脚本运行的镜像的ID。

接触容器

对应curl命令:

$ curl -X POST --header "Content-Type:application/json" http://127.0.0.1:52376/v1.24/containers/f434099c2157c1a0cabea5131d9c2a5b8d809cc1e1289abcffb95eb7cf7fc4d0/attach?stdin=true&stdout=true&stderr=true&stream=true

这里的容器ID是上一个创建容器请求的返回值。

开始运行容器

curl 命令:

$ curl -X POST --header "Content-Type:application/json" http://127.0.0.1:52376/v1.24/containers/f434099c2157c1a0cabea5131d9c2a5b8d809cc1e1289abcffb95eb7cf7fc4d0/start

获取输出内容

转换为Curl命令:
curl -X POST –header “Content-Type:application/json” http://127.0.0.1:52376/v1.24/containers/f434099c2157c1a0cabea5131d9c2a5b8d809cc1e1289abcffb95eb7cf7fc4d0/wait

  • 我去看了下老环境的输出如下:

通过docker ps -a,找到通过api创建的容器

检查容器的日志

如下是新环境容器的报错信息:

Could not open input file: /opt/.phpstorm_helpers/phpinfo.php

我在打包的时候,记得是没有往镜像里打包这个文件的。通过查阅刚刚抓包的API参数,发现他有把一个容器作为磁盘挂载在这个新容器上。

来通过docker inspect [container ID] 检查两个容器有何不同。

如下是有问题的镜像

如下是正常的容器。

通过对比,我估计PHP容器所挂载的磁盘容器有问题。

检查容器磁盘

接下来我又细致检查了两个作为磁盘的容器。

如下是有问题的容器。

如下是正常的容器。

这两个作为磁盘的容器都是基于 phpstorm_helpers:PS-181.5281.35镜像构建的。都是基于同一个容器构建的会有什么问题呢?

接下来我检查了下 IMAGE ID,不一样。怎么会不一样呢。我查了下我的命令命令历史记录, docker savedocker import

结案

哦,这, saveloadexportimport。 我命令搞混了。在新环境删除了错误的镜像。重新让PHPStorm检查下就好了。

附上成功图:

Synergy-core 编译 使用 教程

Synergy 是一款非常棒的跨平台 鼠标、键盘、剪切板共享软件,不过GUI版本1.8.8停留在x32位,且不免费。所以转投Synergy-core 开源版,在此分享一下编译x64位,以及使用心得

Synergy

Synergy是一个跨平台的 鼠标、键盘、剪切板共享软件,支持Windows,Mac,Linux主流桌面平台。今天我就手把手把这个软件分享给大家。

如果你在用两台电脑,你是如何在他们之间传输文件的,又是如何切换键盘鼠标的,诚然我知道Windows官方出的鼠标有 无界 功能。今天我介绍的synergy软件,你用了之后,你就再也不用在微信的 文件传输助手 上互传文件了,直接在这个电脑复制,在另一个电脑上粘贴!不受硬件限制,只要两台电脑ip互联互通。

无界鼠标由于是微软出品的,所以只支持 Windows 平台,安装包也是 MSI 文件格式。

Synergy-core 是开源的cli程序.

官网:https://symless.com/synergy

开源地址:https://github.com/symless/synergy-core

下载

GUI版程序只能官网付费上下载,没有登陆App Store, 还有点需要注意1.8.8及以前的版本都是32位的程序,所以这次来折腾下64位的开源版。

Mac OS Cotalina 开始,就完全不能运行32位的程序了

安装

如果是官网下载Synergy GUI版,那双击就完事了。

编译

这里说下github上开源的core版本,编译,安装。

Mac OS 环境

安装依赖,编译软件,编译,安装:

# Install Homebrew

## 安装相关编译软件
$ brew install cmake
$ brew install qt
$ brew install openssh
$ brew install git

## 检查qt 安装信息,以及目录,等下需要用到 /usr/local/Cellar/qt/5.15.0/Frameworks/
$ brew info qt

## 添加一个环境变量
$ export CMAKE_PREFIX_PATH="/usr/local/Cellar/qt/5.15.0/Frameworks/"

# 下载源码并进入源码目录
$ git clone https://github.com/symless/synergy-core.git
$ cd synergy-core
$ mkdir build
$ cd build
## 准备编译参数
$ cmake -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk  -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_OSX_ARCHITECTURES=x86_64 
## 编译
make

Windows 编译

这里我在Windows 环境安装了 最新Qt,和 Visual Studio community 2019.

Add C:\Qt\Tools\QtCreator\bin to the system PATH

Set CMAKE_PREFIX_PATH environment variable
C:\Qt\5.12.5\msvc2017_64

$ cd Projects\synergy
$ mkdir build
$ cd build
$ call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
$ cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=Debug ..
$ msbuild synergy-core.sln /p:Platform="x64" /p:Configuration=Debug /m
$ cd ..
$ copy ext\openssl\windows\x64\bin\* build\
$ cd Projects\synergy-core
$ mkdir build
$ cd build
$ call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
$ cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Debug ..
$ msbuild synergy-core.sln /p:Platform="x64" /p:Configuration=Debug /m

Linux 编译

$ cd Projects/synergy
$ mkdir build
$ cd build
$ cmake ..
$ make

编译成功,会生成3个可执行文件。编辑后产物在:

./synergy-core/build/bin/

可执行文件

synergy-core

命令行程序:synergy-core, synergyc, synergys.

Synergy Core v1.x

对于1.x版本,client,server是两个程序,也就是分别对应:synergyc,synergys。

OS Command
Windows synergyc [server IP]
macOS ./synergyc [server IP]
Linux ./synergyc [server IP]
OS Command
Windows synergys -c [path to config file]
macOS ./synergys -c [path to config file]
Linux ./synergys -c [path to config file]

Synergy Core v2.x

v2.x,server,client 都是一个程序了,通过不同的命令来确定自己的职责。

OS Command
Windows synergy-core --client [server IP]
macOS ./synergy-core --client [server IP]
Linux ./synergy-core --client [server IP]
OS Command
Windows synergy-core --server -c [path to config file]
macOS ./synergy-core --server -c [path to config file]
Linux ./synergy-core --server -c [path to config file]

Command help

通过一下命令:

$ ./synergyc --help
$ ./synergys --help

你能获取v1.x synergy的帮助信息,但是v2.x不知道是不是忘了把这个加上。

$ ./synergy-core --help     ## 不会显示帮助信息

所以我就把它应有的帮助信息放这里了。

Options for synergy-core --client

Usage: synergy-core --client [--yscroll <delta>] [--daemon|--no-daemon] [--name <screen-name>] [--restart|--no-restart] [--debug <level>] <server-address>

Connect to a synergy mouse/keyboard sharing server.

  -d, --debug <level>      filter out log messages with priority below level.
                             level may be: FATAL, ERROR, WARNING, NOTE, INFO,
                             DEBUG, DEBUG1, DEBUG2.
  -n, --name <screen-name> use screen-name instead the hostname to identify
                             this screen in the configuration.
  -1, --no-restart         do not try to restart on failure.
*     --restart            restart the server automatically if it fails.
  -l  --log <file>         write log messages to file.
      --no-tray            disable the system tray icon.
      --enable-drag-drop   enable file drag & drop.
  -f, --no-daemon          run in the foreground.
*     --daemon             run as a daemon.
      --yscroll <delta>    defines the vertical scrolling delta, which is
                             120 by default.
  -h, --help               display this help and exit.
      --version            display version information and exit.

* marks defaults.

The server address is of the form: [<hostname>][:<port>].  The hostname
must be the address or hostname of the server.  The port overrides the
default port, 24800.

Options for synergy-core --server

Usage: synergy-core --server [--address <address>] [--config <pathname>] [--daemon|--no-daemon] [--name <screen-name>] [--restart|--no-restart] [--debug <level>]

Start the synergy mouse/keyboard sharing server.

  -a, --address <address>  listen for clients on the given address.
  -c, --config <pathname>  use the named configuration file instead.
  -d, --debug <level>      filter out log messages with priority below level.
                             level may be: FATAL, ERROR, WARNING, NOTE, INFO,
                             DEBUG, DEBUG1, DEBUG2.
  -n, --name <screen-name> use screen-name instead the hostname to identify
                             this screen in the configuration.
  -1, --no-restart         do not try to restart on failure.
*     --restart            restart the server automatically if it fails.
  -l  --log <file>         write log messages to file.
      --no-tray            disable the system tray icon.
      --enable-drag-drop   enable file drag & drop.
  -f, --no-daemon          run in the foreground.
*     --daemon             run as a daemon.
  -h, --help               display this help and exit.
      --version            display version information and exit.

* marks defaults.

The argument for --address is of the form: [<hostname>][:<port>].  The
hostname must be the address or hostname of an interface on the system.
The default is to listen on all interfaces.  The port overrides the
default port, 24800.

If no configuration file pathname is provided then the first of the
following to load successfully sets the configuration:
  $HOME/.synergy.conf
  /etc/synergy.conf

配置

GUI的配置就不讲了,这里说下cli程序的配置。

原文在这里Synergy Text Config,我这里简单提一下。然后按照我给的模版来改改就能用,需要特殊定制可看看官方wiki,或者留言问我。

Synergy 的配置文件基本格式:

section: ''name''
    ''args''
end

配置类型有4大类:

  • screens
  • aliases
  • links
  • options

aliases

定义 host name 和 屏幕命名的关系。

那么如何获取 host name呢?

mac os 环境下:

$ hostname
## 或者
$ echo $HOSTNAME

screens

定义我们的屏幕,命名,以及在操作各个屏幕时,是否响应一些特殊按键。

Windows,Linux,Mac 都有各自的特殊按键,如win, command, meta按键等,如果不是跨平台,都不需要做特殊处理。

links

定义各个屏幕之间的排列方位,这个很重要。

{left|right|up|down}[<range>] = name[<range>]

关于range参数就比较有意思了,合理配置可是下如下效果。

section: links
     moe:
         right        = larry
         up(50,100)   = curly(0,50)
     larry:
         left         = moe
         up(0,50)     = curly(50,100)
     curly:
         down(0,50)   = moe
         down(50,100) = larry(0,50)
 end

实现了:

#       +-----------+  
#       |   curly   |  
#       |           | 
#       +-----------+ 
# +----------+ +----------+
# |    moe   | |  larry   | 
# |          | |          | 
# +----------+ +----------+ 

也就是在curly屏幕时,鼠标往左下滑,会滑到moe屏幕,往右下滑,会滑到larray屏幕。

options

其他选项,例如定义心跳间隔,屏幕切换粘连时间,

配置样例

好的还是来一个大而全的配置文件例子吧。

启动一个Synergy-core server,配置文件是必须的!

Example textual configuration file
This example comes from doc/synergy-basic.conf

# sample synergy configuration file
#
# comments begin with the # character and continue to the end of
# line.  comments may appear anywhere the syntax permits.
# +----------+  +---------+ +---------+
# | mac-mini |  | macbook | | windows |
# |          |  |         | |         |
# +----------+  +---------+ +---------+

section: screens
    # three hosts named:  mac-mini, macbook, and windows
    # These are the nice names of the hosts to make it easy to write the config file
    # The aliases section below contain the "actual" names of the hosts (their hostnames)
    mac-mini:
    macbook:
    windows:
end

section: links
    # windows is to the right of macbook
    # mac-mini is to the left of macbook
    macbook:
        right(0,100) = windows # the numbers in parentheses indicate the percentage of the screen's edge to be considered active for switching)
        left  = mac-mini
        # shift = shift (shift, alt, super, meta can be mapped to any of the others)

    # macbook is to the right of mac-mini
    mac-mini:
        right = macbook

    # macbook is to the left of windows
    windows:
        left  = macbook
end

section: aliases
    # The "real" name of windows is John-Smiths-windows-3.local. 
    # If we wanted we could remove this alias and instead use John-Smiths-windows-3.local everywhere windows is above. 
    # Hopefully it should be easy to see why using an alias is nicer
    macbook:
        Pauls-MBP.local
    mac-mini:
        jumei-deMac-xp-mini.local
end

section: options
    switchDelay = 400   # 鼠标滑到边缘时,提留多久才能切换屏幕
    clipboardSharing = true # 共享剪切板
    clipboardSharingSize = 10000    # 剪切板共享字节大小限制,单位:千字节
end

启动

## 启动服务端
$ ./synergy-core --server --address 172.20.50.25:24800 --no-daemon --name macbook --config ./synergy.conf

## 启动其中一个客户端
$ ./synergy-core --client --no-daemon --name mac-mini 172.20.50.25:24801

常见问题

问题1:FATAL: An error occurred: assistive devices does not trust this process, allow it in system settings.

这是应为你运行命令行程序调用了系统的敏感接口,所有报错了。你需要给这个命令行软件授予权限.

也就是说,你用iTerm运行Synergy-core,就给iTerm授权,你用系统terminal运行的就给terminal授权。

我用的Mac,就在 系统偏好设置 > 安全性隐私 > 隐私 为其配置上。

权限授予

如果是第一次授权,一般会有个弹窗,你按照弹框点进去就行了。

问题2: synergy-core[66198:16759205] pid(66198)/euid(501) is calling TIS/TSM in non-main thread environment, ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!

你是不是还启动 Synergy GUI 程序,把它关掉就好了。

总结

synergy-core程序用着还不错,虽然配置麻烦了一点,不过鼠标,键盘映射都没问题,复制粘贴(图片都能跨屏幕传)也都正常。不过还没试过跨macos,windows使用过。试了再回来

参考

  • https://github.com/symless/synergy-core/wiki
  • https://my.oschina.net/k4nz/blog/4337405
  • https://apple.macx.cn/thread-2174542-1-1.html