作者: ethan

  • wordpress折叠效果

    在wordpress使用过程中,经常会用到折叠的效果,比如书籍目录之类,如:

    实现方法如下

    步骤1: 利用自定义html小工具,将工具加入页首,页脚等公共模块,模块配置代码如下:

    <script type="text/javascript">
        jQuery(document).ready(
            function(jQuery){
                jQuery('.collapseButton').click(
                    function(){
                        jQuery('.x325aFoldingContent').slideToggle('slow');
                    }
                );
            }
        );
    </script>
    <!--此处代码仅为记录,因每次更新主题,都会将下一步修改的functions.php覆盖
    function xcollapse($atts, $content = null){
    extract(shortcode_atts(array("title"=>""),$atts));
        return '<a href="javascript:void(0)" class="collapseButton xButton">展开/收缩</a> 
            <div class="x325aFoldingContent" style="display: none;">'.$content.'</div>';
    }
    add_shortcode('collapse', 'xcollapse');
    -->

    步骤2: 在打开主题编辑器,在functions.php中增加以下代码:

    function xcollapse($atts, $content = null){
    extract(shortcode_atts(array("title"=>""),$atts));
        return '<a href="javascript:void(0)" class="collapseButton xButton">展开/收缩</a> 
            <div class="x325aFoldingContent" style="display: none;">'.$content.'</div>';
    }
    add_shortcode('collapse', 'xcollapse');

    ps: 小工具中的代码也可放在主题编辑器中的header.php中head标签内,但要注意,同functions.php一样,更新主题后,会被覆盖,需要重新编辑,但如若利用小工具的方法,主题更新则不会对其造成影响

  • WordPress Discus插件去除用户名和邮箱

    Discus插件是wordpress中最为常用的评论插件之一,但是往往也并不一定满足我们的需求。

    此次,我就介绍下,如何最简化Discus插件的发表评论功能,最终效果如下:

    步骤一:通用评论设置

    在通用设置中,接触发表评论的相关限制

    步骤二:Discus表单设置

    设置discus表单,去除多余表单项

    Discus插件,默认用户名和邮箱表单项是无法去除的,但是我们可以通过样式隐藏

    添加自定义样式: .wpd-form-col-full{display:none}

  • mysql order by主键速度慢问题

    背景

    今天遇到一个奇怪的问题,就是明明是order by id(主键)但却速度奇慢。

    排查

    针对这个sql, 做了一下explain, 发现其并没有走主键索引,而是走了其他的索引

    总结

    1. mysql(innodb) 选择使用的索引时,有各种的优化选择策略,并不一定会符合我们的预期。而order by主键,这个可能是我们最常用到的一个不符合预期的情境,所以,以后在程序开发中,使用order by时,最好explain一下,看是否使用到了自己预期的索引。
    2. 如果mysql自主选择的索引不符合预期的话,一方面可以通过调整where条件,查询字段等方式进行尝试,使其使用预期的索引,另一方面,则可以使用FORCE INDEX的方式,强制mysql使用我们预期的索引
  • mysql模糊查询like优化

    在业务场景中,经常会用到like模糊查询。但是大家都知道,like是用不到索引的,所以当数据量非常大时,速度会非常慢。

    此时,用以下mysql的内建函数,可以在一定程度上优化模糊查询的速度,替代like

    instr(title,'手册')>0xa0xa0相当于xa0xa0title like '%手册%' (主要是这一种情况效率提高明显)
    instr(title,'手册')=1xa0xa0相当于xa0xa0title like '手册%'
    instr(title,'手册')=0xa0xa0相当于xa0xa0title not like '%手册%'

    通过以上函数,可以一定程度上加快模糊查询的速度

  • 《麦琪的礼物》面包与爱情

    《麦琪的礼物》,一个耳熟能详的故事,从其他文章,现代网络等等地方,经常会听到这个故事,也知道这个故事大概的情节,但今天是第一次,自己将小说的原文读了一下,心中也是有了些自己的想法。

    现代社会,经常将面包和爱情两个词联系起来,而麦琪的礼物则经常作为“没有面包的爱情”的典范。

    首先,个人还是比较倾向于没有面包的爱情是不幸福的这一种观点的。

    小说中,麦琪为了省钱,买东西总是讨价还价“面红耳赤”,“落下了一个‘吝啬鬼’的坏名声”,因为没钱给丈夫买礼物,“倒在破旧的小沙发上嚎啕大哭”,决定卖掉头发时,“一滴眼泪溅在了破旧的红地毯上”,且多次叹道“一美元八十七美分又能做什么呢?”,这些细节无不表现着麦琪内心的辛酸,在每天都在为钱而忧愁的日子,实在是说不上是幸福的,而这仅仅只是麦琪的感受,作为其丈夫,无论是作为男人的责任心,对妻子的疼爱,家里的主要经济支柱,其内心的压力与辛酸又将是怎样呢?

    其次,我并不赞同,没有面包,就没有爱情。

    无可辩驳的是,小说中,麦琪和其丈夫,买了各自最宝贵的东西来给对方买礼物,以及互赠礼物时的种种表现,无不表现着他们那纯粹而感人的爱情,现代社会中,这样的例子更是笔笔皆是。

    爱情,是一种心灵上的沟通与与交融,这与任何的外在条件是没有什么直接关系的,爱就是爱了,没有为什么。

    最后,“没有面包”这一概念的理解。

    很多女人总是会把“没有面包的爱情是不幸福的”,“没有面包就没有爱情”等这些话挂在嘴边,但是她们理解的“没有面包”是什么概念呢?

    在她们眼中,“没有面包” 等于 “没有豪宅”,“没有名车”,“没有钻石,首饰”等等,这是没有面包吗?这是没有“仙桃”!

    我所赞同的“没有面包”,是指那种在温饱线上挣扎的生活,是指日常生活的基本需求都无法满足的情况,就像小说中麦琪所说的“一美元八十七美分又能做什么呢?”,这是最基本的日常需求都无法满足了,所以才会导致小说中这种辛酸的情况,而如果麦琪的手中有三十美元,四十美元呢?这时,麦琪就不需要卖掉她的头发,能够在合理范围内给自己的丈夫挑选一件礼物,一切都会很美好。

    总结,没有面包,也可能会有爱情,但却并不一定幸福,但这里所谓的没有面包,在现代社会中,其实大部分人是没有资格说的。

  • 批量修改文件名(python)

    背景

    工作中总有各种场景,需要批量修改文件的名字,但是一个一个的该实在是太麻烦而且太费时间了,所以干脆写了个批量修改文件名的脚本。

    代码

    import sys
    import os
    import re
    
    def rename(find, replace, local_file_path):
        file_list = os.listdir(local_file_path)
        # 得到进程当前工作目录
        current_path = os.getcwd()
        # 将当前工作目录修改为待修改文件夹的位置
        os.chdir(local_file_path)
        # 名称变量
        num = 1
        # 遍历文件夹中所有文件
        for file_name in file_list:
            # 进行匹配
            new_name = re.sub(find, replace, file_name)
            # 文件重新命名
            os.rename(file_name, new_name)
            # 改变编号,继续下一项
            num = num + 1
        print("completed!")
        # 改回程序运行前的工作目录
        os.chdir(current_path)
        # 刷新
        sys.stdin.flush()
    
    to_find = ''
    to_replace = ''
    local_file_path = ''
    
    if sys.argv[1]:
        to_find = sys.argv[1]
    else:
        print('params error find!')
        quit()
    
    length = len(sys.argv)
    
    if length > 2 and sys.argv[2]:
        to_replace = sys.argv[2]
    else:
        to_replace = ''
    
    
    if length > 3 and sys.argv[3]:
        local_file_path = sys.argv[3]
    else:
        local_file_path = './'
    
    
    rename(find=to_find, replace=to_replace, local_file_path=local_file_path)

    使用

    说明: python3 rename.py [要替换的文件名部分] [替换后的名字] [需替换文件所在的文件夹地址]

    ps: 也可直接cd到文件所在目录,然后运行脚本,此时参数3则忽略,参数2默认值为空

    举例

  • mysql字段长度限制

    背景

    今天线上出现一个问题,文本太长,而数据库中的字段长度不够,导致内容被截断。

    于是,很容易想到解决办法,修改字段长度呗,但出乎预料的是,遇到了以下报错:

    Execute failed | Execute: Error 1118: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs. 

    原因:

    mysql属于关系型,行式数据库, 规定单行长度不能超过65535,如需存储超过65535长度的数据,则需使用TEXT或BLOB,这里所说的字段长度指的是,一条记录所有字段的长度之和。

    解决:

    正常的解决方案是,修改字段类型为text或blob, 但因为具体的业务场景,此次仅是将该字段在允许范围内稍微加大了些

  • 网页引进百度搜索框,并限制搜索范围

    在网页中引入百度搜索框,且限定搜索返回,如输入’mysql’实际搜索’mysql 浮生无事’

    //网页引进百度搜索框,并限制搜索范围
    <form action="http://www.baidu.com/baidu" target="_blank">
    <table bgcolor="#FFFFFF"><tr>
      <td>
      <input type="text" name="first" id="ee" size="30"  />
      <script>
        function jd(){
    		document.getElementById('rr').value = document.getElementById('ee').value+" 浮生无事";
    	}
      </script>
      <input type="hidden" id="rr" name=word value="" size=30 >
    <input type="submit" value="百度搜索" onclick="jd();">
    </td></tr></table>
    </form>
  • mac本地docker部署ElasticSearch7.x集群

    docker容器获取

    • docker pull elasticsearch:7.4.2
    • docker pull mobz/elasticsearch-head:5

    Elasticsearch

    创建宿主机文件

       mkdir -p /data/docker/elasticsearch/config/node0
       mkdir -p /data/docker/elasticsearch/config/node1
       mkdir -p /data/docker/elasticsearch/config/node2
       mkdir -p /data/docker/elasticsearch/config/node3
       mkdir -p /data/docker/elasticsearch/data/node0
       mkdir -p /data/docker/elasticsearch/data/node1
       mkdir -p /data/docker/elasticsearch/data/node2
       mkdir -p /data/docker/elasticsearch/data/node3
       mkdir -p /data/docker/elasticsearch/logs/node0
       mkdir -p /data/docker/elasticsearch/logs/node1
       mkdir -p /data/docker/elasticsearch/logs/node2
       mkdir -p /data/docker/elasticsearch/logs/node3
    
       # 重新设置系统级别的默认打开文件最大个数  防止JVM报错
       echo vm.max_map_count=655360 >> /etc/sysctl.conf
    
       # 在root账户执行这一句 作用是重新载入sysctl系统参数
       sysctl -p

    环境配置

    Mac

    screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty   
    按回车键   
    sysctl -w vm.max_map_count=262144     
     
    修改单个进程打开的句柄个数   
    sudo launchctl limit maxfiles 99999 99999   
    sudo ulimit -n 99999
    
    ulimit -H -l

    配置前置

    裂脑事件

      Elasticsearch牺牲了一致性,以确保可用性和分区容错。其背后的原因是短期的不良行为比短期的不可用性问题少。换句话说,当群集中的Elasticsearch节点无法复制对数据的更改时,它们将继续为应用程序提供服务。当节点能够复制其数据时,它们将尝试聚合副本并实现最终的一致性。
      Elasticsearch通过选举主节点来解决之前的问题,主节点负责数据库操作,例如创建新索引,在群集节点周围移动分片等等。主节点与其他节点主动协调其操作,确保数据可以由非主节点汇聚。
      在某些情况下,先前的机制可能会失败,从而导致裂脑事件。当Elasticsearch集群分为两个区块时,若每个区块都有一个节点都认为它们是主节点,因为主节点将在数据上独立工作,数据一致性就会丢失。因此,节点将对相同的查询做出不同的响应。这将会是灾难性的事件,因为来自两个主节点的数据无法自动重新加入,并且需要相当多的手动工作来纠正这种情况。

    创建配置文件

    # 集群名称
      cluster.name: "elasticsearch-cluster"
      # 节点名称
      node.name: node0
      # 是否为主节点
      node.master: true
      # 该节点是否存储数据
      node.data: true
      # 回环地址
      network.host: 0.0.0.0
      # 对外开放的ip
      network.publish_host: 172.18.0.6
      # 对外开放的http端口
      http.port: 9200
      # 集群的ip集合,可指定端口,默认为9300
      #discovery.zen.ping.unicast.hosts: ["172.18.0.6", "172.18.0.7", "172.18.0.8"]
      cluster.initial_master_nodes: ["node0"]
      discovery.seed_hosts: ["172.18.0.6", "172.18.0.7", "172.18.0.8", "172.18.0.9"]
      # 内部节点通信端口
      transport.tcp.port: 9300
      # 是否允许跨域请求
      http.cors.enabled: true
      # 定义允许哪些源请求
      http.cors.allow-origin: "*"
      # 有成为主节点资格的最小节点数(为避免脑裂,设置为超总数一半)
      #discovery.zen.minimum_master_nodes: 2
      # 是否开启安全验证
      xpack.security.enabled: false
      # 锁住内存,确保ES不使用swap
      #bootstrap.memory_lock: true
    
      # 集群名称
      cluster.name: "elasticsearch-cluster"
      # 节点名称
      node.name: node1
      # 是否为主节点
      node.master: false
      # 该节点是否存储数据
      node.data: true
      # 回环地址
      network.host: 0.0.0.0
      # 对外开放的ip
      network.publish_host: 172.18.0.7
      # 对外开放的http端口
      http.port: 9200
      # 集群的ip集合,可指定端口,默认为9300
      #discovery.zen.ping.unicast.hosts: ["172.18.0.6", "172.18.0.7", "172.18.0.8"]
      cluster.initial_master_nodes: ["node0"]
      discovery.seed_hosts: ["172.18.0.6", "172.18.0.7", "172.18.0.8", "172.18.0.9"]
      # 内部节点通信端口
      transport.tcp.port: 9300
      # 是否允许跨域请求
      http.cors.enabled: true
      # 定义允许哪些源请求
      http.cors.allow-origin: "*"
      # 有成为主节点资格的最小节点数(为避免脑裂,设置为超总数一半)
      #discovery.zen.minimum_master_nodes: 2
      # 是否开启安全验证
      xpack.security.enabled: false
      # 锁住内存,确保ES不使用swap
      #bootstrap.memory_lock: true
      
      # node2, node3同node1, 修改ip以及端口

    启动容器

    docker run --net mynetwork --ip 172.18.0.6 -d --restart always -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -v /data/docker/elasticsearch/config/node/node0/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/docker/elasticsearch/data/node0:/usr/share/elasticsearch/data -v /data/docker/elasticsearch/logs/node0:/usr/share/elasticsearch/logs --name es-node0 elasticsearch:7.4.2 
    docker run --net mynetwork --ip 172.18.0.7 -d --restart always -p 9201:9200 -p 9301:9300 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -v /data/docker/elasticsearch/config/node/node1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/docker/elasticsearch/data/node1:/usr/share/elasticsearch/data -v /data/docker/elasticsearch/logs/node1:/usr/share/elasticsearch/logs --name es-node1 elasticsearch:7.4.2 
    docker run --net mynetwork --ip 172.18.0.8 -d --restart always -p 9203:9200 -p 9303:9300 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -v /data/docker/elasticsearch/config/node/node2/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/docker/elasticsearch/data/node2:/usr/share/elasticsearch/data -v /data/docker/elasticsearch/logs/node2:/usr/share/elasticsearch/logs --name es-node2 elasticsearch:7.4.2
    docker run --net mynetwork --ip 172.18.0.9 -d --restart always -p 9204:9200 -p 9304:9300 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -v /data/docker/elasticsearch/config/node/node3/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/docker/elasticsearch/data/node3:/usr/share/elasticsearch/data -v /data/docker/elasticsearch/logs/node3:/usr/share/elasticsearch/logs --name es-node3 elasticsearch:7.4.2

    Elasticsearch-head

    启动容器

    docker run --net mynetwork --ip 172.18.0.10 -d --restart always -p 9100:9100 -d --name elasticsearch-head mobz/elasticsearch-head:5 
    docker exec -it elasticsearch-head bash          
    apt-get update          
    apt-get install vim          
    vim _site/vendor.js          
    application/x-www-form-urlencoded 改为 application/json;charset=UTF-8          exit
    docker restart elasticsearch-head

    访问

    http://127.0.0.1:9100/
  • 循环字符串替换导致乱码

    今天,线上发现了一个问题,文本上莫名其妙的出现了很多乱码。

    首先,排查了下数据库中存储的数据,确定了并非是数据的问题,那应该就是数据展示时格式化的问题了。

    最终定位到的问题是,代码中有一段将文本中一些特殊词高亮的代码

    foreach($words as $word) {
        $title = str_ireplace($word, "<span style='color: #f22424;background: #FBff16;'>" . $word . "</span>", $title);
    }

    好了,问题明确了,$words中有一个 bf 元素,而 bf 恰巧命中了 ‘background: #FBff16′, 从而导致样式代码被截断,代码乱序的问题,进而结果就是页面上出现了部分乱序的代码

    解决,先用一个字符串替换样式代码最终再替换回来

    $tmp_replace1 = 'r_e_p_l_a_c_e_7781476189'
    $tmp_replace2 = 'r_e_p_l_a_c_e_4326326736'
    foreach($words as $word) {
        $title = str_ireplace($word, $tmp_replace1 . $word . $tmp_replace2, $title);
    }
    $title = str_ireplace($tmp_replace1, "<span style='color: #f22424;background: #FBff16;'>" , $title);
    $title = str_ireplace($tmp_replace2, "</span>" , $title);

    收获经验,循环字符串替换时需要注意避免嵌套替换的情况出现