#225 Redis 获取所有 key

2018-01-10

测试环境

keys *

删除指定模式的 key:

redis-cli keys 'a.b.*' > /tmp/deleted_keys
cat /tmp/deleted_keys
cat /tmp/deleted_keys | xargs redis-cli del

线上环境

线上 keys 可能会导致严重的性能问题。

2.8 开始,Redis 增加了 4 个 SCAN 命令:

  • SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] 遍历当前 db 中的所有键, 返回 keys ...
  • SSCAN key cursor [MATCH pattern] [COUNT count] 遍历 set 类型,返回 value ...
  • HSCAN key cursor [MATCH pattern] [COUNT count] 遍历 hash 类型,返回 (key, value)
  • ZSCAN key cursor [MATCH pattern] [COUNT count] 遍历 sorted set 类型,返回 (score, member)
scan 0 count 100

每次会返回一个新的游标,用于下一次 scan 请求。

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter():
    print(key)

#223 Vim 备忘录

2018-01-03

我并不是个 Vim 高手,但是我所掌握的知识对于轻量使用来说,也够用了。
这就是我能想到的全部 Vim 知识。

如果你是一个新手,看看这篇文章,应该可以快速入门 Vim,能解决所有简单编辑任务所会面临的问题。

基础知识

避免由于意外操作而不知所措。

模式

  • 普通模式(Normal):直接打开文件(vim filepath)就进入了这个模式,可以移动光标,执行一些指令
  • 插入模式(Insert):像普通编辑器一样编辑文本
  • 可视模式(Visual):先在普通模式下移动光标到目标区域,然后切换到可视模式,这时移动光标就可以选中一块区域,对着块区域的内容执行一些命令
  • 命令模式:在 Vim 底部输入命令,按回车执行
  • 选择模式(Select):正常我们能够理解的选中,然后删除或者对着一块进行替换
  • Ex 模式:。。。

模式切换:

  1. 在任何模式下按 Esc 就可以回到普通模式
  2. 普通模式下,按 i 进入插入模式;
  3. 普通模式下,按 v 进入可视模式(字符);
  4. 普通模式下,按 V 进入可视模式;
  5. 普通模式下,按 Ctrl + v 进入可视模式;
    1. Windows 系统下 Ctrl + v 被占用作为粘贴快捷键,可以使用 Ctrl + q 代替;
  6. 普通模式下,按 : 进入命令模式;
  7. 可视模式下,按 Ctrl + g 进入选择模式;
  8. 选择模式下,可以按 Ctrl + o 回退到可视模式;

快捷键

上下左右,翻页(PageUp,PageDown),删除(Backspace,Del)本身就可以用,就不用记快捷键了。

Key Function
u 撤销
dd 删除当前行
3dd 删除当前行 + 后面两行(共 3 行)
>> 缩进
<< 取消缩进
== 自动对齐

使用命令 5d 删除第五行
使用命令 5,10d 删除第 5 到第 10 行

跳转

Key Function
gg 跳到第一行
20gg 跳到第 20 行
G 跳到最后一行
10j 往前跳 10 行
10k 往后跳 10 行

hjkl 本身用来表示左上下右,所以...

复制粘贴

Key Function
yy 复制当前行
3yy 复制当前行 + 后面两行(共 3 行)
yw 复制当前单词和后面的空白字符
p Paste 粘贴在当前行、字符后面
P Paste 粘贴在当前行、字符前面

搜索

Key Function
? 向后搜索(正则)
/ 向前搜索(正则)
# 向后搜索当前单词,等同于输入 #\<xxx\>
* 向前搜索当前单词,等同于输入 /\<xxx\>
  1. n/N 跳到上一处或下一处
  2. \cp[a-z]*n 忽略大小写,搜索 p 开头,n 结尾的单词

命令

一般都有取消配置的 set noXXX 命令。

Key Function
set nu 显示行号
set paste 粘贴模式(避免开启自动缩进时,会弄乱粘贴内容)
set ignorecase / set ic 搜索忽略大小写
set hlsearch 高亮搜索结果(似乎是默认)
set nohlsearch 取消高亮搜索结果
noh 关闭高亮
set listchars=tab:>~,trail:. 显示 TAB 键和行末空格
set cursorline 当前行加上下划线

替换

Key Function
s/Gitee/Gitea/g 将当前行所有 Gitee 替换成 Gitea
%s/Gitee/Gitea/g 将所有行所有 Gitee 替换成 Gitea
%s/Gitee/Gitea/gi ...忽略大小写
%s/Gitee/Gitea/gin ...不真正执行,只反馈印象范围
5,10s/Gitee/Gitea/g 将第 5 到 10 行所有 Gitee 替换成 Gitea
.,+5s/Gitee/Gitea/g 将当前行到后两行所有 Gitee 替换成 Gitea

保存

Key Function
q 退出(可能会提示你:已修改但尚未保存)
w 保存
wq 保存并退出
x 保存并退出
q! 不保存,强行退出
:w !sudo tee % 没有写入权限的时候提权保存

清空数据:gg + 1000dd(跳到第一行,然后删除 1000 行)

> filepath
# 或
echo > filepath

参考资料与拓展阅读

#222 apt 包管理系统

2017-12-25

搜索

apt search xxx

检索

apt list
apt list --installed
apt list --upgradable

升级

apt update
apt upgrade

apt-file

apt-file list youtube-dl
apt-file search bin/update-locale

其他

apt search
apt show
apt install
apt reinstall
apt remove
apt autoremove
apt full-upgrade
apt edit-sources
apt satisfy

apt-mark
apt-key
apt-config
apt-cache
apt-add-repository

#221 Git 与换行符

2017-12-07

CR:Carriage Return 回车
LF:Line Feed 换行
EOL: End Of Line

平台 代码 数值 转义字符
Windows CRLF 13 10 \r\n
Linux/Unix LF 10 \n
Mac OS CR 13 \r
  • Mac OS X 开始,也使用 LF 做换行符。

Git 相关配置项

  • core.eol,换行符,可选:lf,crlf,native(根据系统判断,默认)
  • core.safecrlf,是否接受非 LF 换行,可选:true(拒绝),false(允许),warn(警告,默认)
  • core.autocrlf,是否自动转换换行符,可选:true(push lf,pull crlf),false(默认),input(push lf)

Linux 上,这三个配置项的默认值就非常恰当了,不用修改。
代码中的换行符应该由开发者自己判断、处理,工具提醒一下就行了。

如果项目组有共识,那么使用一个共同的配置也可以,比如:

git config --global core.eol lf
git config --global core.safecrlf true
git config --global core.autocrlf input
# 如果 CRLF 转换,会有警告提示:
# warning: in the working copy of 'README.md', CRLF will be replaced by LF the next time Git touches it

#218 学习 SVG:简单拖动

2017-11-25
<!doctype html>
<html lang="en" xmlns="https://www.w3.org/1999/xhtml">
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body style="width:1000px;margin:10px auto;">
    <svg
      id="example"
      width="1000"
      height="800"
      xmlns="https://www.w3.org/2000/svg"
    >
      <!-- 画个框框当边界 -->
      <rect
        x="0"
        y="0"
        width="100%"
        height="100%"
        fill="none"
        stroke="rgb(99,99,99)"
        stroke-width="2"
      />

      <circle
        id="circle1"
        class="dragable"
        cx="100"
        cy="100"
        r="30"
        fill="red"
        fill-opacity="0.7"
      />
      <circle
        id="circle2"
        class="dragable"
        cx="200"
        cy="100"
        r="30"
        fill="yellow"
        fill-opacity="0.7"
      />
      <circle
        id="circle3"
        class="dragable"
        cx="300"
        cy="100"
        r="30"
        fill="blue"
        fill-opacity="0.7"
      />
    </svg>
  </body>
  <script>
    var svg = document.getElementById("example"),
      target = null,
      startPoint = svg.createSVGPoint(),
      curPoint = svg.createSVGPoint();
    function refreshPoint(event) {
      curPoint.x = event.clientX;
      curPoint.y = event.clientY;
    }
    var dragables = document.getElementsByClassName("dragable");
    for (var i = 0; i < dragables.length; i++) {
      var dragable = dragables[i];
      dragable.addEventListener("mousedown", function (event) {
        target = event.target;
        refreshPoint(event);
        var matrix = target.getCTM();
        startPoint.x = curPoint.x - matrix.e;
        startPoint.y = curPoint.y - matrix.f;
      });
    }
    svg.addEventListener("mousemove", function (event) {
      if (!target) return;
      refreshPoint(event);
      var newX = curPoint.x - startPoint.x;
      var newY = curPoint.y - startPoint.y;
      target.setAttributeNS(
        null,
        "transform",
        "translate(" + newX + "," + newY + ")",
      );
    });
    svg.addEventListener("mouseup", function (event) {
      if (!target) return;
      target = null;
    });
  </script>
</html>

#217 学习 SVG:基础

2017-11-25
  1. svg 标签
  2. xmlns
  3. viewBox
  4. 形状
  5. 矩形 rect
  6. 圆形 circle
  7. 椭圆 ellipse
  8. 线条 line
  9. 多边形 polygon
  10. 折线 polyline
  11. 路径 path
  12. 通用属性
  13. stroke: 边框颜色
  14. stroke-width: 边框宽度
  15. fill: 填充颜色
  16. style
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body style="background-color:beige;width:800px;margin:0 auto;">
    <svg id="example" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 800 800">
      <!--

        -->
      <rect
        x="0"
        y="0"
        width="100%"
        height="100%"
        fill="none"
        stroke="rgb(99,99,99)"
        stroke-width="2"
      />
      <line
        x1="800"
        y1="0"
        x2="0"
        y2="800"
        style="stroke:rgb(99,99,99);stroke-width:2"
      />
      <line
        x1="0"
        y1="0"
        x2="800"
        y2="800"
        style="stroke:rgb(99,99,99);stroke-width:2"
      />

      <circle cx="400" cy="400" r="100" />
      <ellipse cx="400" cy="150" rx="120" ry="60" />

      <polygon points="250,300 130,520 50,350" />
      <polygon points="80,40 120,60 80,80 60,120 40,80 0,60 40,40 60,0 80,40" />

      <polyline
        points="150,750 170,800 190,750 210,800 230,750"
        fill="none"
        stroke="rgb(99,99,99)"
        stroke-width="2"
      />

      <rect x="550" y="325" width="200" height="150" />

      <text
        xml:space="preserve"
        text-anchor="start"
        font-family="Helvetica, Arial, sans-serif"
        font-size="24"
        x="400"
        y="600"
        fill-opacity="null"
        stroke-opacity="null"
        stroke-width="0"
        stroke="#000"
        fill="#000000"
      >
        @
      </text>

      <!--
            https://editor.method.ac/#move_front
            M = moveto
            L = lineto
            H = horizontal lineto
            V = vertical lineto
            C = curveto
            S = smooth curveto
            Q = quadratic Belzier curve
            T = smooth quadratic Belzier curveto
            A = elliptical Arc
            Z = closepath
        -->
      <path
        d="m395.5,698c0,0 1,0 4,0c4,0 8.29361,2.7265 12,7c3.276,3.77728 6.54135,7.7027 8,11c1.66803,3.77063 1.79395,8.08746 4,13c1.83203,4.07965 3,6 3,8c0,2 0,3 0,5c0,2 0.70709,3.29291 0,4c-0.70709,0.70709 -3,1 -4,1c-1,0 -3,0 -4,0c-1,0 -3,0 -4,0c-1,0 -2,0 -3,0c-1,0 -2.186,0.30743 -4,-1c-1.14728,-0.8269 -2,-2 -2,-3c0,-1 -0.22977,-3.02673 0,-4c0.51373,-2.17627 2.07339,-2.93164 3,-4c3.276,-3.77728 6,-7 9,-10c3,-3 4.79489,-5.22021 8,-8c3.77728,-3.276 6.21167,-5.71411 9,-8c2.18735,-1.79321 4.186,-2.69257 6,-4c2.29453,-1.65381 3,-2 4,-2l1,0l2,-1l1,0"
        fill-opacity="null"
        stroke-opacity="null"
        stroke-width="2"
        stroke="#000"
        fill="none"
      />
    </svg>
  </body>
</html>