0%

fpm
The goal of fpm is to make it easy and quick to build packages such as rpms, debs, OSX packages, etc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
yum install ruby-devel gcc make rpm-build rubygems
gem sources -a https://mirrors.aliyun.com/rubygems/
gem sources --list
gem install fpm

fpm -p outdir -s dir -t rpm -n website --iteration 1.el6 -d aaa -d psmisc -v 1.0.1 -C ~/hello/

## -p 输出目录
## -d 依赖
## -v 版本
## -n name
## -C 包目录,~/hello/ => /
## ~/hello/usr/bin/hello => /usr/bin/hello

玩家反馈,ios15无法登录游戏,android和ios其他版本没有问题

分析发现,ios15将原本是一条数据内容分成三份发送

1
2
3
4
5
6
7
8
## 本来这应该是一条数据的
## FIN - Payload len
websocket:request:53 [mfa:proc_lib:init_p/5] parse_frames:{ssl,hybi,<<130,131>>,{ssl,{sslsocket,{gen_tcp,#Port<0.17851>,tls_connection,<0.533.0>},<0.6628.124>}}}
## Masking-key
websocket:request:53 [mfa:proc_lib:init_p/5] parse_frames:{ssl,hybi,<<153,193,1,85>>,{ssl,{sslsocket,{gen_tcp,#Port<0.17851>,tls_connection,<0.533.0>},<0.6628.124>}}}
## Payload Data
websocket:request:53 [mfa:proc_lib:init_p/5] parse_frames:{ssl,hybi,<<190,209,15>>,{ssl,{sslsocket,{gen_tcp,#Port<0.17851>,tls_connection,<0.533.0>},<0.6628.124>}}}

对应的协议格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/63) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+

对于使用mochiweb的websocket只要增加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
parse_hybi_frames(_, <<>>, Acc) ->
lists:reverse(Acc);

......此处省略N行

%% 数据不完整,继续收
parse_hybi_frames(Socket, PartFrame, Acc) ->
%% io:format("3 ~p ~n",[{_Fin,_Rsv,_Opcode,_Mask,_PayloadLen,_MaskKey}]),
ok = mochiweb_socket:exit_if_closed(mochiweb_socket:setopts(Socket, [{packet, 0}, {active, once}])),
receive
{tcp_closed, _} ->
mochiweb_socket:close(Socket),
exit(normal);
{ssl_closed, _} ->
mochiweb_socket:close(Socket),
exit(normal);
{tcp_error, _, _} ->
mochiweb_socket:close(Socket),
exit(normal);
{Proto, _, Continuation} when Proto =:= tcp orelse Proto =:= ssl ->
parse_hybi_frames(Socket, <<PartFrame/binary, Continuation/binary>>,
Acc);
_ ->
mochiweb_socket:close(Socket),
exit(normal)
after
5000 ->
mochiweb_socket:close(Socket),
exit(normal)
end.

其他语言也差不多的逻辑,数据不全就继续等待数据了

参考文档

  1. https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-10

最近查看公司机器的内存占用情况,发现mongod大约占了50%的内存。
命令:ps auxc|head -1;ps auxc|grep -v PID|sort -rn -k +4|head;
原来内存默认使用的是(系统内存-1GB)*50%(据说是3.4版本+)。

这也太坑了,服务器又不是专门用作DB的,还有其他进程也要吃内存。

运行中的mongod,也不敢restart,查询了可能的运行中清理内存。
注意:没有在正式环境中执行过,仅作参考。

阅读全文 »

server端

下载地址:

安装到自己的手机上,然后点击右上角的+,添加需要共享的视频/音频
确保可以后台运行

client端

下载VLC for Android
安装到某盒子或者智能电视
确保server端client端在同一个局域网中

打开VLC,稍等片刻就可以在本地网络中看到了
如果看不到的话,就重启下server端

农历转公历是没有规律的,所以只能根据已有的数据转换
香港天文台的数据:https://www.hko.gov.hk/tc/gts/time/conversion1_text.htm#

自己转换出了一个lunar.db(点击下载),用sqilte3打开

1
2
3
>sqlite3 lunar.db "SELECT solar from lunar2solar where lunar=\"2023-02-22\""
2023-03-13
2023-04-12

自己随便写了一个农历转公历的接口,其实就是从lunar.db中查询数据而已
很随意的,性能没法保证的
https://tools.web.mingilin.com/lunar2solar/lunar2solar.php?lunar=2023-02-22
日期格式必须是YYYY-MM-DD

1
2
3
$ curl --silent https://tools.web.mingilin.com/lunar2solar/lunar2solar.php?lunar=2023-02-22 | jq -r '.data | .[].solar'
2023-03-13
2023-04-12

git for windows

  1. 启动ssh-agent服务
    1. Win+s搜索服务,以管理员身份运行
    2. 设置OpenSSH Authentication Agent为开机启动
  2. ssh-add增加私钥
    私钥放到C:\Users\用户名目录下,ssh-add %USERPROFILE%\ssh_keys\id_rsa
    可以创建一个开机启动.bat(Win+R->shell:startup)
    1
    2
    3
    4
    5
    echo 启动win10_ssh-agent
    echo 环境变量增加GIT_SSH=C:\WINDOWS\System32\OpenSSH\ssh.exe
    C:\WINDOWS\System32\OpenSSH\ssh-agent.exe
    ssh-add %USERPROFILE%\ssh_keys\id_rsa
    ssh-add %USERPROFILE%\ssh_keys\id_rsa2
  3. 修改git配置
    1. Win+s搜索编辑系统环境变量
    2. 增加系统环境变量GIT_SSH=C:\WINDOWS\System32\OpenSSH\ssh.exe
  4. 完成
    git clone ssh://xxx应该就可以正常工作了

TortoiseGIT

  1. 方法1:
    1. 先设置好git for windows
    2. 修改配置(Settings -> Network -> SSH Client)
      修改为C:\WINDOWS\System32\OpenSSH\ssh.exe
  2. 方法2:
    1. 启动Pageant,添加私钥.ppk
    2. 修改配置(Settings -> Network -> SSH Client)
      修改为Your\TortoiseGit\Path\bin\TortoisePlink.exe

原文链接: https://blog.wanfajie.com/2021/02/566

小米6手机(MIUI 11 20.1.16)中使用 DAVx5 显示缺少权限、无法同步 Tasks/OpenTasks 中任务。并且在 “设置” -> “应用权限” 中点击 “OpenTasks权限”/“Tasks权限” 开关无法打开。查看 DAVx5 日志发现以下四项权限被禁止:

  • org.dmfs.permission.READ_TASKS: denied
  • org.dmfs.permission.WRITE_TASKS: denied
  • org.tasks.permission.READ_TASKS: denied
  • org.tasks.permission.WRITE_TASKS: denied

令人困惑的是,MIUI 既不给出授权提示,在权限管理中也找不到自定义应用权限授权的地方。对 MIUI 的“设置”地毯式搜索后,终于找到了解决方法。

  1. 首先安装好 DAVx5 及 OpenTasks/Tasks.org 应用。
  2. 在“全部参数”中点击5次“MIUI 版本”,开启开发者模式。
  3. 在“开发者选项”中,关闭位于最下面的几个选项中的“启用MIUI优化”。
  4. 回到桌面,长按 DAVx5 应用的图标,点击“应用信息”。
    P.S.: 此时,应用信息界面变了个样子。如果是通过“设置”进入“应用信息”的话,界面将保持 MIUI 的原状。
  5. 然后,点击“应用信息”界面中的“权限”。进入“应用权限”界面后,你会在最下方看到“其他权限”选项。
  6. 进入“其他权限”,权限列表中将出现 “Tasks” 之类的权限,打开权限开关。
    进入 DAVx5 的 “设置” -> “应用权限”,此时就可以开启 “OpenTasks权限”/“Tasks权限” 开关并正常同步 OpenTasks 中的数据。

最后,建议再重新开启“启用MIUI优化”。关闭优化后,许多设置像是重置了一样,一来重新设置嫌麻烦,二来开启MIUI优化手机使用起来于我而言也没什么不足。网络上对MIUI优化众说纷纭,就看各位自行判断了。

  1. Google PlayDAVx5需要米,在F-Droid免费;
  2. 按照原文的方法,第一次重新“开启MIUI优化”后,DAVx5权限被重置了,
    又重新关闭再开启,DAVx5可以用了,
    可能成功与否要看人品;
  3. Tasks.org需要订购后才能使用DAVx5同步,没米,果断放弃,用OpenTasks
  4. 使用Radicale自建CalDAVCardDAVServer,真香,
    如果配合docker就更香;
  5. PC上用Thunder Bird+TbSync插件,管理日程和联系人;

最近要接手一些运维的工作
有时候需要远程更新下
对比了几个安卓的ssh客户端,发现termux最好用了(可以很方便的将迁移sessions)(Termius也挺好的)

阅读全文 »