<commit_before>---
typora-root-url: ../
layout:     post
title:      各种疑难杂症（持续更新）
subtitle:   用于记录开发与运维过程中遇到的一些坑，希望可以帮助到有需要的人
author:     gsfish
date:       2019-11-14 19:00 +0800
header-img: img/post-bg-07.jpg
tags:
---

## JNI 多线程访问共享对象之方案

参考资料：

1. [How do you properly synchronize threads on the native side of a JNI environment](https://stackoverflow.com/questions/44420937/how-do-you-properly-synchronize-threads-on-the-native-side-of-a-jni-environment)
2. [Android JNI 编程实践](https://www.jianshu.com/p/9b83cc5a5ba8)

## ElasticSearch 过滤后聚合结果之方案

参考资料：

1. [ElasticSearch 如何先聚合后过滤](https://elasticsearch.cn/question/656)
2. [es 如何将聚合结果作为条件进行过滤](https://elasticsearch.cn/question/3581)

## PHP 报错：`Can't use function return value in write context`

原因：

PHP 5.5 以下的版本，只能向 `empty()` 函数传递变量，不能传递引用（函数等）

## MySQL 客户端连接本地服务器时无法指定端口

当目标地址为 `localhost`（默认）时，MySQL 客户端使用 unix socket 进行连接，需改为 `127.0.0.1`

参考资料：

1. https://serverfault.com/questions/306421/why-does-the-mysql-command-line-tool-ignore-the-port-parameter

## Docker for Windows 无法监听 2375 端口

`2375` 在 Windows 的保留范围内，使用前需将其排除

参考资料：

1. https://github.com/docker/for-win/issues/3546

## Windows 安装 mysqlclient 时失败

安装 Visual C++ Build Tools 2015、MySQL Connector C 6.1、MariaDB connector

将 MariaDB 安装目录下相应的文件复制到：

```
C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include\mariadb
C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\lib\mariadb
```

参考资料：

1. https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/
2. https://stackoverflow.com/questions/51294268/pip-install-mysqlclient-returns-fatal-error-c1083-cannot-open-file-mysql-h

## docker-compose 中的服务需要等待其他服务启动完成后再执行

使用 docker-compose 的 `healthchecks` 命令

参考资料：

1. https://stackoverflow.com/questions/31746182/docker-compose-wait-for-container-x-before-starting-y/41854997#41854997

## 在 Windows 运行 celery task 报错：`ValueError: not enough values to unpack (expected 3, got 0)`

celery 4.x 后不再支持 windows，问题与底层的 billiard 相关（拖了 2 年，曾有人提过修复的 PR，不过作者似乎并不愿意 “修复”）

解决方案（选其一）：

1. 设置环境变量：`set FORKED_BY_MULTIPROCESSING=1`
2. 使用 `- P eventlet/gevent/solo` 运行 celery

参考资料：

1. https://www.distributedpython.com/2018/08/21/celery-4-windows/
2. https://stackoverflow.com/questions/37255548/how-to-run-celery-on-windows/47331438
3. https://github.com/celery/celery/issues/4081
4. https://github.com/celery/celery/issues/4178

## 删除 git 仓库中的 submodule

git 本身没有提供相应的命令，可通过以下步骤手动实现：

```
git submodule deinit <path_to_submodule>
git rm --cached <path_to_submodule>
git commit-m "Removed submodule"
```

参考资料：
<commit_msg>update post<commit_after>---
typora-root-url: ../
layout:     post
title:      各种疑难杂症（持续更新）
subtitle:   用于记录开发与运维过程中遇到的一些坑，希望可以帮助到有需要的人
author:     gsfish
date:       2019-11-14 19:00 +0800
header-img: img/post-bg-07.jpg
tags:
---

## JNI 多线程访问共享对象之方案

参考资料：

1. [How do you properly synchronize threads on the native side of a JNI environment](https://stackoverflow.com/questions/44420937/how-do-you-properly-synchronize-threads-on-the-native-side-of-a-jni-environment)
2. [Android JNI 编程实践](https://www.jianshu.com/p/9b83cc5a5ba8)

## ElasticSearch 过滤后聚合结果之方案

参考资料：

1. [ElasticSearch 如何先聚合后过滤](https://elasticsearch.cn/question/656)
2. [es 如何将聚合结果作为条件进行过滤](https://elasticsearch.cn/question/3581)

## PHP 报错：`Can't use function return value in write context`

原因：

PHP 5.5 以下的版本，只能向 `empty()` 函数传递变量，不能传递引用（函数等）

## MySQL 客户端连接本地服务器时无法指定端口

当目标地址为 `localhost`（默认）时，MySQL 客户端使用 unix socket 进行连接，需改为 `127.0.0.1`

参考资料：

1. https://serverfault.com/questions/306421/why-does-the-mysql-command-line-tool-ignore-the-port-parameter

## Docker for Windows 无法监听 2375 端口

`2375` 在 Windows 的保留范围内，使用前需将其排除

参考资料：

1. https://github.com/docker/for-win/issues/3546

## Windows 安装 mysqlclient 时失败

安装 Visual C++ Build Tools 2015、MySQL Connector C 6.1、MariaDB connector

将 MariaDB 安装目录下相应的文件复制到：

```
C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\include\mariadb
C:\Program Files (x86)\MySQL\MySQL Connector C 6.1\lib\mariadb
```

参考资料：

1. https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/
2. https://stackoverflow.com/questions/51294268/pip-install-mysqlclient-returns-fatal-error-c1083-cannot-open-file-mysql-h

## docker-compose 中的服务需要等待其他服务启动完成后再执行

使用 docker-compose 的 `healthchecks` 命令

参考资料：

1. https://stackoverflow.com/questions/31746182/docker-compose-wait-for-container-x-before-starting-y/41854997#41854997

# Celery Task 中无法创建子进程

解决方案：

使用 `billiard.context.Process` 代替 `multiprocessing.Process`

参考资料：

1. https://github.com/celery/celery/issues/4551

## 在 Windows 运行 celery task 报错：`ValueError: not enough values to unpack (expected 3, got 0)`

celery 4.x 后不再支持 windows，问题与底层的 billiard 相关（拖了 2 年，曾有人提过修复的 PR，不过作者似乎并不愿意 “修复”）

解决方案（选其一）：

1. 设置环境变量：`set FORKED_BY_MULTIPROCESSING=1`
2. 使用 `- P eventlet/gevent/solo` 运行 celery

参考资料：

1. https://www.distributedpython.com/2018/08/21/celery-4-windows/
2. https://stackoverflow.com/questions/37255548/how-to-run-celery-on-windows/47331438
3. https://github.com/celery/celery/issues/4081
4. https://github.com/celery/celery/issues/4178

## 删除 git 仓库中的 submodule

git 本身没有提供相应的命令，可通过以下步骤手动实现：

```
git submodule deinit <path_to_submodule>
git rm --cached <path_to_submodule>
git commit-m "Removed submodule"
```

参考资料：

{'fraction_non_alphanumeric': 0.13718755962602558, 'fraction_numerical': 0.06506391909940851, 'mean_word_length': 4.437759336099585, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 27, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '350247', 'n_tokens_mistral': 2762, 'n_tokens_neox': 2715, 'n_words': 402}