作者: null

  • 一个WPJAM BASIC插件CDN功能引起的前端问题

    一个WPJAM BASIC插件CDN功能引起的前端问题

    之前启用过WPJAM BASIC的CDN功能,并按官方使用说明配置了CDN加速,后期因需要调试一些修改,又按官方说明关闭了WPJAM BASIC的CDN加速。

    最近发现所有分流到腾讯云COS上的JS文件,都无法正确引用COS绑定的www.guohao.asia这个域名,而是自动变成blog.guohao.asia/xxx.js,经过排查后,初步判断是关闭WPJAM BASIC的CDN功能时,按官方说明填写了”其他域名”导致的,删除该项后再度刷新,恢复正常。

    这是个概率很小的BUG,因为几乎不会再有人像我一样把xxx.xxx设置成网站域名而把www.xxx.xxx设置成COS加速域名。

    不过经此调整之后,之前在CDN过程中常见的一些错误应该可以得到修正。

  • 工作分析调研问卷

    工作分析调研问卷

    通过LimeSurvey发起一个关于工作分析的问卷。主要分为基本信息、主观认知、客观描述和业务关系四个部分。所收集的样本数据可以对公司业务结构及各岗位工作开展情况进行初步分析,同时也是后续开展员工面谈的辅助资料。

    image-20221107090747383

    希望通过此调研,可以对公司业务流程、岗位设置等信息进行汇总,以便推进各项优化工作。

    主观认知

    image-20221107090901180

    主观认知部分,用于收集样本对其所在部门及其本人的工作认知。通过样本主观认知与岗位标准模型的偏差,可初步分析样本在对应岗位上的胜任程度,同时也可以根据样本的主观认知,了解员工对所在部门及公司整体业务的了解程度,如有必要,后续可有针对性的加强目标管理,确保个体工作方向与整体目标一致。

    客观描述

    image-20221107092100339

    客观描述环节所收集的数据由员工日常工作、重点工作及周期性任务组成,其中周期性工作可与前两者重叠。此部分数据可用于分析样本工作饱和度信息,并与主观认知中的工作饱和度自评进行验证,加强调研信度。

    在对样本数据的分析中,亦可对公司整体业务分配情况进行梳理,排查重复性工作,从而进一步优化岗位分工。

    业务关系

    image-20221107092333962

    业务关系模块用于梳理公司业务流程关系,对各岗位的上下游业务关系进行明确,并通过与标准模型的对比,完成对业务流程设计的优化。

  • Echarts PHP MySQL 调用实例

    Echarts PHP MySQL 调用实例

    Apache ECharts

    image-20221102132955203

    ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

    ECharts 提供了常规的折线图柱状图散点图饼图K线图,用于统计的盒形图,用于地理数据可视化的地图热力图线图,用于关系数据可视化的关系图treemap旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图仪表盘,并且支持图与图之间的混搭。

    image-20221102133119573

    连接数据库

    创建sql_config.php

    <?php
        $mysql_server_name='127.0.0.1'; //mysql数据库服务器
        $mysql_username='cs'; //mysql数据库用户名
        $mysql_password='123456'; //mysql数据库密码,初始默认密码为空
        $mysql_database='cs'; //mysql数据库名
     ?>

    因为是测试用的甲骨文云服务器,就不再做脱敏了,以下亦同。

    读取并处理数据库数据

    <?php
    //这部分的功能是读表数据并且转为json格式,便于js处理。
      require("sql_config.php");
      $conn=mysqli_connect($mysql_server_name,$mysql_username,$mysql_password) or die("error connecting");
      mysqli_query($conn,"set names 'utf8'"); //数据库输出编码
      mysqli_select_db($conn,$mysql_database); //打开数据库
      $result = mysqli_query($conn,"select * from wp_statistics_visit");//打开你的表
      $data="";
      $array= array();
      class User{
        public $last_counter;
        public $visit;
      }
      while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)){
        $user=new User();
        $user->last_counter = $row['last_counter'];
        $user->visit = $row['visit'];
        $array[]=$user;
      }
      $data=json_encode($array);
      // echo "{".'"user"'.":".$data."}";
      echo $data;
    ?>

    数据呈现

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>访问统计</title>
        <script type="text/javascript" src="https://www.guohao.asia/cdn/echarts-5.4.0/dist/echarts.js"></script>
        <script type="text/javascript" src="https://www.guohao.asia/cdn/jquery-3.6.1.min.js"></script>
    
    </head>
    <body>
        <div style="position: relative; overflow: hidden; width: 600px; height: 400px; padding: 0px; margin: 0px; border-width: 0px; cursor: default;">
        <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
        <div id="bar" style="height:400px"></div>
        <script type="text/javascript">
                  var  myChart = echarts.init(document.getElementById('bar'));
                  var arr1=[],arr2=[];
                  function arrTest(){
                    //这个功能块的作用就是读取json数据。
                    $.ajax({
                      type:"post",//请求服务器载入数据
                      async:false,//异步属性
                      url:"bar.php",
                      data:{},
                      dataType:"json",
                      success:function(result){
                        if (result) {
                          for (var i = 0; i < result.length; i++) {
                              arr1.push(result[i].last_counter);
                              arr2.push(result[i].visit); //这边更新字段,可以只写你需要展示的字段。 
                          }
                        }
                      }
                    })
                    return arr1,arr2;
                  }
                  arrTest();
                  var  option = {
                  title : {
                        text: '访问数据',
                        subtext: '测试'},
    
                  //Bootstrap 提示工具(Tooltip)插件,鼠标悬停时候的提示框
                  tooltip: {
                  show: true
                  },
                  //图例
                  legend: {
                  data:['last_counter','visit']
                  },
                  //工具箱
                  toolbox: {
                        show : true,
                        feature : {
                             dataView : {show: true, readOnly: false},
                               magicType : {show: true, type: ['line', 'bar']},
                               restore : {show: true},
                               saveAsImage : {show: true}
                            }
                  },
                            calculable : true,
                  //x轴
                  xAxis : [
                  {
                  type : 'category',
                  data : arr1
                  }],
                  //y轴
                  yAxis : [
                  {type : 'value'}
                  ],
                  //需要展示的系列,根据需要
                  series : [
                   {
                   "name":"访问量",
                   "type":"bar",
                   "data":arr2,
                   markPoint : {
                                data : [
                                {type : 'max', name: '最大值'},
                                {type : 'min', name: '最小值'}
                                        ]
                                            },
                                markLine : {
                                data : [
                                {type : 'average', name: '平均值'}
                                       ]
                                            }
                            },
                        ]
                    };
                    // 为echarts对象加载数据
                    if (option && typeof option === "object") {
                          myChart.setOption(option, true);
                      }
        </script>
    </body>
    </html>

    效果

    image-20221102154211846
    image-20221102154232521
    image-20221102154251411

  • php操作mysql(一)

    php操作mysql(一)

    php操作mysql(一)

    mysqli_connect

    通过mysqli_connect新建数据库表。新建mysql.php,写入:

    <?php
    $dbhost = 'localhost';  // mysql服务器主机地址
    $username = 'cs';            // mysql用户名
    $dbpass = 'cs123456';          // mysql用户名密码
    $dbname = 'cs'; //mysql数据库名
    $conn = mysqli_connect($dbhost, $username, $dbpass,$dbname);
    if(! $conn )
    {
        die('连接失败: ' . mysqli_error($conn));
    }
    echo '连接成功<br />';
    $sql = "CREATE TABLE cs( ".
            "id INT NOT NULL AUTO_INCREMENT, ".
            "name VARCHAR(100) NOT NULL, ".
            "age VARCHAR(40) NOT NULL, ".
            "date DATE, ".
            "PRIMARY KEY ( id ))ENGINE=InnoDB DEFAULT CHARSET=utf8; ";
    mysqli_select_db( $conn, 'cs' );
    $retval = mysqli_query( $conn, $sql );
    if(! $retval )
    {
        die('数据表创建失败: ' . mysqli_error($conn));
    }
    echo "数据表创建成功\n";
    mysqli_close($conn); //断开连接
    ?>

    mysqli_connect(host, username, password, dbname,port, socket);

    参数描述
    host可选。规定主机名或 IP 地址。
    username可选。规定 MySQL 用户名。
    password可选。规定 MySQL 密码。
    dbname可选。规定默认使用的数据库。
    port可选。规定尝试连接到 MySQL 服务器的端口号。
    socket可选。规定 socket 或要使用的已命名 pipe。
    image-20221101170915977
  • 2022年全国各省/自治区最低工资标准

    2022年全国各省/自治区最低工资标准

    2022年全国各省/自治区最低工资标准

    单位:元

    地区月最低工资标准小时最低工资标准
    第一档第二档第三档第四档第一档第二档第三档第四档
    北京232025.3
    天津218022.6
    河北190017901680158019181716
    山西18801760163019.818.517.2
    内蒙古19801910185020.820.119.5
    辽宁191017101580142019.217.215.914.3
    吉林188017601640154019181716
    黑龙江186016101450181413
    上海259023
    江苏228020701840222018
    浙江228020701840222018
    安徽165015001430134020181716
    福建20301960181016602120.51917.5
    江西18501730161018.517.316.1
    山东210019001700211917
    河南20001800160019.617.615.6
    湖北201018001650152019.51816.515
    湖南193017401550191715
    广东230019001720162022.218.11716.1
    其中:深圳236022.2
    广西18101580143017.515.314
    海南18301730168016.315.414.9
    重庆210020002120
    四川210019701870222120
    贵州17901670157018.617.516.5
    云南167015001350151413
    西藏185018
    陕西195018501750191817
    甘肃18201770172016701918.417.917.4
    青海170015.2
    宁夏195018401750181716
    新疆1900170016201540191716.215.4

    注:本表数据时间截至2022年4月1日;数据来源:人社部官网

  • 配置Oracle免费主机

    配置Oracle免费主机

    配置Oracle免费主机

    在腾讯云的用户群里看到大家都在申请Oracle的永久免费主机,虽然手里目前有腾讯云、华为云的三个主机,但毕竟是收费的,而以国内厂商的秉性,老用户与狗是没机会享受优惠的,所以再申请个免费的主机有备无患。

    配置

    配置: VM.Standard.E2.1.Micro

    OCPU 计数: 1

    网络带宽 (Gbps): 0.48

    内存 (GB): 1

    本地磁盘: 仅块存储

    免费主机的配置不高,都是1核1GB内存的,在国内访问速度还可以。

    修改root密码并启用root登录

    SSH登录后,需要先修改root用户名并启用root登录,这样在环境配置过程中能方便一些:

     sudo -i // 使用opc用户登录后切换root
     echo root:newpassword |sudo chpasswd root // 修改root的密码
     sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config; // 开启root登录
     sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config; // 开启密码验证
     service sshd restart // 重启ssh服务
    image-20221022102833233

    修改密码后,切换回默认用户,验证一下密码是否修改成功。

    去除宝塔面板安装mariadb的内存限制

    去掉宝塔面板在安装mariadb时对主机内存的限制,注释掉www/server/panel/class/panelPlugin.py的第736行,网上有教程说注释到138行,但实际上不同版本的宝塔面板代码位置不一致,实际修改过程中,建议搜索如下代码:

    if not self.check_mem_limit(versionInfo['mem_limit']): return public.returnMsg(False,'至少需要[%dMB]内存才能安装' %

    用==#==注释掉代码后重启宝塔面板服务。

    不过小内存安装mysql-mariadb_10.3速度慢到不可思议,如果不是必须用高版本,建议还是按宝塔面板的建议来安装吧!

  • ERR_HTTP2_PROTOCOL_ERROR 等错误Debug

    ERR_HTTP2_PROTOCOL_ERROR 等错误Debug

    ERR_HTTP2_PROTOCOL_ERROR 等错误Debug

    网站配置CDN和COS后,频现ERR_HTTP2_PROTOCOL_ERROR错误,而且网络访问极不稳定且速度慢,丝毫没有体现出服务器挪回国内并且开启CDN和COS的作用。

    网上查了很多文档,最终从以下三个方面入手解决了问题。

    域名证书

    个人博客网站如果配置多域名证书或通配符证书过于奢侈,一年证书的费用甚至相当于服务器和域名3到5年的成本。而在使用免费域名证书的过程中,只能申请到单域名证书,这样在配置CDN和COS过程中往往会遇到一些证书错误的问题。

    今日突发奇想,我网站用的是blog.guohao.asia/这个顶级域名,在申请免费SSL证书的过程中,SSL证书同时包含了blog.guohao.asia/;www.guohao.asia,这样一来,不就相当于这张免费的SSL证书变成了包含主域名和WWW二级域名的“多域名”证书了么?!

    于是在腾讯云CDN控制台,复制原cdn.guohao.asia的配置信息到www.guohao.asia,在wordpress后台的插件中重新配置CDN域名信息。

    自此,网站上的CDN源显示恢复正常。

    CDN-HTTP响应头配置

    image-20220930145017139

    关闭CDN Access-Control-Allow-Origin “HTTP响应头配置”。

    可能的原因是:

    • Access-Control-Allow-Origin 是用来设置接口跨域访问的.设置为*表示接受任何域的请求.
    • 根据W3C标准,如果支持用户凭证,设置Access-Control-Allow-Origin为当前域,并且设置Access-Control-Allow-Credentials为true;
    • 否则当设置Access-Control-Allow-Origin为*时,是不允许设置Access-Control-Allow-Credentials为true的.

    CDN-QUIC

    image-20220930145445481

    在CDN控制台中开启QUIC,并填写网站域名。


    刷新CDN节点缓存及本地缓存后网站访问恢复正常。

  • 通过excel计算身份证号校验位

    通过excel计算身份证号校验位

    通过excel计算身份证号校验位

    自从2004年1月1日《中华人民共和国居民身份证法》施行开始,居民身份证号码由15位升为18位,其中年份由2位扩展位4位,同时增加最后一位作为校验位。

    在人事管理的实际操作过程中,曾经遇到过持假身份证入职的情况,当时我正在企业里牵头EHR系统实施,员工电子档案还只是通过Excel管理,所以只能通过Excel来校验身份证号码的真伪。

    • 校验位是根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

    计算过程如下:

    1. 身份证第 1-17 位分别乘以对应的权重因子
    权重
    1. 将乘积之和取模 11(即取除以11后的余数),根据下表得到对应的第 18 位校验码
    校验码

    其中的X,实际上是罗马数字中的10,即Ⅹ

    image-20220929120613175

    在不同的字体里,两者可能会存在非常相似的情况,但在Excel中,用code函数可以很清楚的看出两者之间的差别。

    在实际工作中,为了输入方便,往往也是直接输入大写英文字母“X”。

    通过Excel数组公式求身份证号校验位:

    =MID("10X98765432",MOD(SUM(MID(A1,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)

    Excel中的数组公式需要使用SHIFT+CTRL+ENTER键入

    通过VBA自定义函数处理身份证号校验位:

    Function ID(num)
        Dim X(17)  '储存身份证号码分割后的每位字符
        Dim Y()  '储存计算相乘的系数
        Dim LastNum()  '储存身份证最后一位验证码    
        '储存身份证前17位
        For i = 0 To 16
            X(i) = Mid(num, i + 1, 1)
        Next   
        '如果第18位是字母X或x,将数字10储存到X(17)中
        '如果第18位是数字,直接储存到X(17)中
        '如果是其他情况,什么都不做
        If Mid(num, 18, 1) = "X" Or Mid(num, 18, 1) = "x" Then
            X(17) = 10
        ElseIf IsNumeric(Mid(num, 18, 1)) Then
            X(17) = Mid(num, 18, 1)
        End If    
        'Y中最后一位11是取模的除数,其余是相乘系数
        Y = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 11)
        LastNum = Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2)    
        '判断位数,18位且前17位都是数字才可能正确,再计算校验码判断
        If Len(num) = 18 And Application.WorksheetFunction.IsNumber(Mid(num, 1, 17)) Then
            Sum = 0
            For i = 0 To 16
                Sum = Sum + X(i) * Y(i)
            Next
            Code = Sum Mod Y(17)
            If LastNum(Code) - X(17) = 0 Then
                ID = "正确"
            Else
                ID = "请检查身份证号码!"
            End If    
        '非18位情况身份证号码错误
        Else
            ID = "请检查身份证号码!"
        End If        
    End Function

    以下是经优化后的VBA代码:

    Function ID(num)
    Dim X(0 To 16) As String '储存身份证号码分割后的每位字符
    Dim Y() As Integer '储存计算相乘的系数
    Dim LastNum() As Integer '储存身份证最后一位验证码
    Dim i As Integer
    Dim Sum As Long
    Dim Code As Integer
    
    '将字符串转成字符数组并储存
    X = Split(Left(num, 17), "")
    
    '如果第18位是字母X或x,将数字10储存到X(17)中
    '如果第18位是数字,直接储存到X(17)中
    If Mid(num, 18, 1) Like "[0-9]" Then
        X(17) = Mid(num, 18, 1)
    ElseIf LCase(Mid(num, 18, 1)) = "x" Then
        X(17) = "10"
    End If
    
    'Y中最后一位11是取模的除数,其余是相乘系数
    Y = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 11)
    LastNum = Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2)
    
    '判断位数,18位且前17位都是数字才可能正确,再计算校验码判断
    If Len(num) = 18 And IsNumeric(Left(num, 17)) Then
        Sum = 0
        For i = 0 To 16
            Sum = Sum + X(i) * Y(i)
        Next
        Code = Sum Mod 11
        If LastNum(Code) = CInt(X(17)) Then
            ID = "正确"
        Else
            ID = "请检查身份证号码!"
        End If
    '非18位情况身份证号码错误
    Else
        ID = "请检查身份证号码!"
    End If
    End Function
    
    优化说明:
    
    将变量声明放置在函数开始处,提高代码的可读性;
    将字符分割为字符数组,简化代码;
    使用Like运算符代替Or,简化代码;
    将字符转换为数值类型,提高代码执行效率;
    简化校验码的计算过程;
    若校验码计算错误,提示后缀不必添加“位身份证号码”。
  • 【Excel】SUMPRODUCT函数-条件求和

    【Excel】SUMPRODUCT函数-条件求和

    【Excel】SUMPRODUCT函数-条件求和

    单条件求和

    =SUMPRODUCT(A:A*(B:B=C1))
    • 求和区域与条件区域不需要区分前后顺序;

    例:如果B列中的数值等于C1,则将其在A列的数值进行求和计算;

    多条件求和

    判断条件位于不同列中:

    Sumproduct(求和区域,(条件区域1=条件1)*(条件区域2=条件2)*..)
    • 求和区域在最前或者最后都可以,条件判断区域用*链接;

    如:

    =SUMPRODUCT(C2:C7,(A2:A7=E1)*(B2:B7=F1))

    判断条件位于同一列中:

    =SUMPRODUCT([对第一组数据求和]+[对第二组数据求和])

    如:

    =SUMPRODUCT((A2:A7=E1)*(B2:B7)+(A2:A7=E2)*(B2:B7))

    对同一主体不同比例的结果求和

    =SUMPRODUCT(基数区域,比例区域)

    此类数据统计常见于对销售业绩的管理,另外在HR的日常业务中,关于社保金额的计算也会涉及到相似的需求。

    在传统计算方法中,需要分别计算三个基数对应三个比例的小计值,最后对小计值进行求和,往往需要数据辅助列来完成。在使用SUMPRODUCT后,可直接对该结果进行求和:

    =SUMPRODUCT(B2:B4,C2:C4)

    SUMPRODUCT的计算过程和传统先求小计再求合计的过程是相同的,比较好理解。

    其他

    当然,SUMPRODUCT函数还有很多更高级的使用方式,比如与FIND函数协作进行模糊统计等等,但由于在日常工作中的应用相对较少,在此就不再多做介绍。

  • 域名备案完成

    域名备案完成

    blog.guohao.asia/ 这个域名是在2014年10月注册的,已经用了8年多。之前在阿里云做过备案,但后期从阿里云转到腾讯云之后,备案就因为IP不一致被取消掉了。为了提升网站的访问速度,把站点迁回国内,现在又不得不重新开始备案历程。

    从2022年9月19日到9月27日,历时8天,备案完成! 不得不说,域名ICP备案是个挺神奇的过程,各地管局都要求在备案之前要确保网站不能被访问,所以,备案过程中核查的应该只是网站经营者身份,而非网站的具体内容。也正是因此,站点暂时关闭,等待备案号下发,在此之前,先离线写一些内容,同时研究一下如何用另外一个域名绑定到wordpress上。

    在尝试用另外一个域名绑定的时候,又出现了一个奇葩问题——一个崭新的域名从GoDaddy解析到腾讯云海外服务器,居然被腾讯云给限制了,这还是在尝试做CDN过程中发现的,莫非腾讯云和GoDaddy还有其他不为人知的爱恨情仇?

AI 助手