看了看招行香港一卡通的界面,达成目标有两种方法:
使用Python Openssl库解析X509证书信息
X.509 证书结构描述
常见的X.509证书格式包括:
后缀 | 作用 |
---|---|
cer/crt | 用于存放证书,它是2进制形式存放的,不含私钥 |
pem | 以Ascii来表示,可以用于存放证书或私钥。 |
pfx/p12 | 用于存放个人证书/私钥,他通常包含保护密码,2进制方式。 |
p10 | 证书请求 |
p7r | CA对证书请求的回复,只用于导入 |
p7b | 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。 |
对于常见的https证书 一般是用crt或者pem来保存, http证书可点击网页前的锁按钮得到, 并且进行导出
WordPress修改数据库返回数据
有个简单需求,就是 WordPress
多个网站同步数据的情况下,根据网站域名的不同,修改数据库返回的数据。
实现这个的需求就是在当前 WordPress
主题下的 functions.php
中实现 the_post
拦截函数,在数据库返回的数之后,进行替换。
例子如下:
1 2 3 4 5 6 7 8 9 |
function replace_serv_domain($post) { $local_addr = $_SERVER['SERVER_ADDR']; if ('10.105.114.251' == $local_addr) { // 替换服务器的访问地址信息 $post->post_content = str_ireplace('mobibrw.com', 'miniab.com', $post->post_content); } return $post; } add_action('the_post', 'replace_serv_domain'); |
这个替换过程只能针对没有使用 WP Super Cache
进行缓存的情况,如果已经使用 WP Super Cache
进行缓存,那么很可能导致没有及时生效。
如果只是需要替换域名,那么只需要在 wp-config.php 中定义 WP_HOME/WP_SITEURL 两个变量即可实现域名覆盖。
示例参考代码如下:
1 2 3 4 5 6 7 8 9 10 |
$HTTP_TYPE = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://'; $HOME = $HTTP_TYPE.$_SERVER['HTTP_HOST'].'/wordpress'; #获取当前访问的域名 $SIT_URL = $HTTP_TYPE.$_SERVER['HTTP_HOST'].'/wordpress'; #$HOME = $HTTP_TYPE.$_SERVER['HTTP_HOST']; #$SIT_URL = $HTTP_TYPE.$_SERVER['HTTP_HOST']; define('WP_HOME', $HOME); define('WP_SITEURL', $SIT_URL); |
参考链接
Android Studio 3.6.2编译报错“GC overhead limit exceeded”
Android Studio 3.6.2
编译报错 “GC overhead limit exceeded”,详细的报错信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
Problem in daemon expiration check java.lang.OutOfMemoryError: GC overhead limit exceeded at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.<init>(DefaultFileLockManager.java:158) at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:110) at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:96) at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:91) at org.gradle.cache.internal.OnDemandFileAccess.readFile(OnDemandFileAccess.java:41) at org.gradle.cache.internal.SimpleStateCache.get(SimpleStateCache.java:49) at org.gradle.cache.internal.FileIntegrityViolationSuppressingPersistentStateCacheDecorator.get(FileIntegrityViolationSuppressingPersistentStateCacheDecorator.java:34) at org.gradle.launcher.daemon.registry.PersistentDaemonRegistry.getAll(PersistentDaemonRegistry.java:70) at org.gradle.launcher.daemon.registry.PersistentDaemonRegistry.getDaemonsMatching(PersistentDaemonRegistry.java:115) at org.gradle.launcher.daemon.registry.PersistentDaemonRegistry.getIdle(PersistentDaemonRegistry.java:83) at org.gradle.launcher.daemon.server.CompatibleDaemonExpirationStrategy.checkExpiration(CompatibleDaemonExpirationStrategy.java:54) at org.gradle.launcher.daemon.server.expiry.AllDaemonExpirationStrategy.checkExpiration(AllDaemonExpirationStrategy.java:46) at org.gradle.launcher.daemon.server.expiry.AnyDaemonExpirationStrategy.checkExpiration(AnyDaemonExpirationStrategy.java:43) at org.gradle.launcher.daemon.server.MasterExpirationStrategy.checkExpiration(MasterExpirationStrategy.java:73) at org.gradle.launcher.daemon.server.Daemon$DaemonExpirationPeriodicCheck.run(Daemon.java:269) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) org.gradle.internal.event.ListenerNotificationException: Failed to notify output event listener. at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:86) at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:325) at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:235) at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141) at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy0.onOutput(Unknown Source) at org.gradle.internal.logging.sink.OutputEventTransformer.onOutput(OutputEventTransformer.java:104) at org.gradle.internal.logging.sink.OutputEventRenderer.onOutput(OutputEventRenderer.java:431) at org.gradle.internal.logging.sink.OutputEventListenerManager$1.onOutput(OutputEventListenerManager.java:36) at org.gradle.internal.logging.slf4j.OutputEventListenerBackedLogger.log(OutputEventListenerBackedLogger.java:160) at org.gradle.internal.logging.slf4j.OutputEventListenerBackedLogger.log(OutputEventListenerBackedLogger.java:152) at org.gradle.internal.logging.slf4j.OutputEventListenerBackedLogger.error(OutputEventListenerBackedLogger.java:504) at org.gradle.launcher.daemon.server.Daemon$DaemonExpirationPeriodicCheck.run(Daemon.java:274) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded Expiring Daemon because JVM heap space is exhausted Daemon will be stopped at the end of the build after running out of JVM memory Expiring Daemon because JVM heap space is exhausted > Task :app:compileDebugJavaWithJavac FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:compileDebugJavaWithJavac'. > GC overhead limit exceeded |
这个问题是由于编译过程中的Java的内存开销太大超过了默认限制导致的,解决方法就是增大Java的内存限制。
具体操作为在项目的 gradle.properties
中修改内存限制 org.gradle.jvmargs
默认情况下,这个限制在 1536m
我们需要拉大到 4096m
。
修改后的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx4096m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true |
如果这个文件不存在,则在工程文件 build.gradle
,gradlew
, local.properties
等相同的目录下新建 gradle.properties
这个文件即可。
参考链接
macOS Catalina(10.15.4)/IntelliJ IDEA 2018.3/Tomcat 9.0.33/Maven项目调试报错"Caused by: java.util.zip.ZipException: zip file is empty"
macOS Catalina(10.15.4)/IntelliJ IDEA 2018.3/Tomcat 9.0.33/Maven项目调试时报错,这个项目以前是可以正常调试的,一段时间之后,就不能正常调试之下了。
ubuntu 18.04系统/var/log/auth.log文件不存在
通过 /var/log/auth.log
文件可以查看一些关于 ssh
登陆、sudo
命令的信息。尤其是 denyhosts
依赖这个日志拦截非法的登陆攻击。 但是,我最近遇到了一个问题,在阿里云的一些主机上没有这个文件,或者日志文件在自动备份(比如被重命名成 /var/log/auth.log.1
)之后,没有重新生成新的 /var/log/auth.log
。
检查 /var/log
目录的所有者信息,如下:
1 2 |
$ ls -l /var/ | grep log drwxr-xr-x 23 root syslog 4096 Apr 8 18:04 log |
这里的所有者权限信息是不正确的,缺少所有者所在组的文件创建权限,导致文件创建出现问题。因此需要如下命令:
1 2 3 4 |
$ chmod -R 775 /data/log $ ls -l /var/ | grep log drwxrwxr-x 23 root syslog 4096 Apr 8 18:04 log |
接着手工创建日志文件,如下:
1 2 3 4 5 6 7 |
$ touch /var/log/auth.log $ chmod 640 /var/log/auth.log $ chown syslog.adm /var/log/auth.log $ ls -la /var/log/auth.log |
参考链接
ubuntu 18.04编译OpenSCAD源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ git clone git://github.com/openscad/openscad.git $ cd openscad $ git submodule update --init # 每次重新编译,都需要先执行此脚本,否则会出现环境变量设置问题 $ sudo ./scripts/uni-get-dependencies.sh # #include <Qsci/qsciglobal.h> $ sudo apt-get install libqscintilla2-dev $ sudo apt-get install libqscintilla2-qt5-dev # 大量软件被卸载,但是可惜的是,如果不卸载 libpulse0 没办法安装 libpulse-dev # 不安装 libpulse-dev 就没办法安装 qtmultimedia5-dev $ sudo apt-get remove libpulse0 $ sudo apt-get install libpulse-dev # Project ERROR: Unknown module(s) in QT: multimedia $ sudo apt-get install qtmultimedia5-dev # 如果安装过 anaconda 则要在路径中去除 anaconda,否则会出现编译问题 $ qmake openscad.pro $ make |
ubuntu 18.04使用apt-get安装eclipse无法启动
解决Windows 10(1909)玩红色警戒 2卡顿
1.找到游戏根目录里面的Ra2.ini/RA2MD.INI,有的计算机会不显示文件的“.ini”后缀
无刷电机的工作原理
无刷电机的工作原理