[置顶] 一些网站

PHP

PhpBug:https://bugs.php.net/

Zend Framework:https://www.phpfans.net/manu/ZF/

JavaScript

JavaScript图表:https://echarts.baidu.com/examples/

mescroll 下拉控件:http://www.mescroll.com/

Promises:http://wiki.commonjs.org/wiki/Promises

Android

Apk在线反编译:http://www.javadecompilers.com/apk/

Adb:http://adbshell.com/downloads

AI

TensorFlow 国内:http://www.tensorfly.cn/tfdoc/get_started/introduction.html

TensorFlow 官网:https://tensorflow.google.cn/

Numpy:https://www.numpy.org.cn/

游戏

Cocos 引擎:http://docs.cocos.com/creator/manual/zh/

单片机

元器件:https://www.alldatasheetcn.com/

Arduino Mini:https://store.arduino.cc/usa/arduino-pro-mini

Google Chromium PC Frame

nw.js:https://nwjs.io/

Electron:https://electronjs.org/

cef:https://bitbucket.org/chromiumembedded/cef/src/master/


layui table 选中返回

需要重写一下modules/table.js,从官网下载layui的源码。然后复制一份table.js到modules目录下,重命名为tables.js。

如果直接lay.use("tables")是无法加载的,所以需要更改一下layui.js或者layui.min.js,添加到内置对象里。

添加为:tables:"modules/tables"。这样就可以正常的使用,这也是实际更改过程中费时最久的一个部分。

找到如下代码:

that.elem.on('click', 'input[name="layTableCheckbox"]

增加如下代码:

// iwonmo 逻辑开始 把选择框写入到本地存储里
var xi = checkbox[0].getAttribute("data-indexkey");
if(xi>0) {
    var xjson = localStorage.getItem("iwonmo_table");
    if(xjson==null){
        if($(checkbox[0]).is(':checked')==true){
            var xjsons=[]
            xjsons.push(xi);
            localStorage.setItem("iwonmo_table",JSON.stringify(xjsons))
        }
    }else{
        xjson=JSON.parse(xjson)
        if($.inArray(xi, xjson) == -1)
        {
            if($(checkbox[0]).is(':checked')==true){
            xjson.push(xi)
            localStorage.setItem("iwonmo_table",JSON.stringify(xjson))
        }
        }else{
            if($(checkbox[0]).is(':checked') == false){
                delete xjson.splice([$.inArray(xi, xjson)],1);
                localStorage.setItem("iwonmo_table",JSON.stringify(xjson))
            }
        }
    }
}
// iwonmo 逻辑结束

找到如下代码

//渲染不同风格的列
switch(item3.type){

增加如下代码

// iwonmo 逻辑开始
var my_key="";
var ischecked = ""
if('id' in item1)
{
    my_key="data-indexKey="+item1.id
    var xjson = localStorage.getItem("iwonmo_table");
    if(xjson != null){
        xjson=JSON.parse(xjson)
        if($.inArray(""+item1.id, xjson) > -1)
            ischecked="checked";
    }
}
// iwonmo 逻辑结束

效果如下

222222.gif

取值方法也没有受到影响

微信截图222.png


下载:tables.zip


js人脸识别

<!DOCTYPE html>  
<head> 
 <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />  
    <script type="text/javascript" src="http://www.jq22.com/demo/tracking-Plus201710110918/js/tracking-min.js"></script>
    <script type="text/javascript" src="http://www.jq22.com/demo/tracking-Plus201710110918/js/face-min.js"></script>
    <style type="text/css">
        .v{
            margin-left: -9999px;
            float: left;
        }
    </style>
</head>  
<body>  
    <input type="button" title="开启摄像头" value="开启摄像头" onclick="getMedia();" /><br />   
    <video height="320px" class="v" id="video" autoplay="autoplay"></video><hr />   
    <canvas id="canvas" width="480px" height="320px"></canvas>  
    <script type="text/javascript">  
    let video = document.getElementById('video');
    let canvas = document.getElementById('canvas');
    let context = canvas.getContext('2d');
    context.lineWidth = 10;
    context.strokeStyle = '#ff0202';
    function getUserMedia(constraints, success, error) {
        if (navigator.mediaDevices.getUserMedia) {
            //最新的标准API
            navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);
        } else if (navigator.webkitGetUserMedia) {
            //webkit核心浏览器
            navigator.webkitGetUserMedia(constraints,success, error)
        } else if (navigator.mozGetUserMedia) {
            //firfox浏览器
            navigator.mozGetUserMedia(constraints, success, error);
        } else if (navigator.getUserMedia) {
            //旧版API
            navigator.getUserMedia(constraints, success, error);
        }
    }
    function success(stream) { 
        let CompatibleURL = window.URL || window.webkitURL; 
        video.srcObject = stream;
        video.play();
    }
    function error(error) {
        alert('访问用户媒体设备失败,请尝试更换浏览器')
    }
    function getMedia() {
        if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {
            getUserMedia({video : {width: 480, height: 320 }}, success, error);
        } else {
            alert('不支持访问用户媒体');
        }
    }
    var tracker = new tracking.ObjectTracker(['face']);
    tracker.setStepSize(1.7);
    tracking.track('#video', tracker);
    tracker.on('track', function(event) {
       // context.clearRect(0, 0, canvas.width, canvas.height); 
        context.drawImage(video,0,0,480,320);
        if(event.data.length == 0){
            console.log("没有检测到人脸")
        }else{
            event.data.forEach(function(rect) {
            context.strokeRect(rect.x, rect.y, rect.width, rect.height);
        });            
        }
      });
    </script>  
</body>


电路知识

串联电路中的电流处处相等。 

并联电路干路中的电流等于各支路中的电流之和。


串联电路中电源两端电压等于各用电器两端电压之和,用符号表示时可以写为

U=U1 +U2

并联电路中电源两端电压与各支路用电器两端的电压相等,用符号表示时可以写为

U=U1 =U2


I = UR


其中 U 的单位为伏特(V),R 的单位为欧姆 (Ω),I 的单位为安培(A)。


1 kW · h(千瓦时) = 1×103 W×3 600 s = 3.6×106 J


电功率是描述电流做功快慢的物理量,它的定义式是P= Wt 即电功与时间之比

电功率与电流和电压的关系是 P = UI。利用这个关系式,可以测出用电器的实际用电 功率。


电路两端的电压为 U ,电路中的电流为 I ,通电时间为t时,电 功 W(或者说消耗的电能)为

W=UIt

例题 有一只节能灯接在 220 V 的家庭电路中,通过它的电流为 0.09 A

计算这只灯使用 5 h 用电多少千瓦时。W = UIt = 220 V × 0.09 A × 5 h= 0.099 kW·h

所以,这只节能灯工作 5 h 消耗的电能是 0.099 kW · h


在物理学中,用电功率(electric power)表示 电流做功的快慢。电功率用 P 表示,它的单位是瓦 特(watt),简称,符号是 W。前面提到的 24 W500 W,说的就是用电器的电功率。


作为表示电流做功快慢的物理量,电功率等于 电功与时间之比。如果电功用 W 表示,完成这些电 功所用的时间用 t 表示 ,电功率用 P 表示,则

P = Wt

将上节电功 W = UIt 代入上式得P = UI





知微:Switch与If误区

最新想写一些关于编程细致末梢的文章,叫做知微。看文章需要有一定的逆向基础与汇编知识。如果不会的话,不建议阅读。以免给你灌输了错误的思想,而你无法发现。知微相关的文章不保证正确性,只是对发现或者知识点的一种证明。

大概很久以前,对于switch和if。某视频里面说了一句,switch比if要快。于是这个概念就一直记忆到现在。每次碰到这个问题,我基本上都会告诉别人switch比if快。但是为什么快?怎么快的?估计很大一部分人就不知道了。或者说没有听过它俩谁快的说法,代码的编写更因该关注一些细节。毕竟大的方向,框架,算法逻辑什么的,你不一定会写。小的地方你又不了解。那你只是个Copy+C,Copy+V的选手,也无法进步。

同样的代码有两个版本:release 和 debug。这里拿debug来说,为什么拿debug来说,这有涉及到这两个版本的优化问题。可自行查阅相关编译器、解释器的说明。注意它俩并非是名称上的不同。

来看一下两个判断代码:

switch.png


if.png

然后来看一下汇编代码

debug-switch.png

debug-if.png

汇编代码关键的地方我已经备注了,可以发现if语句是每条都会进行判断,有一定的浪费,而switch通过数组直接会索引到相关的printf语句,是比较快的。