分类 开发 下的文章

在一个大型的复杂应用中,我们通常会将不同模块的数据存储到各自的表中 例如在APPsite框架中我们默认了4张用户表 分别存储了 user_account 账户表 user_info 详情表 user_pocket 钱包表 user_group 分组表

这样我们在读写数据的时候可以做到表级别的隔离,防止一些api 或是 内外部方法导致的数据泄露问题,提高安全性和事务方法的紧密度。 当然也有一定的减轻单张表结构过于臃肿的作用。

这里的表拆分,要基于业务划分去做,譬如说详情、分组、钱包在用户的鉴权、登录包括收发消息等行为时都不需要,那么我们就可以将这些部分的数据转移到新的表中。保持account表的高效性。

于此对应的是我们在进行后台的丰富数据查询时就需要合并表进行查询,今天特意整理一下使用JOIN进行多表联合查询的注意点。

首先是最简单的范例

# JOIN查询 双表
SELECT * FROM user_account 
LEFT JOIN user_info ON user_account.userid = user_info.userid

在多表查询时,我们会遇到某个表 对应项目为空时的情况, 这时根据JOIN方式就会有不同的结果。其中INNER 方式就会取交集合并结果,而LEFT方式左表会完整展示,右表不满足条件的数据会被剔除为空。

- 阅读剩余部分 -

最近有将AppSite框架进行公开发布(开源)的想法。 不过开源也就意味着更多的一份责任,如果是普通的个人系统还好,我们的系统商业化在很多中大型项目上,安全也是一个隐忧。

暂且先梳理一下

AppSite PHP全栈框架

Appsite的宗旨是用于快速开发网络\云应用\物联网

全栈支持引擎 Full stack Supporting Engine 介于CMS与Framework之间

AppSite 核心特色是极简的语义化编程

如果一个框架、一个语言、甚至一个程序他的可读性不好甚至很差,那么他就是我眼中的垃圾。 我们可以回想一下,高级语言的意义到底是什么? AppSite追求的就是当我们书写/维护我们的程序时,可以像读一篇文章一样,顺畅的知道别人写了什么,自己写过什么。 先不要跟我说什么设计模式、优雅还是什么安全的,首先,我们应该能阅读我们的代码,因为看明白代码之后,其他的都不耽误。

$validate = USER::mobileValidate('15000000000','123456');
if( $validate->isOk() ){
    print( 'validated' );
}else{
    print( $validate->status );
    print( $validate->message );
}

AppSite 主要思想是面向数据编程

从某个侧面来看计算机信息技术本身就是对于数据的各种处理,而AppSite就是这样的思想,我们的核心引擎着重解决的是提供一个可以自适应处理各种不同结构数据的一套程序开发套件。 基于这些高度自适应的基础功能,我们可以方便的创建各种方法或对象、进而快速实现不同的业务逻辑的新增或调整。

例如,我们对于向数据库添加数据的时候,通用的使用的是:

$DB->add( $data, $table );      // 数据库实例化操作方法
USER::add( $data );                 // 组件静态方法

这里相当于我们告诉程序 “我有这些数据,你添加一下。” 程序则通过设定好的规范自动去完成数据整理以及后续操作。

- 阅读剩余部分 -

Common Access System Design

最近在优化自己写的APPsite框架,其中一直以来没有妥善解决的权限模块可能是后面拓展出去的比较大的障碍。所以着手重写这个模块。 在现有的框架中ACCESS模块分为两大部分: 系统权限、单位权限两个。

系统权限主要用于验证系统功能是否可以执行。 主要支持了Token作用域验证功能,可以设置有效期、作用域、以及可执行次数。 ACCESS和密码验证不同,并不解决加密解密问题,只是负责一个权限的授予、验证、撤销的功能。

# 例1 手机改密码的流程:  作用域为 resetPassword
用户.发起请求 -> 
权限系统.开始流程 -> 
用户.提交验证 -> 
权限系统.验证(通过/拒绝)并授权(设置有效期) -> 
使用权限(一段时间有效 或 一次性有效)

单位权限类似于虚拟物品的所有权。支持以用户为单位的权限授权。 目前仅支持一种状态即 拥有( 可以访问、读取 ) 而写、删的权限仍然只归属于系统。

# 例2 虚拟商品包年授权:  
用户.发起购买 -> ... -> 支付验证成功 ->
权限系统.添加授权(设置有效期) ->
用户.拥有权限
----
客户端.查询授权 ->
权限系统.验证(通过|拒绝)并返回内容|错误 -> 
客户端.接收反馈 ->
用户.使用权限(获取内容等)

- 阅读剩余部分 -

在网上查看很多的帖子都是在 hypedown模块中注释掉对 \n 的解析 这样的做法是不行的,因为这样文章中的换行就会失效,所有的文字就堆到一起了。

查看了服务端的源代码并没有太好的解决方案,官方论坛所谓给出的已解决的开发板,我换了一下也并没有解决,这里先给一个临时解决方案。

在主题的footer中加入一行js代码即可

document.querySelectorAll(".post").forEach(function(post){ post.innerHTML = post.innerHTML.replace(RegExp(/<br><br>/g), '') });

主要就是检测同时出现两行的换行 就将它剔除掉 当然不完美,不过也没必要花太多时间在这个部分,大体上解决了问题~

最近自己鼓捣物联网的玩法,买了一个树莓派,打算通过自己的服务器来做数据通讯。 由于一直以来的框架都是php写的,所以仍然沿用php。 在使用soket的时候为了简化开发成本,扩展未来的可能性这里选用了workman来进行。

总体来说 Typecho做到了简洁实用,有些部分虽然有些简单或是有些不足,但是自行修改是十分便捷的,这非常适合用来维持一个单纯的博客系统。

因为近期实在是感受到了记忆力下滑、接触面过广的时候对于笔记、知识点记忆搜索的需求很强烈,不得不重新拾起曾经一度丢弃的个人博客。 区别在于以前更多的是设计作品展示、图片展示。现在更重要的是做技术博客。

在很久之前我一直以来习惯的就是使用WordPress来搭建博客和网站,曾经在做设计师的时候折腾过蛮多次WordPress来制作个人网站、在线教育网站,包括给别人搭建电子商务网站。 2017年 基本主义在线商城: 基本主义

但是由于一些原因、我不打算再尝试WordPress这个较重、同时风险也比较高的CMS 其中最主要原因还是因为折腾成本太高、想要去自定义的时候需要很了解这个框架的设计、想要深度定制的难度很大、修改别人的主题、模板的时候由于代码的结构化很差、所以想要做修改的时间成本异常的高。

(也正是因为2017年痛的领悟,所以自行开发了AppSite全栈框架) 现在自己再去写一个博客又感觉挺浪费时间的。

简书、lofter这类自由度不够、cnblogs、CSDN等技术博客又太过不能入眼, 所以决定还是找一个极简的cms来做,这时候正好发现了Typecho。

- 阅读剩余部分 -

WEBHOOK是一种系统通知的形式,在达到特定条件时系统自动触发网络请求。 可以理解为服务端系统中的跨设备回调函数。

手头有很多个项目在同时运作维护,核心的框架也不断在升级和修复。 刚开始的时候项目很少,基本上就是通过sublimetext的SFTP直接手动上传,现在随着需要维护的项目增多,每次做更新和上传的时候都会出现版本间的不同步,部署的繁琐,不能做到增量更新,更新效率比较差。

现在研究一下使用webhook来做到自动部署。目前的代码库托管在gitee码云。

注!我这里的主要需求主要是核心库分布式的增量更新,所以主要是包更新,一次更新通知多个服务器进行同步,不是一个整站代码的更新,当然整站上传也可以采用这样的方式,有的时候使用ftp来处理网站更新也不坏。

- 阅读剩余部分 -

Android WebView不能加载ajax?加载ajax无效?

!苹果或高版本的安卓webview可能会有跨域被拦截的问题,需要在服务端允许跨域。 另外高版本的webview注意使用HTTPS协议的请求,普通http将会被拦截 php示例代码:

header('content-type:application:json;charset=utf8');
header('Access-Control-Allow-Origin:*'); // 被允许的访问来源
header('Access-Control-Allow-Methods:POST');
header('Access-Control-Allow-Headers:x-requested-with,content-type');

1、WebView的支持js是否打开; webSettings.setJavaScriptEnabled(true);

2、webView拓展的api是否打开: webSettings.setDomStorageEnabled(true);

- 阅读剩余部分 -

安卓webview在某些版本使用location.href时会闪退。 主要问题是

通过window.location.href来重定向的,安卓不会正确触发shouldOverrideUrlLoading。

这个时候需要重写shouldOverrideUrlLoading

webView.setWebViewClient( new WebViewClient(){
 @Override
  public boolean shouldOverrideUrlLoading( WebView view, String url ){
   if(url!=""){
    view.loadUrl(url);
   }
   return true;
  }
});

最近在调试一个通过webview打开本地html的页面。 出现了: 404 Not Found The resource could not be found

用到了chrome的inspect调试,虽然在chrome://inspect 中可以看到设备,但是点击inspect却始终显示的是空白或者404。 这个时候无论我是否开启VPN,或者在webview中写入各种设置均不起作用。 一度怀疑是手机的webview框架有问题,甚至想过替换webview的方案。 但是手机同时安装的chrome浏览器,qq浏览器都可以正常调试,这是我对比了一下chrome浏览器和webview的核心版本 其中 chrome : 71.0 WebView: 51.0

在开启vpn后chrome浏览器的页面已经可以正常调试了,但是回到webview调试依然白屏。 这时我推测是两个浏览器内核之间已经不能进行有效的对接、或者谷歌服务器中没有对应的版本文件来下载,导致调试器界面无法显示。 随后我大胆的在网上下载 chrome 51.0版本,卸载了本机76.0版本进行安装。

使用51.0版本的chrome进行webview调试,成功!

- 阅读剩余部分 -

Mac OS安装开源爬虫框架pyspider

一、pyspider介绍 pyspider是百度的大神binux用Python做的一个爬虫架构的开源化实现,主要的功能需求是: 抓取、更新调度多站点的特定的页面 需要对页面进行结构化信息提取 灵活可扩展,稳定可监控 二、pyspider安装 1、安装pip(如果未安装)

sudo easy_install pip

2、安装pyspider

pip install pyspider 注意:安装的过程中可能会抛错:pyspider fatal error: ''libxml/xmlversion.h'' file not found

这个只要先安装Command Line Tools 就行了


osx 11 安装了 Xcode command line tools 依旧不行,百度了一些做法都解决不了

新的OSX10.11.5, 安装lxml库,可以用下面的命令:

  1. 安装brew:

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. 安装lxml:

    brew install libxml2 brew install libxslt brew link libxml2 --force brew link libxslt --force 3. pip install lxml 4. pip install scrapy

---- 用了这个知乎的方法依然不行

STATIC_DEPS=true sudo pip install lxml

三、运行

pyspider 完成之后访问 http://localhost:5000