分类目录归档:未分类

PHP生成二维码传到页面的坑

PHP生成二维码

最近做页面保存长图的功能,长图底部需要附带页面地址二维码,之前没搞过二维码相关的实现,在Google上搜索一番,发现了两个现有的轮子phpqrcode扩展和qr-code扩展。

对比发现phpqrcode很多年没有维护了,最终选择了qr-code。
注:如果使用phpqrcode可以参考PHP基于phpqrcode类生成二维码

使用qr-code生成二维码很容易,参考这篇文章PHP生成二维码
继续阅读

堆及堆排序PHP实现

什么是堆

堆是一种数据结构,特殊的树形数据结构。常见的堆有二叉堆、二项式堆、斐波拉契堆等。
堆这种数据结构主要用来实现两个功能:堆排序和优先队列。

细说二叉堆

这里细说的堆排序使用的是二叉堆,那么二叉堆是什么样的呢
二叉堆是一颗完全二叉树(维基百科提到还有可能是近似完全二叉树,很不理解),节点和双亲节点维持着固定的关系,要么节点的值都大于双亲节点,要么节点的值都小于双亲节点,并且每个节点的左右子树都是二叉堆。
特点:
0、节点都大于双亲节点的二叉堆叫打顶堆。
1、节点都小于双亲节点的二叉堆叫小顶堆。
2、二叉堆一般用一维数组来存储。
3、二叉堆一个节点的左右孩子没有顺序。
4、有n个元素的二叉堆,最后一个非叶节点为n/2 -1
继续阅读

H5页面生成长图实践总结

最近这一两年,长图分享突然悄无声息的兴起了。刚在产品上增加了这一功能,发现确实是一种极好的分享传播方式。
生成的效果图太长,下拉在文末可以查看到

结合之前的调研,以及尝试走不通的路,以下整理了这个功能点相关的方案,希望提供你有用的参考。
继续阅读

浅谈Trie

提到敏感词过滤,经过简单思考,你没有想到Trie的话,那么你就不要思考了,这篇文章很适合你。如果你想到了,这篇文章也不失一篇很好的参考。

有经验的开发者都会说到用字典树来实现敏感词检测过滤等功能,字典树即本文所谈论的对象Trie。

他的别名除了字典树,还有很多:前缀树、单词查找树、键树。跟很多人一样,我也格外喜欢前缀树(Prefix Tree)这个昵称。
继续阅读

排序之插入排序

一、原理
插入排序原理,通过构建有序序列,对于未排序的数据部分,在已排序的序列中从后往前扫描,找到相应的位置,逐个元素插入。类似于打扑克牌,取牌的过程。

二、算法
0、从第一个元素开始,认为该元素已被排序。
1、取下一个元素,在已经排序的元素序列中从后往前扫描。【取下一个元素这个表述特别赞,如果用第二个元素就不好表达后面的插入了】
2、如果该元素大于新元素,则后移该元素。
3、重复步骤2,直到找到小于、等于新元素的位置。
4、将新元素插入到该位置后。
5、重复步骤1-4。
继续阅读

Git常用命令整理三(Git配置)

命令清单:

  • 配置信息git config
  • 查看仓库地址git remote -v
  • git clone 提示
    The project you were looking for could not be found

    git clone默认使用的用户名是在哪

    git config设置的只是昵称
    git config –global user.name “salmonl”
    git config –global user.email “chuanbo7@staff.weibo.com”

    git log -l 5
    commit b78c72ec12ae62b76c7db5fd1a4101894b918de7
    Author: salmonl <chuanbo7@staff.weibo.com>
    Date:   Thu May 9 12:16:22 2019 +0800
    
        del debug code
    

    git config –list
    继续阅读

    PHP实现括号匹配检查

    思考这样一个经典的问题,检查一个字符串中的括号(只有括号)是否匹配?

    很多年前在面试的时候被问到这个问题,自己想到的是用正则来处理,具体实现的时候又无法兼容全部情况。

    事后知道用栈就能很容易的处理。栈是一种特殊的线性表,只能在一端进行插入和删除操作,具有后进先出的特点。

    实现算法:
    0、遍历字符串,判断括号类型
    1、如果是左括号,添加到数组中
    2、如果是右括号,从数组中取出最后一个元素,没有元素或不匹配验证失败;匹配这删除元素,继续
    3、遍历完后,检查数组是否为空,为空则验证成功,否则验证失败。
    继续阅读

    Hive和JSON_UNESCAPED_UNICODE

    这篇记录是为了纪念自己的无知和自以为是。

    给数据部门提供了一个json格式的HTTP接口, 直接使用php函数json_encode($data)处理数据,返回的数据中包含中文,结构如下:

    echo json_encode($data);
    
    {"code":1000,"msg":"succ","data":{"list":[{"pid":"6","video_keys":"\u90fd\u633a\u597d","type":"1"},{"pid":"5","video_keys":"\u7535\u89c6\u5267\u77e5\u5426\u77e5\u5426\u5e94\u662f\u7eff\u80a5\u7ea2\u7626","type":"1"}],"total":6}}
    

    对方的技术希望返回的数据直接是汉字,我自己请求了一遍接口, 因为Chrome装有json解析插件JSONView,curl请求也使用了json解析插件jq, 都格式化好了,看到的结果如下:
    继续阅读

    PHP静态变量用法

    静态变量,static variable。下面这句话非常重要: 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

    具体例子可参考官网。下面给出生产环境的用法:
    一、区分项目
    在基础目录新增一个Util.php文件

    <?php
    /**
     * 功能介绍 工具方法
     *
     * @author:   chuanbo7 <salmonl@niliu.me>
     * @date:     2019-04-19
     */
    
    // set app标示
    function appFlagSet($flag, $get = false)
    {
        static $app_flag = ' ';
        if ($get === true) {
            return $app_flag;
        }
        $app_flag = $flag;
    }
    
    // get app标示
    function appFlagGet()
    {
        return appFlagSet('', true);
    }
    
    // the end of the script
    

    用法:
    0、在项目入口文件index.php中引入这个文件
    1、在项目路由中区分项目,分别调用appFlagSet()写入不同的标示。

    $uri = $request->getRequestUri();
    if ($uri == 'episode') {
        appFlagSet(EPISODE);
    } elseif ($uri == 'variety') {
        appFlagSet(VRRIETY);
    }
    

    2、在项目中任何地方调用appFlagGet()获取项目标示。
    3、思考:如果是单纯的标示,使用$GLOBALS[‘app_flag’] = EPISODE;也可以达到目的。

    二、项目记录Debug和执行时间
    0、在基础目录新增一个Util.php文件

    <?php
    //打时间标记, $flag 为标记名,默认为_default
    function flagtime($flag = '_default') {
        static $static_time = array();
        if (!isset($static_time[$flag])) {
            $static_time[$flag] = microtime(true);
        }
        $diff = microtime(true) - $static_time[$flag];
        $static_time[$flag] = microtime(true);
    
        return substr(($diff * 1000) , 0, 5) . 'ms';
    }
    
    //存debug信息
    function debugSet($string, $get = false) {
        if (!DEBUG)
        return '';
        static $debug_data = array();
        if ($get === true) {
    
            return $debug_data;
        }
        if (DEBUG) {
            $d = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
            $file = isset($d[0]['file']) ? basename($d[0]['file']) : 'unknown';
            $line = isset($d[0]['line']) ? $d[0]['line'] : 'unknown';
            $debug_data[] = $file . '(line ' . $line . '): ' . $string;
        }
    }
    //取debug信息
    function debugGet() {
    
        return debugSet('', true);
    }
    

    1、在入口和出口分别调用flagtime(),获取项目执行时间。
    2、获取请求url执行时间,在请求前后记录

    // 请求前
    flagtime(1);
    // 请求结束
    debugSet('{Curl(' . flagtime(1) . ')}' . $url);
    // 输出
    debugGet();
    

    梦回河西走廊

    19年春节去河洛和开封走了走,穿梭在这片曾经为多朝都城的地方,不仅感概历史不再是教科书上简洁的文字,不再是史书上丰富的故事,历史是脚下实实在在的土地,历史是曾经缓慢流过这里的一段段时光。

    在洛阳博物馆再一次看到了丝绸之路的线路图,这次的不同是身临其境这条路上,站在洛阳往西望,长安、玉门关、阳关、罗马依次在眼前浮现。心里安安思忖,有生之年当去走一走。也是在这个时候听说了河西走廊,身未至,梦先行。心向往之的路上,遇到了两部纪录片《河西走廊》、《神秘的西夏》。两部片子看完,久久难忘。

    河西走廊

    片子共10集,10个主题:使者、通道、驿站、根脉、造像、丝路、敦煌、会盟、苍生、宝藏。非常详尽的讲诉了河西走廊的来龙去脉、及前世今生。而最让人敢兴趣的莫过于河西走廊的打通和走廊存在的意义。


    0、河西走廊的打通
    开篇讲诉公元前138年,19岁的汉武帝(刘彻)放弃祖辈和亲匈奴的防御政策,派遣27岁的朝廷侍从官张骞去西域寻找军事同盟月氏部落,联手对抗匈奴的情景。之所以说是情景,确实是像演古装剧一般(后来才知道,这就电影化的情景再现手法),真实又有趣,让人忍不住往下看。
    当张骞和堂邑父踏上这条黄河以西、形如走廊的狭长平原没多久,就被匈奴抓住了,由于张不合作被匈奴长期软禁。9年后,逃离匈奴的控制后,穿过大漠继续西行最终找到大月氏部落,而定居下来的大月氏不愿意攻打匈奴,张骞用一年的时间熟悉了这个地方后,毅然决然返回长安。不巧路上又被匈奴俘虏,后又逃回长安,前后历时13年。而刘彻也正是凭借张骞带回来的情报,才有了19岁的霍去病驱逐匈奴,封狼居胥;才有了河西四郡【四郡的名字着实有意义: 武威(武功军威之意)、张腋(断匈奴之臂,张汉朝之臂腋)、酒泉(因城下有泉,泉水若酒)、敦煌(盛大辉煌之意)】。

    如果你不知道何为人生使命的话,你一定要来看看这个纪录片下再现的张骞。经历漫长而艰辛的岁月,依然不该初心,极具开拓和冒险精神的张骞,让人肃然起敬。可以说是张骞打通了河西走廊,打通了一段通往西方文明的道路,开启了一部波澜壮阔的史诗。

    走廊的意义
    而后河西走廊即是中原帝国通往西域的驿站,文明从东往西走的通道;又是西方文明进入东方文明的通道,文明从西往东传,魏晋时期,佛教沿着河西走廊,在高僧鸠摩罗什的传播下,开始中国化,影响中原;同时还是文化的避难所,魏晋时期中原打乱之际,河西走廊以其相对安定的政治环境庇佑了迁徙至此的儒家学者,儒家文化自此在河西走廊扎下根脉,并最终东渐反哺中原,成为隋唐文化和制度的重要来源。

    分分合合,合合分分,不管是谁的天下谁的王,这条走廊一直是中国历史浓墨重彩的一笔。可以想象,公元609年,隋炀帝西征侵扰河西走廊的吐谷浑并在张掖举行的外交与商贸盟会是多么的超前。之后从长安来到敦煌的工匠将长安艺术带到了这里,他们在当地世家大族的支持下继续开凿敦煌石窟并绘制敦煌壁画,敦煌石窟也成了大唐盛世的缩影。

    我所有认识的河西走廊,都是从这一部片子开始的,感谢片子的全部创作人。

    神秘的西夏

    参考:
    维基百科:河西走廊纪录片
    维基百科:河西走廊
    维基百科:丝绸之路