如何实现Android指纹登录 (相关代码)(笔者采用方案)
系统采用TP6+Swoole4高性能框架开发,支持数据库独立部署、服务器集群;数据采用redis缓存、队列、数据库连接池等技术,提升系统整体性能,为品牌商家长效增长保驾护航。
Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务,让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期, 为性能的提升提供了独一无二的可能性。Swoole 可以广泛应用于互联网、移动通信、云计算、 网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。
数据库密码
/usr/local/directadmin/conf/mysql.conf
CSF防火墙
如何在 CentOS 8 上安装和配置服务器防火墙 (CSF)?
编辑配置文件 vi /etc/csf/csf.conf 重启CSF防火墙 csf -r
Redis
编辑配置文件 vi /etc/redis.conf 使用配置文件启动 redis redis-server /etc/redis.conf &
转载自:高分辨率屏幕远程桌面的时候屏幕内容过小,有哪位大神知道如何解决这个问题
因为现在新出的笔记本屏幕分辨率较高,使用远程桌面时由于两边分辨率不同,导致自己看到对方桌面的图片和文字都很小,特别影响体验。亲测解决办法如下:
1、修改注册表:
用运行-regedit编辑注册表,找到:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide
新建DWORD,命名PreferExternalManifest,并双击设置值为1.
2、控制面板-文件资源管理器选项-查看-高级选项-隐藏已知文件类型的扩展名,去掉打勾。
3、到桌面右键新建-文本文档-确认。复制并粘贴如下代码,保存后修改文本名称为:mstsc.exe.manifest(后缀也修改为manifest了)。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"> </assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"> </assemblyIdentity> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</ms_windowsSettings:dpiAware> </asmv3:windowsSettings> </asmv3:application> </assembly>
———————————————华丽分割
4、将这个文件放到指定路径中:C:\Windows\System32;找不到路径的,在桌面已经生成的远程桌面快捷方式,右键-属性-打开文件所在位置,就能看到C:\Windows\System32\mstsc.exe,将代码文件放到文件夹里,重启电脑,再次打开RemoteAPP和远程链接,Bingo!分辨率是不是正常了,虽然虚了一些,但是起码看得清楚!
转载自:Android编程实现自定义ProgressBar样式示例(背景色及一级、二级进度条颜色)
本文实例讲述了Android编程实现自定义ProgressBar样式。分享给大家供大家参考,具体如下:
效果图如下,本例中设置了第一级进度条和第二级进度条。
样式资源:progressbar_bg.xml,放在drawable文件夹下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--3个层的顺序即为显示时的叠加顺序-->
<!--背景色-->
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<solid android:color="#CCCCCC" />
</shape>
</item>
<!--二级进度条的颜色-->
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<solid android:color="#88F56100" />
</shape>
</clip>
</item>
<!--一级进度条的颜色,也可以直接替换成图片-->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<solid android:color="#F56100" />
</shape>
</clip>
</item>
</layer-list>
布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:minHeight="20dp"
android:padding="10dp"
android:progressDrawable="@drawable/progressbar_bg" />
</LinearLayout>
转载自:Toast 在 Android 7.1 崩溃排查及修复
尝试复现

Toast.makeText(this, "666", Toast.LENGTH_LONG).show();
Toast toast = Toast.makeText(this, "666", Toast.LENGTH_LONG);
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) {
try {
// 获取 mTN 字段对象
Field mTNField = Toast.class.getDeclaredField("mTN");
mTNField.setAccessible(true);
Object mTN = mTNField.get(toast);
// 获取 mTN 中的 mHandler 字段对象
Field mHandlerField = mTNField.getType().getDeclaredField("mHandler");
mHandlerField.setAccessible(true);
final Handler mHandler = (Handler) mHandlerField.get(mTN);
// 偷梁换柱
mHandlerField.set(mTN, new Handler() {
@Override
public void handleMessage(Message msg) {
// 捕获这个异常,避免程序崩溃
try {
mHandler.handleMessage(msg);
} catch (WindowManager.BadTokenException ignored) {}
}
});
} catch (IllegalAccessException | NoSuchFieldException ignored) {}
}
toast.show();
Toaster.show("666");
在使用npm、yarn等包管理工具之前,我们首先了解一些基本的概念
模块(module)
通常以单个文件形式存在的功能片段,入口文件通常称之为入口模块或主模块
库(library,简称lib)
以一个或多个模块组成的完整功能块,为开发中某一方面的问题提供完整的解决方案
包(package)
包含元数据的库,这些元数据包括:名称、描述、git主页、许可证协议、作者、依赖等等
npm 全称为 node package manager,即 node 包管理器,它运行在 node 环境中,让开发者可以用简单的方式完成包的查找、安装、更新、卸载、上传等操作。几乎可以这样认为,前端所有的包管理器都是基于 npm 的,目前,npm 即是一个包管理器,也是其他包管理的基石。
官网:https://www.npmjs.com/
这个网址非常常用,因为以后的常用插件都是在官网中查找,查看使用方法
yarn 是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,它仍然使用 npm 的registry,不过提供了全新 CLI 来对包进行管理
yarn 官网:https://www.yarnpkg.com/zh-Hans/
在过去npm具有很多缺点,比如依赖目录嵌套太深遍历问题,npm是串行下载的下载速度慢等等问题,于是就有了yarn。
npm6 之后,可以说npm已经和yarn非常接近,甚至没有差距了。很多新的项目,又重新从yarn转回到npm。
为解决国内用户连接npm registry缓慢的问题,淘宝搭建了自己的registry,即淘宝npm镜像源。
官网地址:https://npm.taobao.org/
但是现在并没有什么卵用了,因为npm已经支持修改registry了
nvm并非包管理器,它是用于管理多个node版本的工具。在实际的开发中,可能会出现多个项目分别使用的是不同的node版本,在这种场景下,管理不同的node版本就显得尤为重要。nvm就是用于切换版本的一个工具
下载和安装
最新版下载地址:https://github.com/coreybutler/nvm-windows/releases
下载nvm-setup.zip后,直接安装。以下命令判断是否安装成功
nvm -v
为了加快下载速度,建议设置淘宝镜像
node淘宝镜像:https://npm.taobao.org/mirrors/node/
npm淘宝镜像:https://npm.taobao.org/mirrors/npm/
nvm node_mirror https://npm.taobao.org/mirrors/node/ nvm npm_mirror https://npm.taobao.org/mirrors/npm/
start命令可以在命令行下运行一个程序,可以打开盘符,文件,文件夹,网址,程序。
1.打开盘符:
start C: start /max E: rem 最大化打开 start /min F: rem 最小化打开
2.打开文件:
start "" "C:\Users\Jerry\Desktop\kali source.txt"
注: 路径中有空格时,不仅路径要加双引号,路径之前也要加(路径之前的空双引号表示空标题)
3.打开文件夹:
start C:\Users\Jerry\Desktop\
4.打开网址:
start www.baidu.com
5.打开程序:
start C:\Users\Jerry\Desktop\雨燕投屏.lnk
转载自:android实现扫码枪功能
扫码枪扫码效果等同于键盘录入,会回调dispatchKeyEvent键盘按下事件。
开发环境:有线扫码枪,支持二维码
1. 接收数据
/**
* 扫码枪扫码处理
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
int keyCode = event.getKeyCode();
char aChar = (char) event.getUnicodeChar();
if (aChar != 0) {
mStringBufferResult.append(aChar);
}
mHandler.removeCallbacks(mScanningFishedRunnable);
//若为回车键,直接返回
if (keyCode == KeyEvent.KEYCODE_ENTER) {
mHandler.post(mScanningFishedRunnable);
} else {
//延迟post,若500ms内,有其他事件
mHandler.postDelayed(mScanningFishedRunnable, 500L);
}
return true;
}
return super.dispatchKeyEvent(event);
}
2. 处理数据
/**
* 二维码信息对象
*/
private QRCode qrCodeBean;
/**
* 二维码信息原始数据容器
*/
private StringBuilder mStringBufferResult = new StringBuilder();
private Handler mHandler = new Handler();
private Runnable mScanningFishedRunnable = new Runnable() {
@Override
public void run() {
scanOk = false;
String qrcode = mStringBufferResult.toString();
if (!TextUtils.isEmpty(qrcode)) {
// 扫码确定参数
Gson gson = new Gson();
try {
qrCodeBean = gson.fromJson(qrcode, QRCode.class);
// 你的代码...
// 如果要支持中文,数据用可以URLEncoder/URLDecoder编解码
} catch (JsonSyntaxException e) {
// 解析失败...
} catch (UnsupportedEncodingException e) {
// 解码失败...
} finally {
mStringBufferResult.setLength(0);
}
}
}
};