答题小程序-题库中随机生成试题的解决方案(一)

  答题小程序从试题库中随机生成试题的方式,我想了一下,看怎么实现。 方法一、查询第一条,随机下一题的题目的ID   先取第一道题,然后随机一个步长,根据这个步长的随机值,去搜数据库的时候,用这个增长的步长做间隔。比如 MySQL 或者 PostgreSQL 中,就用这个递增的步长拼接到 offset 查询语句上。 比如第一次查询第一道题,查询条件相同,但是 offset = 0。那就出来数据库中第一条数据。 第二次查询时,随机一个 (0-10) 以内的整数,比如随机到 2, 那本次查询就采用 offset 2 去搜数据库,这样就查到了数据库中的第三条数据返回给前端。 第三次再查询,这次又随机一个 (0-10)以内的整数,比如随机到1,那本次查询就在前面基础上再 offset 1  ,就是 offset 3 ,查到第四条记录作为下一条题目返回给前端。

Erlang快速入门(三)- Erlang依赖包管理

Erlang快速入门系列,来到第三天,刚开始接触的东西,已经在 Erlang快速入门(一) — 基础语法和 Erlang快速入门(二) — 常见错误 已经见过一些,更多有用的资源 awsome-erlang 集合在 github 上了。 比如使用 Go 时,很容易是使用 go mod 进行依赖包的管理。使用 Rust 时,cargo 又是一个非常好用的包管理工具。到了 Erlang 这里,朋友推荐看一下 rebar3 。rebar3 可以集成 hex 上的比较齐全的外部依赖包。 Mac 安装就很简单,直接 brew install rebar3 但是 hex 的 CDN  国内的伙伴最好设置一下 HEX_CDN=https://hexpm.upyun.com 可以加到  ~/.zshrc 里。   export HEX_CDN=https://hexpm.upyun.com

Erlang快速入门(二)

Erlang快速入门开始编码之后,慢慢就会接触到编译错误的情况了。 编译时关键字冲突之类,变量名和默认函数重名等   比如 “init terminating in do_boot” 什么的,像这种编译错误,可以先查看一下是不是有关变量和 Erlang 关键字冲突了。 after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse receive rem try when xor 有一次我使用 abs 求绝对值函数的时候,就错误的把一个变量设置为 Abs 结果就报错了。 Erlang 输出类型错误   而且可能你类型写不对,他也报错。比如 % 这样写   Fnum = float(4), fwrite(“Fnum is …

Erlang快速入门(二) Read More »

Erlang快速入门(一)

Erlang快速入门,首要是动手敲起来。 一言不合反手上来就是一个 Hello World 。 % hello world program -module(hello). -export([sayhi/0]). sayhi() -> io:fwrite(“hi,hello world!\n”).   erlc 命令行编译 hello.erl 文件 得到 hello.beam ➜  erlc hello.erl 命令行里运行起来, ➜ erl -noshell -s hello sayhi -s init stop hi,hello world! 简要的说明: % 是注释 – 是模块或者导入导出的连接符 分界符是点  . module 是定义模块名,用于区分命名空间。(需要用和去掉文件名一致的名称,比如hello.erl 就用module(hello),否则就报错) 反斜杠 /0 表示 sayHi 没有一个参数 erlang shell Erlang快速入门语法 …

Erlang快速入门(一) Read More »

PostgreSQL和MySQL的语法区别

  PostgreSQL和MySQL的语法区别能有多大呢?带着这个疑问,我在本地同时安装 PostgreSQL 和 MySQL ,进行了基础的语法操作。结果 PostgreSQL 的操作出乎我的想象。 安装和启动命令: brew install postgresql brew services start postgresql psql postgres 启动之后 ➜ miyu psql postgres psql (14.4) Type “help” for help. postgres=# ? postgres-# \help 比 MySQL 终端界面 MariaDB [idiom]> 要简陋一点。 想当然的用 MySQL 的显示全部数据库命令 show databases 列出所有数据库 ,但没成功。原来是需要用 \l  postgres-# \l List of databases Name | Owner …

PostgreSQL和MySQL的语法区别 Read More »

airport和aircrack-ng破解Wifi密码的方式-MacOS系统下

​上周末去一个图书馆找灵感。​这图书馆有点怪,他不让人用 WiFi !杂家很生气,后果很严重。汝可往,俺亦可往,遂​破之于一刻钟内。 airport -s 列出所有有信号的 WiFi 名称。 确认目标 WiFi 信道 是 2,然后开始抓包。 airport en0 sniff 2 使用 ll -ahlt 开另一个终端查看​抓包时间。看最新的那个包,本次是 airportSniffbdTP8v 和 airportSniffbdTP8v.cap 。这两个文件时间间隔超过 5 分钟之后可以开始 Ctrl + C 停止​抓包。 抓到的数据在 保存在 /tmp目录下,以.cap 结尾的文件就是。抓完包,找了一个稍微常用的密码字典。 紧接着开始查看有握手记录的目标 WiFi ​,开始遍历破解。 aircrack-ng -w ~/tmp/pwd.txt airportSniffbdTP8v.cap   ​本次目标 WiFi 的索引是6,有一个握手记录。​输入6 ,来了!   如果字典不够强大,匹配不到​。匹配完成时报 【KEY NOT FOUND】​。   不要灰心,继续找一个更齐全的​字典。或者自己搞一个生成字典的脚本,不断生成新的密码​,继续破解。 还可以自己写个脚本把已经匹配过不符的密码,存入缓存或者数据库,然后每生成一个新的随机的密码​就查一下历史记录,获得新的密码​字典,再去匹配。 最后就可以在图书馆安静地用上 ​WiFi 了。​这就是一个难忘和畅快的周末。​这就是 aircrack-ng 的便利​。​(温馨提示:仅用于学习用途 >-<【桃李春风一杯酒,江湖夜雨十年灯】 )

curl格式化输出

当我们想使用 curl curl格式化输出一个 API 接口的 json 数据时,比如 curl http://localhost:8888/course -jq {“code”:200,”message”:”ok”,”data”:{“count”:4,”items”:[{“id”:”4342434343332″,”shop_id”:””,”image”:””,”title”:”Flutter实战训练营”,”content”:””,”duration”:0,”level”:0,”updated_at”:”2022-06-02T20:14:54+08:00″,”created_at”:”2022-06-02T20:16:05+08:00″},{“id”:”434243434333″,”shop_id”:””,”image”:””,”title”:”Erlang实战训练营”,”content”:””,”duration”:0,”level”:0,”updated_at”:”2022-06-02T20:14:37+08:00″,”created_at”:”2022-06-02T20:16:05+08:00″},{“id”:”4342434343″,”shop_id”:””,”image”:””,”title”:”Erlang实战”,”content”:””,”duration”:0,”level”:0,”updated_at”:”2022-06-02T20:14:09+08:00″,”created_at”:”2022-06-02T20:16:05+08:00″},{“id”:”4342″,”shop_id”:””,”image”:””,”title”:”Rust实战”,”content”:””,”duration”:0,”level”:0,”updated_at”:”2022-06-02T20:14:09+08:00″,”created_at”:”2022-06-02T20:16:05+08:00″}]}} 可以加点参数 curl http://localhost:8888/course |json_pp   这样就可以输出 curl 命令美化后的格式化 Json 数据了。   ➜ ~ curl http://localhost:8888/course |json_pp % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 813 100 813 0 0 101k 0 –:–:– –:–:– …

curl格式化输出 Read More »

mac 下 Flutter 本地无法访问远程图片地址问题

开发 Flutter 的过程中,MacOS 系统下的 Destop 调试发现 Image.network(url) 无法起作用。经过一番调试发现是 mac debug 模式下,是没联网的。本地 Xcode 只是设置了一个 Sandbox 的沙盒环境,如果要联网访问远程服务器的图片文件,是需要自己加配置开启的。 “` Image.network(value[‘imageUrl’]), “` 需要加配置 “` <key>com.apple.security.network.client</key> <true/> “` 到 macos/Runner/DebugProfile.entitlements 和  macos/Runner/Release.entitlements  文件中即可。    

Redis Sorted Sets 实现跨境电商业务订单抢占库存

历史逻辑是:收到订单,过风控Check…,查库存,占库存,有货就下发到物流渠道;否则就处于缺货的等待状态。 这么简单的流程我就不画图示意了。 这种模式,有一个弊端:假如有热卖的产品一直“爆单”,而库存不足的话,会导致先进来的订单一直卡在缺货。 原本一来货,它就应该满足库存标准,按照订单应发数量占住库存,然后下发的。这一直被后来的订单抢走了库存! 所以问题的解决结果可以明确为:先来的订单需要抢占SKU库存,后来的订单sku缺货就排队等待。 我们小组拉个会议室,对着白板,边画边展开一番解决方案讨论。一开始Leader 提议使用小顶堆。新订单进来,重新进行堆排序。让最早的订单排在小顶堆堆顶。 但是我对用Go实现一个切合当前业务的小顶堆,有点耗时间。然后我一想,这个缺货的判断你要一直持久判断,用小顶堆,持久性你怎么保存?而产品又只给了2天的开发时间,测试一天,然后就要发版。我直接说,还不如用 Redis Sorted Sets 来实现。 大家你一句,我一句。一致同意了这个大方向的技术方案。 具体到详细的方案执行上,把订单的创建时间作为有序集合成员的分值score,将订单号加上一个专属的前缀拼接成具有清晰表意的 member 值。再给一个特殊的字符串作为集合的 Key 值。这样数据结构的设计明确下来。 具体调用的业务逻辑,新单生成,进行库存查询时,先根据订单创建时间作为 max score 值,判断一下这个有序集合是不是有 member。 如果有,那就将当前订单也加入到有序集合里来。 如果没有,那么说明前面没有更早的缺货订单,就直接查库存。 查库存结果,有两种结果。若是发现有缺货,那么也还加入缺货有序集合,如果有货直接占用库存,紧接着发到物流渠道。 另外一种场景就是,采购或者订单已占用库存的订单作废,释放库存出来。这个时候相当于库存有增加,那么可以通过另一个队列触发这个来货的 sku 队列,走一样的逻辑去遍历缺货的订单 Zset,按照不缺货的先创建的订单占用库存。 当然实际业务,要比这个要复杂的多。这里只是隐匿了诸多具体业务,抽取核心技术实现点进行说明。 这样,无论怎么来订单,库存怎么变化,最后,占用库存的流转开关都交给了 Redis Sorted Sets 把控。保证了先创建的订单先占库存。 跨境电商商户也就不用担心一些爆款产品热卖,先下的缺货订单因临时库存不足,迟迟未发货遭客户投诉而被 Paypal 等支付平台冻结资金了。

mysql task_log.ibd 文件占用大量磁盘空间引发的血案

早起访问 gitvim.com , logo出来了,但是首页内容一直是空白的,F12 打开看加载完了,但是我这网站怎么挂啦?没有一丁点页面文字? 快速排查日志, 先查 nginx 日志 tail -f /var/log/nginx/error.log 发现 Nginx 错误日志是空的,这说明业务服务器没有问题。但是在这里敲命令的过程中,发现 tab 键失效了,一直弹出来 [root@api nginx]# less ac-bash: cannot create temp file for here-document: No space left on device 一开始我没太在意,以为是自己的键盘快捷键重合导致的。然后继续排查 Nginx 访问日志。 [root@api nginx]# less ac-bash: cannot create temp file for here-document: No space left on device tail -f /var/log/nginx/access.log 一看,也是空的。也没啥毛病。我就纳闷了,难道是 PHP …

mysql task_log.ibd 文件占用大量磁盘空间引发的血案 Read More »