frp内网穿透设置

内网有时候快速搭建原型发给用户看的时候,配置服务器很麻烦,未进入生产环境的应用也不敢往正式服务器上放。所以本地的快速访问很是需要和方便。

看了下内网穿透的方式基本上都是属于数据转发,有软件和硬件两种途径。下面我列出主流和我都试用的。硬件都是咸鱼上淘的二手的。

软件有:ngrok、 frp、 花生壳服务端

硬件有:花生壳棒、 花生壳盒子、零遁、汉土、固定IP小魔棒

其中最坑的就是花生壳,首先就是用的它是因为以前TP路由器里经常带着的,想着是个老牌子了也知名。先用了服务端软件方式穿透,用了段时间被封了,理由是我在国外登录了。好吧!写代码的有几个不偶尔VPN去google下呢。忍了!然后一个月过后莫名奇妙没了,一看理由一个月内没有访问流量给删除了。好吧~ 花生壳各种收费模式太多了,基本上每一个点都要收费,强烈建议不要使用!映射也有严格限制。80端口也无法做多域名绑定。一个网站就得占用一条映射。

固定IP模式基本上是用公网IP做了桥接。比较方便,但是80端口需要备案,而且流量也挺贵。

最后还是采用了软件方案比较好点。于是又试用了ngrok和frp。觉得从免费和域名来说,frp还是比较良心的。

服务端配置很简单。

客户端配置web

[web]
type = http
local_port = 80
custom_domains = *.yourdomain.com

这里的custom_domains 类型是 string[] 可以用逗号做多个隔开,也可以用泛域名。

基于php编写桌面应用

如果将一个网站直接打包成一个桌面应用,有很多应用解决方案。比如:electron nwjs(node-webkit) 包括c# delphi等嵌入一个web插件。

但是我们知道要是考虑到h5和css3的支持,还是需要些友好的浏览器内核。而 electron和nwjs都是基于chormium的。

比如我们要将一个SAAS系统打包成一个桌面端软件。系统入口:http://bech.cc/saas/pms

这里介绍nwjs的解决方案。虽然很多人都说electron好, 但是我看到目前国内CocosCreator 、微信开发者工具都是用的nwjs,还有其它很多的软件用它做代理,比如一些数字货币交易所的桌面端软件(win\mac\linux)。

1. 下载nwjs

2. 新建项目文件夹 saas ,在根目录下创建 package.json{
"name": "saastest",
"version": "0.1.0",
"description": "BechTech",
"main": "http://bech.cc/saas/pms/",
"window": {
"width": 1280,
"height": 800,
"position" : "center",
"icon": "./icon.png"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dist": "build --tasks win-x64 --mirror https://npm.taobao.org/mirrors/nwjs/ .",
"start": "run --x64 --mirror https://npm.taobao.org/mirrors/nwjs/ ."
},
"build": {
"nwVersion": "0.46.3",
"win":{
"productName": "BechTech",
"copyright": "Copyright © 2009-2020 BechTech",
"icon": "./favicon.ico"
}
},
"dependencies": {},
"devDependencies": {
"nwjs-builder-phoenix": "^1.15.0"
}
}

3. 将nw.exe的目录放到环境PATH下。切换到目录下

nw saas  //启动查看本地窗口

这里启动后就相当于封装完了软件

4. 打包与发布

这里用官方推荐的 nwjs-builder-phoenix (推荐) 具体方法去git上查看

打包执行命令 npm run dist

后续会生成 dist\saas-0.1.0-win-x64 文件夹

这里要多重复实验才能成功,如果你英文阅读文档功底可以一次就够了。


我们再看另外一种情况,如果你的系统必须局域网内或者vpc访问

其实,这种情况我们经常会碰到,比如为了数据安全 或者考虑到无网环境运行。总之,你需要一个本地服务器。

我们一般的解决方案是配置一个本地的php开发环境。如果集成的会更快如 appserv xmpp phpstudy等等。

但是我们更希望要一个完全的可发布的一体化解决交付方式。

这里我们可以利用php5.5的命令快速实现一个解决方案。然后再用nwjs打包。每一个项目都是一个完美的桌面端软件且运行在本地的localhost.

下载php5.5 win-x86

1. 复制 php.exe php.ini-production ext\ extras\

2. 新建一个www文件夹。这里放的是网站程序 路由入口 index.php( 支持大部分框架 如 TP3)

3. 回到 nwjs 项目根目录下 写一个批处理程序 runserv.bat

@echo off
path = %path%;.\php\;
php.exe -S localhost:8080 -t php\www

4. 写一个main.js 用nodejs 的child_process模块执行批处理脚本

5. package.json 的main 加载 localhost:8080

6. 用nwjs打包

这样一个基于php本地架构的服务方案就完成了。

 

video标签在微信浏览器 X5内核里的一些异常问题

做网站,用视频作为背景 background。是一种广泛的时尚设计。响应式设计下,video标签在微信浏览器里出现全屏浮动播放。加上:x5-video-player-type=”h5″

最终的兼容大部分浏览器的:
(source 里可以加上一些其它兼容格式)

<video autoplay loop muted playsinline x5-video-player-type=”h5″ x5-playsinline=”true”>
<source src=”/static/videos/video.mp4″ type=”video/mp4″>
Your browser does not support the video tag.
</video>

Nodejs+Selenium webdriver自动化测试

  • 安装webdriver

npm install selenium-webdriver –save

  • 安装chrome驱动

npm install chromedriver –save

这里一般会要求科学上网,最好手动去 http://npm.taobao.org/mirrors/chromedriver/ 找到对应版本复制到chrome安装目录下。并设置全局变量。

  • 初始化并打开一个网址

var webdriver = require(‘selenium-webdriver’);
var driver = new webdriver.Builder() .forBrowser(‘chrome’) .build();
driver.get(‘http://www.baidu.com’);

ethereum初探七:solidity

了解solidity 最好还是自己去阅读英文的官方文档加上一些中文文档辅助。

英文文档 当前最新版本地址:https://solidity.readthedocs.io/en/v0.5.8/

一. 注释

//单行注释

/* 多行注释 */

///可以生成文档的注释   /** 可以生成文档的注释 */

二. 数据类型

1 整型

通过int/uint定义。可以设置占用空间的大小。从8位开始,8位步长,最大到256位。int8、int16、int24、uint8……

int unit默认是256位。

uint一般用来表示货币数量和时间戳。solidity目前是不支持double float的。

如:uint balace = 1 ether;  uint time = 1 hours;

整型常量需要通过 constant 修饰。

2 布尔型

bool 常量值有true false。

3. 地址

以太坊中的地址位160位,即20个字节大小。

address public owner;

4 字节

固定长度字节数以 bytes 加上数字定义。如:bytes 2 foo;

动态长度字节以 bytes数组和string定义。bytes类似byte[],string 不提供长度和按索引访问。

bytes foo;  或者 string str = “hello”;

5 时间单位和货币单位

seconds minutes hours days weeks years 均可作为后缀,并进行相互转换。默认为秒。

wei finney szabo ether等是货币单位。

6 数组和多维数组

固定长度的数组 uint[5] x =[1,2,3,4,5];

动态数组 bytes32 [] names;

多维数组中需要指出的是 solidity中的行列和大多数编程语言是相反的。

7 映射/字典

映射的定义 mapping(_KeyType => _KeyValue)。如:mapping(string =>uint) public balance;