crifan的折腾精神、学习能力和逻辑能力的体现



说明

crfian的学习能力

折腾IP代理池的过程

第一次折腾IP代理池时,对于各种相关概念不了解,连想要选购合适产品都不容易。

但是通过一些IP代理池服务商的网站产品的简单介绍:

自己悟出和理解出相关含义和区别,并整理出来了:

然后就可以购买和使用合适自己需求的代理了:

快速整理数控系统相关知识

之前不了解数控系统,得知一需求是系统找个开源的cad系统,集成到现有数控系统。

经过简短(1,2小时级别的)整理后,即可:

详见:

快速整理华为LiteOS基本资料

从没听过LiteOS,到有人问,自己花点时间简单搜索和整理后,即可整理出相关基本资料:

【整理】华为物联网操作系统:Huawei LiteOS

-》证明自己的搜索资料能力、整理和归纳资料能力、逻辑和结构能力还不错。

crifan的折腾精神==解决复杂问题的能力

下面整理出crifan的折腾各种复杂问题的过程。

其中部分内容额外体现了需要:

才容易从发现问题细节,找到问题根源,最终解决问题。

硬件

Netgear R6220路由器 变砖尝试修复的过程

虽然最后没有把变砖的路由器救活,但是期间能够从网上繁杂的信息中,找到真正的串口的位置,以及最终买电烙铁和找到并买到合适的ttl的线,也算是不容易了。

详见:

嵌入式

交叉编译

对于cygwin下编译buildroot时libtool的配置期间出错的折腾

先后尝试了可算达到上百个点了。

相比而言,之前的折腾时遇到比较多的,也就三五十个尝试的点,也就把问题搞定了。

期间有几次都打算放弃了,但是后来还是坚持继续找问题原因,最终功夫不负有心人,终于搞定了:

详见:

上层软件

iOS逆向

实现抖音反越狱检测,使得成功点赞和关注

现象:

希望实现iOS版抖音的反越狱检测,最终实现越狱iPhone手机中的抖音新注册账号可以点赞和关注

注:普通越狱手机,新注册抖音号,无法点赞和关注

折腾过程:

最大的心得:

最终,所以再复杂的技术问题,都是可以搞定的,最多就是过程比较曲折而已。

iOS的tweak中hook syscall时可变参数传递始终异常最终发现是递归调用死循环

现象:

用Logos的%hookf去hook syscall函数,需要计算出原先可变参数的个数,传递给%orig的syscall函数。但是始终出错。

折腾过程:

核心要点:

以上几条,缺一不可,否则都无法找到错误原因,无法解决问题

详见:

Android逆向

小花生的app的破解

详见:

搞懂少儿趣配音的请求中sign和auth_token参数值计算逻辑

能最终

主要过程是:

详见:

爬取趣配音APP的show的detail

详见:

Xcode

Xcode调试iPhone报错:Could not launch failed to get the task for process

现象:

XCode调试iOS的app到iPhone,结果报错:Could not launch,failed to get the task for process

折腾过程:

要点:

详见:

Xcode调试iPhone报错:Unable to install

现象:

折腾过程:

要点:

详见:

Python后端

之前已发送成功的kafka消息数据丢失的原因

最后发现是之前默认参数配置是:数据只保留7天,所以超过时间,过期后,就会被删

虽然结论很简单,但是找原因和结论的过程,需要:

详见:
【已解决】kafka之前确定已保存的数据现在没了丢失了是怎么回事
【已解决】Kafka中数据被删和和被保留的策略和逻辑
【整理】学习Kafka基础知识和基本概念和逻辑

CentOS7中安装Python的pycurl和PySpider的pipenv的pycurl

期间各种折腾,遇到各种问题

最后才发现,其实涉及到了多个环境:

最终解决问题的关键点之一是:

最后不仅解决了问题,还整理出心得了:

期间的过程详见:

Azure的token出错:Out of call volume quota

如果只是从问题的表面现象,很难想到根本原因。

幸好是从繁杂的信息中,找到了一个帖子,有个提示。

经过尝试最终发现是这个原因:

微软Azure,打着鼓励你用免费F0套餐,且免费的额度很多很多,但是实际上你使用了一点点后,就不给你继续使用,就告诉你超额了。然后你只能升级换成收费的套餐,才能正常继续使用。

详见:

找出supervisor+gunicorn的gevent单worker的Flask的app中额外的2个进程是从哪里来的

虽然用gunicorn的gevent解决了Flask的app的单例问题,但是却发现另外还有2个线程,导致单例失效

而对于为何有这两个线程,其实开始是一点头绪是没有的。

而足够多的折腾精神和敏锐,让我找到了个思路:

可以从另外2个线程的log信息中,找到所对应的文件

这样就可以找到最开始打印log的文件

对于找到最终的线程的来源,应该会有帮助。

然后就找到了都是:

common/FlaskLogSingleton.py

log.info("LoggerSingleton inited, logSingleton=%s", logSingleton)

所打印出来的log:

[2018-08-30 13:28:35,272 INFO 26049 MainProcess 139969090553664 MainThread FlaskLogSingleton.py:54 <module>] LoggerSingleton inited, logSingleton=<common.FlaskLogSingleton.LoggerSingleton object at 0x7f4d0add4080>

然后根据自己之前的代码,反推出,应该是别的模块中,调用了:

from common.FlaskLogSingleton import log

而触发上述的log的。

但是import log的地方也很多,并不容易找到是哪里的最开始引入的,以及也不容易因此就发现线程是如何创建的。

只是经验加上直觉,觉得最大的嫌疑是:

和Flask的app,感觉逻辑上属于并列的关系的celer

-》因为:

supervisor去管理和部署Flask的APP之外,还管理了celery:

[program:robotDemo_CeleryWorker]
command=/root/.local/share/virtualenvs/robotDemo-dwdcgdaG/bin/celery worker -A resources.tasks.celery

[program:robotDemo_CeleryBeat]
command=/root/.local/share/virtualenvs/robotDemo-dwdcgdaG/bin/celery beat -A resources.tasks.celery --pidfile /var/run/celerybeat.pid -s /xxx/robotDemo/runtime/celerybeat-schedule

猜测其中的:

celery worker -A resources.tasks.celery

celery beat -A resources.tasks.celery

导致了另外两个的process的产生

接着后来再去找更多的日志信息,最后发现:

/celery-beat-robotDemo_CeleryBeat-stderr.log

[20180830 01:28:35 INFO 26049 MainProcess 139969090553664 MainThread FlaskLogSingleton.py:54 <module>] LoggerSingleton inited, logSingleton=<common.FlaskLogSingleton.LoggerSingleton object at 0x7f4d0add4080>

和:

celery-worker-robotDemo_CeleryWorker-stderr.log

[20180830 01:28:35 INFO 26052 MainProcess 140308360062784 MainThread FlaskLogSingleton.py:54 <module>] LoggerSingleton inited, logSingleton=<common.FlaskLogSingleton.LoggerSingleton object at 0x7f9c08e71048>

验证了之前的推测:

因为对应的log的第一条,就是我们之前找到的import log而输出了logSingleton的日志信息:

celery-beat-robotDemo_CeleryBeat-stderr.log

[20180830 01:28:35 INFO 26049 MainProcess 139969090553664 MainThread FlaskLogSingleton.py:54 <module>] LoggerSingleton inited, logSingleton=<common.FlaskLogSingleton.LoggerSingleton object at 0x7f4d0add4080>

celery-worker-robotDemo_CeleryWorker-stderr.log

[20180830 01:28:35 INFO 26052 MainProcess 140308360062784 MainThread FlaskLogSingleton.py:54 <module>] LoggerSingleton inited, logSingleton=<common.FlaskLogSingleton.LoggerSingleton object at 0x7f9c08e71048>

而其中:

就是最早发现的3个进程中的其中2个Process的ID的值:

[2018-08-30 13:28:37,129 INFO 26049 MainProcess 139969090553664 MainThread tasks.py:118 <module>] inited gMsTtsTokenSingleton=<resources.tasks.MsTtsTokenSingleton object at 0x7f4d0b32e128>
[2018-08-30 13:28:38,078 INFO 26063 MainProcess 140140210039848 MainThread tasks.py:118 <module>] inited gMsTtsTokenSingleton=<resources.tasks.MsTtsTokenSingleton object at 0x7f74ea6d9710>
[2018-08-30 13:28:39,545 INFO 26052 MainProcess 140308360062784 MainThread tasks.py:118 <module>] inited gMsTtsTokenSingleton=<resources.tasks.MsTtsTokenSingleton object at 0x7f9c09443908>

最终,而找到了:

除了supervisor+gunicorn去启动了Flask的app是单个Process之外:

supervisor还启动了Celery的worker和beat,这2个额外的Process

共3个线程,从而导致,虽然Flask的app中是单个Process,单例正常工作,

但是加上额外2个Process,导致单例失效:每个Process中初始化的实例都不同,无法保证单例的效果了。

总结:

此处之所以能够从大量的log日志中,最终分析找到产品额外2个进程的原因,主要是靠:

先是要了解自己写的代码的逻辑关系:此处涉及到近10个文件,以及好几个配置文件

其次要足够仔细和认真:要能否思路活跃,看到相关的日志信息后,能够实现基本的逻辑推理

一定的敏感度:能否在推理的基础上,思维活跃,偶尔联想到,猜到,可能和其他哪些模块有关系

最终通过 熟悉代码+足够认真+思维敏感 而找到问题原因并解决。

详见:

折腾Flask-RQ2 + Redis

在折腾:

期间,就在迷茫的时候 能想到去试试

rq worker

最终明白flask-rq2是需要rq worker的后台服务才能工作的

之前类似错误,简单的就已通过:

【已解决】pyspider运行出错:ImportError pycurl libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other) – 在路上

就解决了。

而此处的问题,是同事另外一台Mac。

折腾和尝试了各种思路和方向,都没有结果,详见:

【已解决】Mac中pipenv中运行PySpider出错:ImportError pycurl libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)

而此处真正对解决问题的有帮助的点是:

除了之前已有的类似的经历,还要加上:

之前经历过2种类似和相关问题:

【已解决】pyspider运行出错:ImportError pycurl libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other) – 在路上

【已解决】Mac中编译安装pycurl失败:error: command ‘gcc’ failed with exit status 1

还要加上足够细心和敏感才能注意到:

【已解决】Mac中编译安装pycurl失败:error: command ‘gcc’ failed with exit status 1

中是用的LibreSSL

以及也注意到了旧Mac中用的是OpenSSL

由此才能想到可能是openssl内部调用的库,不同:

以及又(有想要去了解新技术的动力,所以才)去找了相关的解释:

tls – What are the main advantages of using LibreSSL in favor of OpenSSL – Information Security Stack Exchange

然后看到提到了是10.11的OS X之后也换用了LibreSSL

所以才想到这个点,可能是解决问题的方向

->最终经过升级Mac系统到最新版本Mojave而真正解决问题。

总结起来就是说:

能解决此问题有很多必要因素:

爬虫

PySpider中模拟访问小花生接口其他参数都正确但始终是500 Internal Server Error

详见:

Charles抓包https的过程

其中包括:

网上更多的人说安卓手机中安装Charles证书时,类型选择WLAN,结果被坑了,最后是换成少数人提到但是自己没试过的:VPN和应用,最后才正常安装证书,但是还不是安装到受信任凭据的系统中,而是用户中,以为没用,但是后来发现是有用的

-》规避了必须要root安卓手机的问题

-》也可以实现普通的https抓包解密未明文的效果了

最后把完整的操作步骤和中间遇到的大大小小的坑,都详细记录并整理到帖子里了,详见:

并且,后续又遇到:

部分https能抓包,但是其他特殊https无法抓包

期间也试了试其他路:找改安卓app的旧版本,希望万幸可以没有https的ssl pinning,最后失败

从:

Charles proxy fails on SSL Connect Method – Stack Overflow

以及其他一些帖子,基本上确定了此处无法破解的https是ssl pinning

而关于ssl pinning的办法,网上很多帖子,各种说法都很复杂,包括从apk逆向工程得到代码,再改动代码去破解的,所以放弃这些复杂的办法。

Android Security: SSL Pinning – Matthew Dolan – Medium

提到了之前Charles调试期间看到的,那个特殊的https是OkHttp,也知道旧版本貌似有bug

但是此处是最新的okhttp/3.10.0,没bug,所以也无法破解,也找不到其他相关的的办法。

后来终于找到一个相对解释的比较全的帖子,其中介绍了破解的办法:

Four Ways to Bypass Android SSL Verification and Certificate Pinning

但是却也没有给出有效且方便的办法。

而方便的办法,则是之前很多帖子中,断断续续提及的,包括这里也提到了:

如何对使用了ssl pinning的APP(如知乎)进行抓包? – 知乎

以及Android Security: SSL Pinning – Matthew Dolan – Medium 然后才知道,对于破解ssl pinning的办法:

通过

知道的:

但是需要去root手机才行

然后对于手上的手机想办法去root:

那么实在不行,考虑去购买个,便宜点的,比如1000以内中低端手机,应该都可以root的

然后就去研究便宜的可以root的安卓手机

结果发现,通过网上很多个root工具的支持机型,再去找手机,都找不到,因为都是旧型号手机,现在京东和天猫等都买不到了

再去单独从京东或天猫中找最新出的,1000以内的手机,再去找每个手机是否方便root,结果却又发现原本以为的常见的品牌,包括小胡,华为,中兴,Oppo,Vivo等等手机,却要么是之前可以root,但是最新都不支持了,比如华为的,之前可以申请解锁现在不支持了,要么是太贵了,总之现在都不论便宜和贵的,都很难买到一个手机,确保能顺利root的。

所以放弃。

后来的后来,突然想起来:去淘宝买个二手的手机吧,结果无意间发现,有人卖这种二手老手机且帮忙弄好root的手机,所以就去买二手的小米4,卖家帮忙先root好(其实自己也可以用工具去root,因为都是老的安卓系统,很多现有root工具都支持root的)

不过后来,突然想到:

貌似听某些人说,Charles的代理,也可以用安卓模拟器的

以及如何对使用了ssl pinning的APP(如知乎)进行抓包? – 知乎又提到了安卓模拟器,所以才想到另外这条路:

找个安卓模拟器,这样应该就容易解决root的问题了

最后经过尝试,在Mac中好用的,支持Wifi网络设置Charles的代理的,支持root权限的安卓模拟器是夜神安卓模拟器,

其中还有个细节:夜神模拟器的Wifi直接点击也无法设置代理,无意间(也包括之前自己用过Android,巧了有过类似精力)长按Wifi,才找到Wifi代理设置的

之后的路,就相对不那么难了,但是还有点小小曲折:

正常去夜神模拟器中安卓Charles的证书,

正常去模拟器中通过apk安装安卓的app

模拟器中安装xposed框架,结果最开始安装的夜神应用中心(按理说,系统自带的应用市场,肯定是最匹配,且效果最好的),安装的是5.1.1版本,结果后来证明是不兼容,不支持此夜神模拟器的

后来的后来,即使从官网或别处下载到正确的4.4的版本,去安装,也还是有问题

最后是自己意识到,可能需要先卸载已有的版本再安装才可以?

试了下先卸载5.1.1.的Xposed,再安装支持4.4的Xposed,终于可以正常安装了。

最后的最后,终于可以绕开ssl pinning,实现特殊的https也可以抓包解密看到明文了。

详见:

注:后来又去整理出独立的教程了:

在线服务器中Selenium模拟bing必应搜索始终报错StaleElementReferenceException

现象:

在线服务器(无GUI的CentOS7)中,Selenium模拟必应搜索返回搜索结果后,查找元素提取内容时,经常报错:
ERROR:root:selenium open https://cn.bing.com/ exception: Message: stale element reference: element is not attached to the page document (Session info: headless chrome=92.0.4515.131)
内部发生了异常:StaleElementReferenceException

折腾过程:

最终解决办法:

from selenium import webdriver

换成:

`from seleniumwire import webdriver`

根本原因:暂时未知。

感觉像是:
此处把Selenium安装了Selenium-wire后,导致内部的 获取WebElement的逻辑,从local变成了remote的了?
导致后续再去获取WebElement,经常性发生,获取不到,或者是:
element is not attached to the page document
导致此处报错。

重点:

相关内容:

自动化测试

利用库、优化库、优化依赖底层库的能力:facebook-wda、WebDriverAgent

不仅有利用库的能力,还有优化库的能力,甚至还有优化库所依赖的底层的服务端的库的能力:facebook-wda、WebDriverAgent

对于之前折腾的iOS的自动化测试自动化抓包
对于技术的能力等级,至少可以分这几层:

我自己现在:

关于已实现的level 1,2,3的相关帖子:

以及后续有个更加实际的例子:

对于获取页面xml源码速度极其慢的优化过程:

直到最后的:

期间涉及了多个层次的内容:

以及:

想要彻底解决此处问题,中间所需各种能力,缺一不可。

python的wda获取页面源码xml时报错超时15秒

能解决此处问题,需要:

详见:

红米Note8Pro的uiautomator2自动抓包工具初始化问题

uiautomator2初始化红米Note8Pro,报错:

发生异常: OSError
[Errno Uiautomator started failed.] https://github.com/openatx/uiautomator2/wiki/Common-issues: 'adb shell am instrument -w -r -e debug false -e class com.github.uiautomator.stub.Stub com.github.uiautomator.test/android.support.test.runner.AndroidJUnitRunner'

其实此处很难从现象中,直接看出错误的原因。

需要自己具有足够的技术敏感度,加上及时想到之前的类似经验:


grant permissions
入手,怀疑是:
权限问题
-》再去查证,uiautomator2相关的内容(ATX和com.github.uiautomator.test)是否有安装
-》通过最近安装时间排序发现,果然没有安装
-》从而确认,此处是没有安装成功uiautomator2相关内容
-》而最直接的,最可能的原因是:权限问题
-》从而去找,哪里可以设置权限
-》从之前 微信中对于网页用浏览器打开,弹框中需要安装QQ浏览器时,都会弹出一个,好像叫做:允许位置来源去安装应用
-》怀疑就是这个 允许未知来源 去安装应用方面的权限
-》但是设置中却始终找不到
-》无意间,也注意到,USB调试中,有选项比较像是有关系的,发现是:

-》最终证实,的确是此处的:USB安装,起了效果
-》使得log中的:

[I 200217 14:45:37 init:330] Install com.github.uiautomator, com.github.uiautomator.test 2.1.1
[I 200217 14:45:38 init:300] - app-uiautomator.apk installed
[I 200217 14:45:38 init:300] - app-uiautomator-test.apk installed
[I 200217 14:45:38 init:308] Install atx-agent 0.8.2
[I 200217 14:45:39 init:342] Check atx-agent version
Successfully init AdbDevice(serial=hmucaei75ptk7szs)

去安装ATX和com.github.uiautomator.test,才得以正常的通过USB安装
注:此处手机和Mac是USB连接的
-》从而才得以正常继续调试。

期间需要:

详见:

uiautomator2的dump_hierarchy只能导出微信公众号搜索结果的部分页面源码

折腾过程中的值得一提的是:

相关:

adb install apk经常卡死

现象:
adb install xxx.apk
偶尔会卡死在:
Performing Streamed Install
卡死的频率:之前是很偶尔,且容易解决:USB数据线拔插一下等手段,即可搞定
后来变成,经常卡死,很难解决。

经过一番折腾,包括但不限于:

详见:

数据库

MongoDB无法连接

期间,要有足够的技术敏感度,才能及时想到可能的原因,然后才能证实和快速解决。

详见:

Web前端

WordPress中登录wp-login死循环

现象是,crifan.com的WordPress尝试登录后台管理页面wp-admin,跳转到登录页wp-login,输入正确用户名和密码后,竟然还是回到登录页,之后就是死循环,始终处于登录页了。

经过了很多方面的尝试:

最终才通过:

然后去:

最终才解决掉,登录页死循环的问题。

对此问题,折腾了足够多方面,尝试了足够多可能,都快要打算放弃了,幸好在最后一刻,终于找到原因,并解决掉了

详见:

nginx的https的ssl证书无效,https域名的网页地址打不开

nginx中配置了https的ssl证书,结果始终不起效果,打开https的地址 https://www.naturling.com/ 始终出现:

无法访问此网站,拒绝了我们的请求。
请尝试以下办法:
检查网络连接
检查代理服务器和防火墙

之类的错误

-》经过一点点问题的排除,包括但不限于:

cert和key的文件访问权限:从root改为nginx的www用户和组

ssl的各种参数配置,包括listen 80和listen,server_name,ssl_ciphers等等等等

-》最终发现:

nginx在listen 443同时如果加入了80,则http页面是可以打开的,有access的log的

-》但是https的访问,始终没有log

-》好像是https的请求,根本都没进入nginx

-》所以才怀疑是不是端口问题

-》但是阿里云的ECS的安全组中,已确保了添加了443端口了

(本身新建ECS时勾选了默认系统建了安全组就包括优先级110的443,担心有影响,又自己新建一个更高的优先级1的443的规则,且删除了系统的443规则)

但是还是不行。

-》最终是:(去CentOS中用firewalld去)添加防火墙规则,允许https的443端口入方向被访问
才使得https地址 https://www.naturling.com/ 能正常打开。

详见:

相关:

wordpress主页菜单加指示条

折腾期间,能想到利用:

网址是wordpress,然后再去搜wordpress中是否有和当前页面方面的标示,还真的巧了找到了current-menu-item

之后,才能通过css去控制current-menu-item,达到要显示的效果。

详见:

enfold-child子主题中手机端顶部菜单点击显示异常

开始时最直接的反应,以为是以为缺少什么css呢,所以就去对比css,一点点的找,到底是哪些css不同而导致的异常

后来对比调试+细心发现,加上了is-active后,菜单可正常显示,说明不是缺少css

(重点:如果不是细心发现其实只是加上is-active即可,不知道后续还要在错误道路上,继续调试css多久)

而最开始想要调试,也没法调试,是无意间搜到网上帖子,得知是Enfold的avia-merged-styles-f39bxxxx773.css这种是合并后的

所以想到了,是不是可以有合并的参数设置,后来果然找到了

然后取消合并后,得到分别的独立的css(以及js)

从而后续可以单独看到js源码调试了

(重点:如果不是找到取消合并,则后续无法准确调试js到底执行了什么)

后来以为avia.js中的burger_wrap.click的代码执行有误呢,然后经过添加log日志,最终确定代码没问题

期间看到了加上了is-active,但是后来又没了

以为是jquery的AddClass失效了呢

而期间调试了N多次,始终有问题。

后来是第二天无意间重启了Mac的web server即mamp后,本地代码好像正常工作了

(重点:如果不是重启mamp,还不知道要继续浪费多少时间)

才调试发现

burger.addClass(“is-active”);

是正常执行的,是的确添加了is-active的class

而执行了后面的:

htmlEL.addClass(“av-burger-overlay-active”);

却导致菜单不正常显示的

就以为是:html的class中加了av-burger-overlay-active导致其他什么css生效,导致不正常显示呢

后来发现这个是正常现象

后来继续对比调试。以为是:

burger_wrap.click的 e.preventDefault();

没有执行到,导致burger_wrap.click被执行了2次

后来发现不是,而是通过Chrome调试期间,细心的注意到了:

前后的两个avia.js是enfodl父主题和子主题enfold-child两个独立的文件的相同函数

(重点:如果不是注意到是两个不同文件的avis.js中的burger_wrap.click,则解决问题的方向就偏了,还不知道要继续花多少时间才能回到正确方向上)

不是同一个avia.js中的两次执行相同的函数

从而确定是由于先后两次加载了都带burger_wrap.click的avai.js,而导致burger_wrap.click被执行了2次

最终经过Beyond Compare对比发现,enfold-child本身配置是相同的,而新旧两个Enfold主题,是版本不同,所以问题还是出在enfold主题。

然后自己通过间接的注释掉enfold-child的avia.js,才规避问题。

具体过程详见:

Antd Pro中前端列表页面loading加载很慢

antd pro中,前端页面中列表的loading很慢:

开始就知道后端Django有一次性返回所有页面的数据,而不是当前页面数据的问题

但是发现好像是antd pro的loading的绑定有问题,后来发现不是

又以为和antd pro的yield 或call有问题,发现也不是

又以为是js的fetch有问题,发现早就返回response了

又以为是fetch后的response去json()数据量大时,很耗时

结果去花精力解决了后端Django只返回当前页数据后,依旧很慢,发现不是json()慢

再后来是,antd pro的reactjs前端的js的console的log 和 Django的后端的api请求 联合对此,最终发现:

Django后端的代码耗时太长,很多的mysql的查询和其他操作,导致很慢

具体点就是:

所以加起来要8,9秒。

所以需要去优化原有的处理逻辑:

详见:

已正确配置DNS解析sxl.cn中的naturling.com官网但是还是无法打开

解决问题的核心点:

详见:

小程序

小程序页面空白出错:SyntaxError Unexpected EOF

关键点:

即使知道原因是:MongoDB中某些text中有特殊字符,导致显示小程序json解析出错,导致页面无法显示的问题

但是如果不懂这个是不可见的控制字符,以及如何去除,以及应该去掉哪些,那也是没法彻底的(去写代码,批量)解决问题的。

详见:

多平台

electron中zmq.node报错

报错信息:

Uncaught Error: A dynamic link library (DLL) initialization routine failed.
\\?\D:\dev\DevRoot\mitmdumpurlsaver\electron-python-example\node_modules\zerorpc\node_modules\zeromq\build\Release\zmq.node
  at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:166:20)
  at Object.Module._extensions..node (module.js:671:18)
  at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:166:20)
  at Module.load (module.js:561:32)
  at tryModuleLoad (module.js:504:12)
  at Function.Module._load (module.js:496:3)
  at Module.require (module.js:586:17)
  at require (internal/module.js:11:18)
  at Object.<anonymous> (D:\dev\DevRoot\mitmdumpurlsaver\electron-python-example\node_modules\zerorpc\node_modules\zeromq\lib\index.js:6:11)
  at Object.<anonymous> (D:\dev\DevRoot\mitmdumpurlsaver\electron-python-example\node_modules\zerorpc\node_modules\zeromq\lib\index.js:848:3)

详见:

移动端

ReactNative iOS给导航栏添加图标

详见:

Flutter中获取安卓手机Wifi的AP的已连接设备的IP地址

有需求是,从安卓真机,小米9,中获取已开启的共享的个人热点中已连接设备的IP地址。

对此,用Flutter开发的话,需要去找找支持此功能的库。

最终找到了:alternadom/WiFiFlutter: Plugin Flutter which can handle WiFi connections (AP, STA)

但是呢:

然后继续尝试调试这个库的功能,但是期间又遇到一个其他问题:

接着能真机调试了,所以继续调试,期间却又发现:

所以先要去研究清楚,是否需要额外权限:

【已解决】Flutter的android中读取/proc/net/arp是否需要额外申请权限

在此期间,又能想到

最终确定:不需要额外权限

且可以输出的AP已连接的设备列表

才能继续研究其他方面的可能性

也基本上大体确定了原因,不是权限方面的,而是其他方面的

即getClientList返回为空,或许是代码或其他方面的问题

此时,基本上都不报什么希望了

毕竟WiFiFlutter的库的代码,也不少

以为自己没精力和能力去研究内部代码了

如此,一点点调试,先调试WifiApManager.java的getClientList

最终通过log信息发现,是可以返回值的,但是为何还是空,还是不理解,找不到根本原因。

(其实还是没报很大的,最终一定能解决问题的希望)继续调试,发现WifiApManager.java的getClientList返回的值

最后是被WifiIotPlugin.java的getClientList得到了,所以就继续调试

最终发现,此处代码

if (client.isReachable() == finalOnlyReachables) {

和输出的值:

  clientIsReachable=true
  finalOnlyReachables=false

是导致列表数据不返回的根本原因

然后再去尝试理解原作者的代码的思路,和想要实现的功能和逻辑,去把代码逻辑修改为,正常的,用户实际上所希望的逻辑:

最终把代码从

if (client.isReachable() == finalOnlyReachables) {
  ...
}

改为:

Boolean clientIsReachable = client.isReachable();
Boolean shouldReturnCurrentClient = true;
if ( finalOnlyReachables.booleanValue()) {
    if (!clientIsReachable.booleanValue()){
        shouldReturnCurrentClient = Boolean.valueOf(false);
    }
}
if (shouldReturnCurrentClient.booleanValue()) {
 ...
}

实现了真正需要的逻辑:

对于当前返回的client,拿到是否的确能reachableclientIsReachable

判断,当外部传入,一定要reachable的client时,且clientIsReachable为false,才不符合用户的期望(用户期望是有效的设备,实际上此处设备无效,不能reachable)

否则,都是符合用户要求的设备,就给返回,才对。

才最终返回需要的数据的。

总结:

对于这个问题,背后的几个核心的难题:

加上:

最后才能真正解决问题。若缺了哪方面的能力,都只能部分解决问题,而很难彻底解决。

详见:

电子书

对于cygwin下编译docbook的webhelp用到makefile调用java编译webhelp结果出错

期间,也基本是,都差不多放弃了

因为实在找不到是什么原因

而且网上也没有类似的参考资料

其他找到的资料,也没太大参考价值

最后,还是自己巧了,试了试java的classpath改为分好分隔后,虽然不行,但是想到了加上引号试试,结果才搞定的。

然后再回头找原因,才找到了该问题的根据原因并解决的。

详见:

Mac

Mac的Catalina中SecureCRT中rz上传图片有问题

能从rz弹框的下半部分的Options部分是灰色的
想到:是否是SecureCRT的问题
后来通过其他线索,想到或许是Mac版本升级的问题
重点在于思路够广:能想到是否是Mac版本问题
否则,就在其他方向上陷入死路了

所以解决此问题:

详见:

crifan的逻辑和整理归纳能力

汽车销售领域内客户和线索逻辑的再优化

比如在 汽车销售领域内整理客户和线索的逻辑和流程时把已有的:

潜客和线索的关系和操作逻辑:

clue_new_customer

稍加整理,变为逻辑更加清楚的:

optmized_clue_and_customer

crifan的做事效率高

做事情的效率,在很多时候,没有直接的可比性。

一旦可以比较,容易看出明显的区别。

视频去水印

用ffmpeg扩大视频并嵌入硬字幕

需求:

具体说就是:

才有思路:

详见: