Web
Web

知微:上拉引申的IF

昨天晚上想到一个问题,对于页面的上拉操作,当多次触发上拉动作时如何避免多次请求。于是这样实现了一下。

let i=0
if(i==0)
    up

发现这样可以解决多次上拉问题。看似解决了,不过其中的if判断语句存在一个条件竞争的问题。于是想了一条理由,是由于JavaScript编译执行的逻辑问题,造成的一定延迟,所以没有存在条件竞争。于是我用C++重新写了一个类似的。

#include "windows.h"
int i = 0; 
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
    Sleep(300);
    printf( "3,");
    i = 0;
    return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
    if (i == 0){
        i = 1;
        printf( "0,");
        CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);
    }
    else
    {
        printf( "1,");
    }
    return 0;
}
  
int _tmain(int argc, _TCHAR* argv[])
{ 
    for (size_t i = 0; i < 1000; i++)
    {
        CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
    }
    getchar();
    return 0;
}

于是你会发现它还是很好的解决了上拉的问题。由于C++编译后的opcode接近机器码,所以JavaScript存在的编译执行问题,它不存在。但是它依旧没有多次打印“0”。这里伪造多次是通过线程。让我想到Cpu的问题。Cpu切片和线程执行。从代码来看,它存在竞争问题,但是总和一些外在因素,它规避了问题。想来想去还是没有答案,为什么会规避掉竞态问题。

小说更新

gh_11d136296ec9_258.jpg

查询完小说,点击更新。有红色徽章的代表有更新。

PHP 角色权限控制

所有的web都是通过资源、css、描述语句、js等展现的一个页面、按钮、链接等等,而这些页面、按钮、链接、只有通过触发才可以进行激活,所以可以看待为是一个面向对象的程序、这个按钮底部实现的逻辑可以是后端、前端来实现、如何控制前端、后端逻辑需要控制模型。常用的控制权限有两种模型可以用:RBAC、AUTH。前者在百度百科上有完整的模型概念,后者是没有的。我也在网络上搜索了一下AUTH,看到有人博客写AUTH2.0,我觉得如果你不理解概念,那就不要去写。容易误导一些没有概念的人,然后这些人又很有理的说给下一个人,久而久之错误的概念会像瘟疫一样散播。搜索AUTH除了看到OAUTH2.0,其余的没有看到。而AUTH和OAUTH2.0是两种完全不同的东西,如果你想了解OAUTH2.0,可以查看rfc6749

概念

RBAC:用于角色权限访问控制,基于判断节点。

AUTH:用于角色权限访问控制,基于规则判断节点。

它们的粒度是一致的,不同的是对节点的判断方式。

例子

例如:有一个类(class)类里有一个函数(function)。现在要限制用户A能够访问到function。建表如下

用户表

idnamenum
1用户A20
节点表

idnode

2class/function
关联表

iduser_idnode_idnode_rule
112num>10

RBAC 判断:首先获取用户A的id为1,然后查找关联表user_id为1的node_id,最后通过node_id来获取到node,获取到的node就是用户A能够访问的节点。有些节点你没有写进节点表,那就代表是公共的,可以随意使用的,所以判断的时候要判断当前节点是否在节点表里,如果不在,就没有必要判断节点了。

AUTH判断:首先获取用户A的num,然后查找关联表node_rule的规则,发现如果num>10则可以获取到node_id为2。最后通过node_id去获取节点表。一样的要判断公共的节点。

上述描述少了一个角色组和角色的分类描述,这些都无关紧要。

如何实现前端控制

MVC结构如果你了解过这种结构的实现方式的话,每一个V层的实现都是需要一个模板引擎的,就像smarty。更重要的是PHP支持HTML混编。要怎么实现一个自己的模板引擎 ?下面其实是一个正常的html。

<!DOCTYPE html>
    <html>
        <head>
            <title></title>
        </head>
        <body>
            {$echo}
        </body>
    </html>

在body节点有一个很特殊的“代码”{$echo},为什么有的模板标签非要有花括号,或者中括号,或者其它的开始结束标签,实际只有一个目的,方便正则替换。原理:读取html文件,php正则提取所有的模板标签,替换模板标签里的语句,或者变量。这也就是为什么有缓存这个模板概念,因为替换完以后是需要输出或者保存后再输出的。有了上述的概念以后,那么前端控制就比较容易了,TP或者微擎都支持自定义模板标签函数,完全可以自己定义一个函数,函数里读取用户的ID,然后获取当前的URL,通过判断当前的URL与你的节点库里的URL进行对比返回一个布尔值来确定是否展示,或者是否可触发即可。

php微信推送

PushScript

源码:https://github.com/iwonmo/pushscript

下载:PushScript.jar.zip

使 用

将文件下载并解压会的到一个PushScript.jar的文件,上传到服务器。在文件同目录下新建一个http文件。

data/PushScript.jar

data/http '是TXT文件,不过没有后缀。

http文件里面填写你的回调地址。

运行

nohup java -jar PushScript.jar &

PHP

socket_connect($socket,'127.0.0.1', 1992);
socket_write($socket, "用户OPEN或者其他文本数据|过期时间");

当达到过期时间后,会自动回调你填写的接口

如下图

WechatIMG3.jpeg

Linux安装java

JDK:https://pan.baidu.com/s/148iyCSr2VYO4divsIHKVUw 提取码: ue5c 

工具:WinSCP

使用WinSCP在usr/local新建一个java文件夹例如:/usr/local/java/,然后将JDK包上传解压。

打开/etc/profile文件最底部输入如下内容

JAVA_HOME=/usr/local/java/jdk1.8.0_211
JRE_HOME=/usr/local/java/jdk1.8.0_211/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

执行一下命令 source /etc/profile 免重启使配置生效。

软链接添加方法

ln -s /usr/local/java/jdk1.8.0_211 /bin/java /usr/bin/java


微信小程序未授权与授权后关联问题的解决

微信小程序有一个授权登录,在你没有授权的时候,一般会限制访问,实际完全可以避免这种情况。观看了一些app或者应用的处理上发现了一些规律。都存在一个唯一的临时用户。

这个临时用户是体现给前端展示的,一般是一个随机名字,或者一组规律的字串。这有一个好处,当你微信小程序授权以后可以拿到这一个临时的字符串,然后与你的授权信息去做匹配。app的道理等同。


微信小程序的相关文档

屏幕快照 2019-05-18 下午11.25.53.png

清理策略里有写,只有在代码包被清理的时候本地缓存才会清理。也就是说,除去代码清理以外,你完全可以使用这几个函数来做本地的临时用户存储。