Tuesday, 15 December 2020
Sunday, 29 November 2020
视频用 N 倍速看对 fps 的影响
如果播放视频时加速,对 fps 有何影响?如何预测会 dropped 多少 frames?
mpv 确实可以 speed up 后如果仍可以满足 monitor 的 refresh rate Hz 就可以不 drop frames。
不过 165 Hz 要求 gpu+cpu 很高否则也是有问题(不然 multitasking 容易 drop frame)。
而且 144 Hz 或 120 Hz 都能被常见的 24 fps 完整除 (120 Hz 能被 youtube 常见的 30 fps 除)
,只有 165 Hz 怪怪的不能整除 (https://www.svp-team.com/forum/viewtopic.php?pid=63214#p63214)。
做个小实验验证一下:
Thursday, 12 November 2020
MySejahtera bug
MySejahtera 的隐私 bug,可以查看其它店的人流, 甚至更新资料。
有些非 Master branch 而看不到更新资料的页面,能通过 email 得知 `Hi contact_name`(有些填手机号)。
由于 bug 会被滥用,我就不公开方法了。(更新: 已被修复)
MySejahtera 没网络 check-in
实验:
Saturday, 7 November 2020
Facebook 鏈接對下載質量的影響
用 youtube-dl 和 you-get 下載 4 種視頻鏈接格式:
[1] 'https://www.facebook.com/<username>/videos/123/'
[2] 'https://www.facebook.com/<username>/posts/123'
[3] 'https://www.facebook.com/permalink.php?story_fbid=123&id=123'
[4] 'https://www.facebook.com/watch/?v=123'
[5] 手動下載。
實驗結果:
Friday, 23 October 2020
怎样才能在 Facebook 上传下载最高清的图实验。
Android 上传 4 MiB (4032x3024) 的文件, PXL_20201022_141809183.NIGHT.jpg:
[1] 浏览器能下载 241 KiB (1440x1080) 的 JPEG 图。
[2] Android Facebook app 能下载 114 KiB (1080x810) 的 JPEG 图。
浏览器上传同样的 PXL_20201022_141809183.NIGHT.jpg:
[1] 浏览器能下载 509 KiB (2016x1504) 的 JPEG 图。
[2] Android Facebook app 能下载 109 KiB (1080x806) 的 JPEG 图。
实验总结:
Wednesday, 21 October 2020
bash -c "$pitfall"
If user use bash -c "" will easy to get unexpected result if user just copy-paste working code from existing shell session into bash -c "" (OR extend existing bash -c "") and expect it same. But if user use single quotes(outermost) consistently, then user can get rid a lot of trouble.
Monday, 19 October 2020
Facebook 新设计的 bug
如果群组组员的主页 URL 是没用户名 (譬如 https://www.facebook.com/zuck 格式) 而只有 id (譬如 https://www.facebook.com/profile.php?id=12345 格式)
,那么群组的组员页面的 "View Main Profile" 按钮是 link 去 www.facebook.com 而不是该用户的主页。需要去网址栏删除 groups/<组id>/user/ 再浏览。
如果你只有 id 那么就可以减少 (当然, 不可能完全避免) 组里 stalker 们 stalk 你主页, 反之如果你是搞宣传的且希望在组里引流去你的 profile, 则劝你放个用户名。
我转换去新设计后早就注意到这个 bug 很久了(很明显好不),只是到现在都没去 fix 囧, fb 的员工懒到囧 😆。
Saturday, 10 October 2020
Wednesday, 7 October 2020
Google Pixel 4a 超坑人的 alarm bug
我就奇怪做么 alarm ⏰ 常没声音,原来 slider 的 alarm volume bar 要超过一半才等于 clock alarm 的第一个 volume,wth 🥶🥶🥶🤖🎃🥃
Media volume 1/3 的声音就够了,所以 Alarm volume 也跟着调 1/3, 没想到是个大坑:
与上图 slider 相应的 volume, 在 clock app 的设置是 mute 囧:
来个全景经典画面, 左(slider 设置)1/3, 右 (clock app 设置) 是 mute, 两者名字都称 "Alarm volume" 囧, 应该坑了不少人, 不说了我迟到了 🌚:
Friday, 7 August 2020
Catch 'Err All - universal command to check any log
之前 MCO fb 群组教人 debug 的时候无意中想到, 如果有一个命令,能收集所有常见的错误关键字来秒 grep 会超级有用。
不管你是 /var/log, 还是 logcat, 还是什么鬼程序的 log, 都能轻易看出错误的地方, 这些错误的地方值得关注为啥会错误, 而不是迷失在大量无意义的正常 log。
即便有些错误对程序来说是正常输出,我个人觉得仍然值得关心干啥会有错误字眼。而且有杀过没放过,看多好过遗漏。错误的 log 不是非常多,花不了太多时间, 而且很多是重复性的源自于同一个程序错误, 只要解决该程序问题就能大量减少该错误信息。
我知道 dmesg 可以分类, 譬如 `dmesg --facility=kern --level=emerg,alert,crit,err`。但是仍然不能说正常 log 没有值得关注的错误信息。而且我目标应付是任何程序的 log (当然不可能完美,有些字眼对某些程序或许重要/不重要而遗漏,这种情况下可以加上 -v 稍微检查是否有遗漏, 或添加排除该程序不重要的字眼)。
命令代码和往后的详情更新,请浏览 https://github.com/limkokhole/Catch-Err-All
你可以看到 (?<! b|dia)log(?![a-z]), 表示我要看到有 log 关键字的 line, 但是又不想包括 blog, dialog,logic, login 这些常见字眼。前面是 `?<!` , 后面是 `?<`, 区别只是前面多了一个 `<`。要添加的时候,先检查现成有没有才修改 (比如我要 exclude "dialog",我找到现成已有 "log", 那就在 "log" 那里 extend, 而不是加新的 `| |` )。
你可能会问有 "impossible" 为何没有常见的 "not possible", 因为 "not" 已拥有自己的 `| |`。所以不需要重复加 "not possible", "not able", "not found" 之类的 | |, 省很多。想一下,有 `not `的 log 是不是很多都是跟错误(或值得关注)有关系的?就是这么个玩法。block 也是同理,有 lock 了不需要 block。改的时候要小心, 譬如 dump 是包括 core.?dump 的哦。err 可能比较常改, 所以最好分 errno 和 interrupt 出来。
还有一些比较主观的讲究, 比如 disabling, revoking ... 我觉得没那么重要,重要的是 disabled, revoked, 所以我才放 disable 而不是 disabl。还有 pause 不是很重要,毕竟只是暂停,并非如 stop 或 cancel 那么重要。放太多会很 noise 所以要取舍。
最后第二个 `\?` 是黑人问号 ?, 如果问号 ? 在 log 是正常的就要拿掉或修改。此命令主要就是 universal template,不是直接用就完美,但起码有个起点让你稍微修改就搞掂。
最后则是常见的感叹号 "!", 排除常见的 `[ !` shell 格式和 `<! `html tag 以减少噪音, 不过仍然得保留常用来表达某些事物不等同而出错的 `!=` 符号。
有时你想了解上下文,可以加类似 -C 5 的 grep 选项或最后的 ' 前放多一个 `|` (不需要值) 即可显示全部不过仍然有搜索颜色看。
效果截图:
Sunday, 28 June 2020
Longest filename test by various downloaders
Saturday, 20 June 2020
Friday, 12 June 2020
Web VS FFmpeg VS duboku-downloader
注:由于测试涉及到连续剧画面,Malaysia, Vietnam, Thailand, South Korea, Indonesia, United States, Taiwan, Philippines, India 的用户需要其它地区的 VPN 才能观看此测试视频。
mpv player 能 skip broken m3u8 chunk, 但是 mplayer, vlc, windows media player 都有卡住的问题,mplayer (vlc 没问题, 忘了 windows media player) 甚至音频在卡住的情况下继续运行,所以卡完后音频比视频快了十秒。我写的下载器通过 pad(暴力循环 17 次(事实上 16 次就够了,不过 `ValueError` 速度超快,多一个 offset 不碍事)找出需要的 16 bytes 之一, 一旦成功 decrypt 即 break) 以及 remux ts to ts 解决了这一问题。我发现 start time 变成 0 而不是保持损失的视频时间四十多分钟才能在接下来的一次性 remux ts to mp4 变成正确的时间。 remux ts to ts 需要加新 muxer mpegts , 所以得重新编译 ffmpeg_minimal_ts_2_mp4.exe。
至于那个速度测试,与其说是我的快(纯 python 本来就不快), 还不如说是 ffmpeg 做冗余的工作导致慢。此测试已经尽可能让 ffmpeg 发挥默认(或许有隐藏选项可是我不懂,普通用户都不懂, 基本虚设) 最好的效能, 例如第一个 m3u8 是 output .ts 而不是 .mp4 以减少不必要的 remux。至于 python 则并非第一次跑 (第一次跑肯定有点慢, 但是现实中下载都是连续的)。 不过 ffmpeg 也好不到哪里去,不是第一次跑,也直接给 m3u8 链接 (现实中, 手动或扩展找 m3u8 链接都要花时间吧)。更新: 后来才发现先转 .mp4 比先转 .ts syscalls (还没算第二次转换)少, 只是不明白之前的随便测试比较是 .ts 比较快。无论如何, 速度差不了几秒, 不然我也不会用先转 .ts 来测试, 都是慢很多。
List syscalls by `strace -c`, duboku-downloader VS ffmpeg -i .m3u8 -c copy .mp4:
然后我也写了个 python 脚本分析了一下下载 .ts 速度的变化。只显示超过左边栏的差距能大于一秒的,然后右边则是当下累积的差距。能看出来,重新下载仍然是差距 ~37 秒 (最右下是 -37.6)。 此分析忽略时间格式有问题的 .ts, 包括第一个和最后二个两个,不过有其它数据足够分析了。此分析证明 FFmpeg 还是有快过我的地方,不过明显少于我快过它的地方 (右栏,~23 次我快 VS ~9 次它。 左栏则是 20 VS 12)。而且能重点分析为何第三个的 WW8CBwpZ.ts 快了 FFmpeg 近 4.7 秒, 连续则是近 7 秒。不过单体最快反而是 ffmpeg 的 5.7。

新版本的 duboku-downloader 解决了很多 bug,其中解决了 Windows 使用 ffmpeg 会出现烦人的黑窗口。首先认识了 shell=True完整的 string 可以 work。虽然 ffmpeg path 可以解决,可是 source/dest path 比较多工 (还要考虑盲目 concat 的安全性)。不过后来又发现 Windows 和 Linux 用回 list 没问题 ( Windows 用 ffmpeg full path), 只是 Linux 用 single string 需要加上 cwd=os.path.dirname(os.path.realpath(__file__)) 。也发现 Linux 不用 ffmpeg full path 会运行 sh -c ffmpeg ... 可是竟然没有引号 no wonder 上次失败 ! 再后来把 "ffmpeg_minimal_ts_2_mp4.exe" 嵌入 "独播库下载器.exe", 得改用 sys._MEIPASS 才能知道 pyinstaller 默认的 ffmpeg path。以前/开头试过 binaries 也不成功,后来才知道 pyinstaller .sepc 的很多东西要用 tuple 表达, 例如: binaries=[ ('duboku_lib\\ffmpeg_minimal_ts_2_mp4.exe', 'duboku_lib') ],前者是 pyinstaller 找 ffmpeg_minimal_ts_2_mp4.exe 拿来 build 的路径, 后者则是 runtime 的路径 (也就是 sys._MEIPASS 的子目录)。用在 subprocess 的完整路径就需要 os.path.join(sys._MEIPASS, os.path.join('duboku_lib', ffmpeg_path) )。
项目链接: https://github.com/limkokhole/duboku-downloader
Thursday, 14 May 2020
肉眼解析 QR code 的 "a"
首先找出版本号,方程式是 (格子边长 - 17) / 4, 因此上图是 (21 格 - 17) / 4 = Version 1。因此版本 2 的边长会多 4 格, 以此类推到 (177 格 - 17) / 4 = 最大的版本 40。对照某些表时,不同版本不同值, 例如 Character Count Indicator 长度, 所以需要版本号。
4. https://web.archive.org/web/20141129033352if_/http://raidenii.net/files/datasheets/misc/qr_code.pdf
Wednesday, 6 May 2020
Facebook - How to know who unfriend you long long time ago
Note:
If someone block you after unfriend, it still possible to see post by create new account which only added you, so there are still some possibility it will shows post of friend of you.
There are actually 2 privacy bugs here.
First bug is the search able to store deleted comment in plugins( and probably also apply to other places I don't noticed). The first bug shows the over powerful of search by post leads bug.
The second bug take further step of first bug which tick on filter by "Your Friends". This bug proved that the friend relationship never drop even after unfriend, which actually also happen if the new account add only you and unfriend you then the friend suggestion more likely is still your friends.
Tuesday, 14 April 2020
strace vs netstat
I trying to download blog at https://linux-audit.com/ via python, but `requests.get()` keep stuck until timeout specified, but it able to get response data after timeout.
But curl is working, why?
After dig into strace socket/connect syscalls, I eventually realized that syscalls showing two critical familly, INET and INET6 which represents ipv4 and ipv6 respectively. But INET only run after INET6/timeout.
And I also noticed curl calls both syscalls at sequence without blocking, so it seems at least one is success is fine.
So the solution is monkey-patching the python code to ignore ipv6(or ipv4 if ipv4 not working next time), either https://stackoverflow.com/a/50044152/1074998 or https://stackoverflow.com/a/43950235/1074998 are works.
Anyway, I subscribed mobile network and it changed to ipv6 now, so I can't reproduce anymore ipv4 not working to call ipv6 address at the time of writing.
p/s: net-tools has been unmaintained for years, and so netstat was deprecated, and you should use `ss` as replacement . --inet/inet6 need replaced by -f inet/inet6 or simply -4/6, but I noticed can't use both -4/-6 same time except not put family options at all. Also need -H do not always shows header which can different width/position and creates unnecessary diff. And you might want `| column -t` piped from ss.
ss useful to include udp/icmp's ping traffic listed with ip which can't be done in netstat. But still the output columns too messy/wide to see in a glance.
Sunday, 23 February 2020
Saturday, 15 February 2020
Thursday, 6 February 2020
火狐 - 关闭窗口的警告对话框
我不懂别人,但是我开电脑大多数时间都是一直开着火狐的,除非关电脑才关火狐。
换句话说,我很少需要去按火狐的关窗口按钮,因此按关窗口按钮多数都是误触 (或 Ctrl+W 误按到 Ctrl+Q, 抑或误以为 printer preview 是新窗口从而按到 'x' 而不是 Close 按钮囧我每次都..) 。
如果没有警告,就常常发生需要重载 tabs,除了浪费时间,也可能找不回正在看着的东西 (例如更新页面就变化的广告或 Facebook news feed)。
所以启动警告对话框是必须的。
要更改设置可以输入浏览 about:config ,点击 "Accept the Risk and continue", 然后搜索 "onquit" 找到:

然后把 "browser.sessionstore.warnOnQuit" 和 "browser.warnOnQuit" , 点击 false 改成 true。
要改两个哦,只改其中一个无效。火狐这 combo 操作是哪个天才想出来的。
改了后,尝试关闭窗口,不需要重启就能看到效果:

"sessionstore.warnOnQuit" 这个名似乎是 2019 年新增的,一旦本文失效后,得请读者自行再搜了。
Thursday, 30 January 2020
Celcom - bypass 无限上网的 tethering 限制
虽然没注明不能 tethering , 反而 Internet Pass 说可以 tethering,可是发现 redeem 后也是不能 tethering:

手机终究在自己手中,理论上可以 bypass,可是无限上网只剩下不到一小时,不可能临时研究,就打算放弃了。然后 google 看下别人吹水不爽 celcom 不给 tethering,搜了下 bypass tethering block 找到这个 thread,提到 PdaNet+,就去 play store 下载 PdaNet+:
可是打开 app 它说需要 tethering 的电脑下载 client, 可是无限上网期间 tethering 已 disable 怎样下载囧?:
然后真的立马可以上网, 且下载 Visual Studio 速度达到几 MB。
好景不常,celcom 似乎早有准备,速度不久就 drop 去几百 KB, 最后甚至几十 KB,re-plug/re-connect 也没用。
只剩半小时不到,我从开发者的角度觉得可能 celcom 侦测手机是否上网才 drop 大量下载的线, 就试了下 chrome/facebook,不行。第二次要放弃的时候,再试 google play store app, 神奇的一幕发生了,速度立马回升到几 MB!
然后很快又掉回去了,我不停的重复刷 app 页下面的 "You might also like" 以及 "Recommended for you" app (即: app 主页 -> scroll 下面 -> 随便点击一个 app -> 重复),才能保持速度在几 MB,真是搞笑。
刷 comment 也能,不过似乎到一个点无效了。所以刷 app 是最好的方法。
最后终于顺利下载完 Visual Studio 了,半小时还未完呢。
Thursday, 23 January 2020
Whatsapp - Emoji 冷知识
可爱的幽灵由于全身衣所以省了。
Saturday, 18 January 2020
Facebook - 下载视频必知
Facebook 有些(不是全部)视频下载很慢, 必须加上正确的 facebook.com/ referer 才能恢复正常下载速度。
正确 referer: ~9.MiB/s
错误 referer: ~40KiB/s
吐槽下 youtube-dl 的设计,干嘛不默认使用 url 当 referer 黑人问号x3
Thursday, 9 January 2020
中国报 - 备份视频必知
中国报有视频的新闻, 自家有三种视频来源。
一,jwplayer 的 .mp4 直接链接。这个是骗小孩的糖果,其实是最低的质量。
二,jwplayer 的 .m3u8,这个质量仅仅排第二。
三,dailymotion 的视频,这个质量是最好的。有时可能优势比较小,有时优势相当大 (24M vs 6.1M)。
新闻例子一, 优势明显 (24M vs 6.1M), 且 Encoder features: High(Storage) > Main(Streaming) > Baseline(Low end devices,没 B-frames):
这里插入个实验,研究 .ts remuxing mp4 的影响。我写个脚本下载 ts 然后 append to single file, 再 ffmpeg remux:
新闻例子二, 优势比较小, 不过排名仍然一样 (dailymotion > jw m3u8 > jw mp4):

可以看出 encoded 虽然大小改变了(此次是增大), 但由于两者的各方面都同样增长 (第一次 encode 都是升,之后重复 encode 才跌),因此对排名没有影响,仍然是 dailymotion > jw m3u8






































