作者: 孟繁永

  • Laravel 框架 MySQL 运行报错: PDOStatement::execute (): MySQL server has gone away?

    项目什么都没动,突然发现无法连远程的数据库了,只能连本地的,折腾了半天,连本地的都连不上了,简直像遇到了奇异事件。

    用java程序连了一下,默认连不上,需要把usessl设为false,但是php对应的sslmode设为disable并不起作用。

    尝试修改wait_timeout和connect_timeout也都无效,只是让等待的时间更长了。

    直到在老同事刘明的提醒下,去查看laravel的日志,发现了这么一句:Unexpected server respose while doing caching_sha2 auth

    于是,按这个问题去搜索,找到了https://www.cnblogs.com/qichao123/p/9719470.html

    进到mysql,通过SELECT user,host,plugin FROM mysql.user;

    确认我用的当前用户没问题,是mysql_native_password,于是继续配置my.cnf中的mysqld,添加:

    default_authentication_plugin=mysql_native_password

    回来测试成功。

  • 部署自己的ngrok1.7服务

    非常感谢https://hteen.cn/docker/docker-ngrok.html

    我的服务器是ubuntu,首先登录服务器,依次运行以下命令:

    docker pull hteen/ngrok
    mkdir /root/ngrok
    docker run --rm -it -e DOMAIN='tunnel.yourdomain.cn' -v /root/ngrok:/myfiles hteen/ngrok /bin/sh /build.sh
    docker run -idt --name ngrok-server -v /root/ngrok:/myfiles -p 8082:80 -p 4432:443 -p 4443:4443  -e DOMAIN='tunnel.yourdomain.cn' hteen/ngrok /bin/sh /server.sh

    运行结果显示一个token
    这样,在服务器的/root/ngrok目录下则有
    bin/ngrokd 服务端
    bin/ngrok linux客户端
    bin/darwin_amd64/ngrok osx客户端
    bin/windows_amd64/ngrok.exe windows客户端
    还要增加一个nginx的站点配置,转发请求


    server {
    listen 80;
    server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
    location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://serverlocalip:8082;
    }
    }
    server {
    listen 443;
    server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
    location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://serverlocalip:4432;
    }
    }

    在本地电脑执行命令,下载对应的客户端,我的是mac,所以:
    scp -i meixi.pem root@yourip:/root/ngrok/bin/darwin_amd64/ngrok ~/ngrok
    然后在本地创建ngrok.yml文件,并填入以下内容:


    server_addr: "tunnel.yourdomain.cn:4443"
    trust_host_root_certs:false
    tunnels:
    weixin:
    proto:
    http:8080
    subdomain:"wx"
    api:
    proto:
    http:80
    subdomain:"api"

    然后在本地执行
    ~/ngrok –config=ngrok.yml start weixin api
    就启动了。
  • 某培训机构(服务号)开发计划方案

    某培训机构(服务号)开发计划方案

     

    甲方需求

     

    • 内容模块
    • 付费音视频
    1. 内容专区:分为三大版块【阅读、朗诵、科普】
    2. 呈现形式:音频、视频、音频+文本(根据需要)
    3. 付费方式:单件计费、打包计费、会员计费
    4. 其他功能:试听、留言互动区、打赏

     

    • 在线报名、测评系统
    1. 在线报名

    功能:信息录入、音视频上传

    1. 在线测评

    功能:在线计时答题、统计得分

    1. 信息反馈

    功能:审核通过发送通知书,会员下载打印通知书

    1. 定位

    功能:准确定位会员所在位置,向其推荐就近比赛地点。

     

    • 会员系统
    • 会员渠道:扫码即会员、支付即会员、注册即会员、导入即会员
    • 会员管理:会员信息、权益、互动、积分、余额、打卡、消费、参与活动、报名信息、测评结果、信息反馈……
    • 会员营销:会员标签、积分赠送、商城、推荐有奖、节日关怀、生日关怀……
    • 会员推荐:会员推荐二维码、会员推荐分享页面
    • 会员通知信息的发布

     

     

    • 数据模块
    • 消费记录、充值记录
    • 点播数据:每一节目的浏览及付费数据
    • 行为数据:会员的浏览及消费数据,分析其偏好,可做相关推荐。
    • 定位分布:分析会员的地理位置,定位分布。

     

    • 客服模块

    直接链接到相关人员微信或QQ

     

     

    • 社区模块

    会员信息及时反馈,会员互动,保持热度,定期开展活动,增设赛事及活动的入口。

     

     

     

     

    产品设计

     

    根据甲方需求,将产品总结为一个前后端分离的运营平台和微信应用。其中运营平台包括所有的资源管理和业务管理,微信应用作为面向用户的终端呈现,为用户提供在线服务。

    需求基本上反映了业务需求,本方案对部分细节设定做了增减,如暂时不考虑积分规则,而建议在用户激活之后逐步设计积分规则和配套的运营活动,否则将对系统复杂度影响太大,而又不能在初期用户导入阶段发挥足够的作用。另外,用户的互动场景表达尚不清晰,考虑到用户间的交流面临审核监管的责任问题,建议单独设计这一部分的功能和管理方式,初步方案中也暂不涉及。

    针对营销管理和消息推送模型做了较为细致的设计。其中营销管理的管理方式覆盖了典型的营销策略,可以直接配置上线,不需二次开发,消息管理覆盖了短信、微信、邮件多通道消息推送,及定时和触发两种模式,可以兼顾几乎所有业务场景,由运营方有效主导。

     

    架构设计

     

    开发计划

    模块 开发周期(周)
    运营管理平台 用户管理 1
    分类管理 0.5
    资源管理 1
    课程管理 1
    营销管理 3
    订单管理 1
    授权管理 1
    知识答题 2
    活动管理 1
    消息管理 2
    推荐管理 1
    行为管理 2
    客户专员 1
    权限管理 0.5
    微信应用 消息推送 0.5
    内容浏览 1
    课程清单 1
    活动报名 1
    知识答题 1
    我的会员 1
    合计 23.5

     

    开发周期6个月,总报价:60万元。

     

    运营支撑服务

    云主机:每年2000元至5000元。

    流量费用:每会员每月0.5元至2元。

    运维费用:每月1万,上线后前12个月免费,含设计范围内的合理修改,不含功能变更或扩充。

    响应时效:紧急需求24小时内提供解决方案,一般需求48小时内提供解决方案。

    PDF版下载:

    某培训机构服务号开发计划方案

  • 房租涨了,不要只怪中介

    先说一下体会的来源,我是airbnb的超赞房东,先后经营三套房子,有自己的,也有朋友的,做airbnb的初衷很简单,房子是精装修,也很新,长租出去折旧很厉害,不划算,短租的话虽然麻烦,但可以保持房子的品质,相对长租,也可以有一些额外的收益。

    简单算个账,一个一居的房子装修费在十万左右,包括硬装、软装、家具电器等。如果是自住,折旧周期可以按十年算,如果长租出去,恐怕最多只能按五年算。这样的话,平摊到每个月,就是至少一千元的差别。这还不考虑加上了折旧的房子后面的租金上升空间有限甚至降低。

    就北京来说,当老旧的房子越来越少,新的房子越来越多,流动人口减少,稳定人口增加,对好房子需求也越来越多的情况下,吸引更多精装修的高端房源入市,但同时,这些房源对折旧的预期是很高的,一居室每个月要加上一千多的折旧,两居室就要加三四千。

    那么,如何才能降低房东的折旧预期,以更低的价格租到好房子呢?那就是建立自己的信用,比如在airbnb上获得更多的好评,爱护你租的房子,无论是长住还是短租。实际上,对房子的爱惜,将降低总的成本,这个成本最终都是由房客自己承担的。

    市场欢迎更好的房客,请尊重市场规律,请尊重自己,提高自己的生活品味,让每个房子都受到妥善的对待。

  • 苟利国家生子以,岂因福祸避孕之

    标题是最近网络未流行已被禁的一条改编版名言。

    我的第二个孩子即将在10月出生,关于他的出现,我们几乎没有太多的纠结,尽管也明白因他而带来的更多的付出,但一个生机勃勃的家更加有吸引力。当然,就目前情况而言,第三个孩子的可能性是比较小了。

    网络上有很多关于计划生育走向的传言,我们也曾经是限制二胎政策的遇难者,可是,作为个人而言,似乎没有太多的选择,也没有有效的抗争渠道,最有用的则是尽力保持家庭的生存能力。

    新的生命总是无法预料,不断带来惊喜和挑战。在解决一个个问题的过程中,我们老去,直到因为死亡率百分之百的生命这个病而离世。(最后这句来自网络)我们依然还是期望着更加美好,而不断为之努力。

     

  • 过了这么久才遇到github资源域名被污染的情况

    上周打开github突然发现样式无法加载,打开vpn才行,后来搜索才知道这个情况已经存在好多年了,不是封禁IP,而是DNS污染,这种情况适用自行定义hosts的方法。

    即,在hosts文件中定义如下关系。

    151.101.24.133 assets-cdn.github.com

  • 使用iview的upload组件上传阿里oss的参数设置

    下面是组件设置:

    <Upload action="http://public.files.dpexpo.cn"
    ref="upload"
    :show-upload-list="false"
    accept=".pdf"
    :format="['pdf']"
    :on-success="uploadSuccess"
    :data="uploadParams"
    :max-size="102400"
    :before-upload="handleBeforeUpload">
    <Buttontype="ghost"
    icon="ios-cloud-upload-outline">Upload pdf</Button>
    </Upload>
    以下是相关的js方法:

    handleBeforeUpload(file) {
    letthat=this;
    return new Promise(function(resolve, reject) {
    that.getUploadParams().then(function() {
    that.$Notice.warning({
    title:'文件准备上传',
    desc:'文件 '+file.name+' 准备上传。',
    duration:3
    });
    resolve();
    });
    });
    },
    getUploadParams() {
    varthat=this;
    return new Promise(function(resolve, reject) {
    that.$http// 在此方法中调用后台数据
    .get('/ossParams', {
    params: {
    dir:
    'slide/conference/'+
    that.$route.query.conference_id+
    '/'
    }
    })
    .then(function(response) {
    console.log(response);
    that.uploadParams=JSON.parse(response.data.data);
    console.log(that.uploadParams);
    resolve();
    })
    .catch(function(error) {
    console.log(error);
    });
    });
    },
    uploadSuccess(evnet, file) {
    console.log(file);
    this.$Notice.success({
    title:'文件上传成功',
    desc:'文件 '+file.name+' 上传成功。',
    duration:3
    });
    this.formValidate.slide_url=
    'http://public.files.dpexpo.cn/slide/conference/'+
    this.$route.query.conference_id+
    '/'+
    file.name;
    },

    以下是发放参数的api方法(laravel):

    public function ossParams(Request $request)
    {
    $id = 'LTA(your id)V1E';
    $key = '4M5nIHs(your key)IelsW';
    $host = 'http://public.files.dpexpo.cn';
    $now = time();
    $expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
    $end = $now + $expire;
    $expiration = $this->gmt_iso8601($end);
    $dir = $request->dir ? $request->dir : 'user-dir/';
    //最大文件大小.用户可以自己设置
    $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
    $conditions[] = $condition;
    //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
    $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
    $conditions[] = $start;
    $arr = array('expiration' => $expiration, 'conditions' => $conditions);
    //echo json_encode($arr);
    //return;
    $policy = json_encode($arr);
    $base64_policy = base64_encode($policy);
    $string_to_sign = $base64_policy;
    $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));
    $response = array();
    //$response['host'] = $host;
    $response['key'] = $dir.'${filename}';
    $response['policy'] = $base64_policy;
    $response['OSSAccessKeyId'] = $id;
    $response['Signature'] = $signature;
    $response['expire'] = $end;
    //这个参数是设置用户上传指定的前缀
    //$response['dir'] = $dir;
    $token = json_encode($response);
    return$this->response->array(['data' => $token]);
    }

  • 汽车涉水应急气囊解决方案

    使用场景:城市突发积水、野外涉水等

    装备:

    (1)快速充气气泵,建议每分钟100L以上,最好能到200L,按车自重一吨到两吨粗略计算,充气需要十分钟,最好为充气泵单独准备应急电源。

    (2)橡胶气囊两个,直径0.6m以上,长度4.5m,中间可以用橡胶布连接在一起,也可以用绑带连接,布置在汽车两侧。

    使用:

    首先应将车窗打开或两厢车打开后备厢门,避免气囊充气后车门无法打开,造成无法逃生。

    以最快的时间布置并充气。

    以上方案仅为理论方案,未经测试,不对该方案造成的任何后果负责。

    成本:

    快速充气泵估计需要500元以上,普通充气泵每分钟50L,充气需要20分钟,时间有点长。

    气囊估计在500元以内,目前暂时没有现成的产品。

  • Visual Studio Code中使用Docker中的Xdebug

    开发环境说明

    IDE:Visual Studio Code

    DNMP:https://github.com/yeszao/dnmp

    项目:laravel

    开启xdebug

    修改dnmp/php/php72/Dockerfile,添加以下两行(插在带\的任一一行后面即可,查看dockerfile编写规范):

    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    修改dnmp/config/php.ini,在文件末尾添加以下内容:
    [xdebug]
    zend_extension=xdebug.so
    xdebug.remote_port=9000
    xdebug.remote_enable=1
    xdebug.remote_host=192.168.0.102
    xdebug.remote_autostart=1
    xdebug.remote_log="/var/log/dnmp/xdebug.log"

    其中192.168.0.102就是你的电脑的IP,也就是docker宿主机的IP,docker的端口都挂到宿主机IP上。xdebug默认是localhost,不改就访问不到了。也不要打开

    xdebug.remote_connect_back=1,这会使得remote_host配置失效。
    在vscode中安装PHP Debug插件,在调试选项卡中打开齿轮配置,即当前项目的.vscode/launch.json,对照以下内容配置:
    
    {
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Listen for XDebug",
    "type": "php",
    "request": "launch",
    "port": 9000,
    "pathMappings":{
    "/var/www/html": "${workspaceRoot}"
    }
    },
    {
    "name": "Launch currently open script",
    "type": "php",
    "request": "launch",
    "program": "${file}",
    "cwd": "${fileDirname}",
    "port": 9000
    }
    ]
    }
    其中,/var/www/html是你在dnmp/www中的site的位置,如果有子目录则填到子目录级别,这里的pathMappings是最新的写法。
    在dnmp目录启动:docker-compose up
    在vscode按F5启动调试,记得打上断点,祝你成功。
    如果已经生成过容器,则需要删除容器,删除镜像。重新生成dnmp-php命令如下:
    docker rm dnmp-php
    docker rmi dnmp_php
    docker-compose up
  • 又来了shimuFun的兴趣

    为了女儿的暑假安排,也出于一直以来的兴趣,特别关注了一下木工手作。可是,最大的问题是如何在城市里拥有一个可以无扰玩木工的场地。

    目前还没有有效的方案,尽管纯手工,排除电动工具是一个途径,但是那不是我的兴趣的,我又不是为了练手艺。我的目标是把实木与电子结合一下,或者是实木物联网。

    尽管大陆也能零星看到一些木工坊的创业新闻,但至少目前还没有普及到像跳舞画画那样,满大街都是,家长们也愿意花钱去带孩子学。如果你有什么好办法请留言。