BurningBright

  • Home

  • Tags

  • Categories

  • Archives

  • Search

尝试分析UDP

Posted on 2021-07-16 | Edited on 2021-09-18 | In network

Host

准备环境
Server

1
2
3
4
5
6
7
8
ens3      Link encap:Ethernet  HWaddr 02:42:ac:11:00:36  
inet addr:172.17.0.54 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:36/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3733 errors:0 dropped:0 overruns:0 frame:0
TX packets:1723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1216408 (1.2 MB) TX bytes:678036 (678.0 KB)

Client

1
2
3
4
5
6
7
8
ens3      Link encap:Ethernet  HWaddr 02:42:ac:11:00:18  
inet addr:172.17.0.24 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1717 errors:0 dropped:0 overruns:0 frame:0
TX packets:904 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1021151 (1.0 MB) TX bytes:301129 (301.1 KB)

Read more »

大教堂,集市和镇议会【译】

Posted on 2021-06-07 | Edited on 2021-06-10 | In blog

作者:艾伦•考克斯

这些是我认为值得分享的,我对’集市模式’的一些想法。它同时也是一个如何彻底搞砸一个自由软件项目的指南。我选择了一个我认为最好的,被称之为“城镇议会”效应的经典例子(尽管镇议员们可能不这么认为)。

对于软件开发人员,您必须了解一些特定的事情。首先要理解的是,真正优秀的开发者相对来说并不常见。不仅如此,一个真正的“真实开发者”和“普通开发者”之间的差异,相比其他职业“优秀”和“普通”之间的差异要大得多。研究表明,最好的开发者和其他开发者在工作效率上的差异是30比1。

其次,你需要明白,许多想成为真正开发者的人非常擅长发表意见。他们中的许多人还染上了噜苏病,或被一些专业人士认为这是“唯一正确的道路”。要知道在以太网上夸夸其谈很廉价。

任何软件项目的第三方就是我们所说的“群众”。他们中有些人不编程,但在其他领域做出了巨大贡献——文档、用户帮助和美术作品,这类人通常认为你需要一个许可证才能连接到互联网。

我将以Linux 8086项目为例来说明如何彻底搞砸。总的来说,将Linux的一个子集移植到8086是世界上最没有意义的练习之一,一开始只是个玩笑,后来就失控了。

只有极少数真正的开发者有足够的时间和正确的(或者是错误的)精神状态来为项目做出贡献,而这个项目的唯一真正价值就是“Hack Value”。因此,在任何给定的时间,项目都有两个或三个核心贡献人员。

不幸的是,有很多人认为在8086上运行Linux会很好,他们觉得有义务“参与”。在这种情况下,他们中的大多数人都停留在“想成为开发者”这一类人,因为他们从安全距离发现了这个项目的“愚蠢”因素。

开始出现的问题是,许多(大部分意义很好)危险的半线索人带着意见的到来,不是代码而是意见!他们完全清楚应该怎么写,但大多数人不会用C语言写“hello world”。因此在项目使用了一年适用的编译器后,他们为用什么编译器亦或是重写一个争论了几周。他们忙于讨论如何生成大型模型二进制文件,而忽略了内核交换器设计。

Linux 8086继续开发,真正的开发人员在他们的kill文件(黑名单)中有很多其他列表成员,这样他们就可以通过列表进行通信,而这仅仅是因为有太多的半线索人在乱发邮件。它不再是一个集市模式,它变成了一个核心团队,对许多人来说,这是一个礼貌的用词。在这种情况下,这是不可避免的防御阵地。

在Linux的模式中,用户/开发者基础增长缓慢,它的成长背景是从一群贡献代码的人员中成长起来的,他们要么是在最初的Minix黑客社区中有基础,要么是通过一次次启动的艰难方式学会了一些东西。随着项目的发展,那些原本应该成为“Linux内核结构规划管理委员会”的人反而被抛弃在一个期望他们交付的环境中,在那里失败不被视为问题。用莱纳斯的话来说,“给我看看源码”。

如果有人被卡住了,他们就会发布问题,通常会有一个基数足够大的,有时间和相应知识的人来回答。在Linux8086的案例中,开发人员早就把自己隔离起来了。如果有一个更好的活跃开发者与潜在有用的开发者的比例,就能迅速将一些噪音转化为生产力。这个项目可以获得更多有用的开发者,他们反过来也可以教其他人。与任何学习练习一样,你最好只有几个学徒。

有些人认为你不能把“低级开发者”变成真正的开发者。从个人在Linux项目中的经验来看,有很多人提供了一点帮助,并增加了一点他人的信心,他们将成为最好的开发者。有很多人不会,但足够多的人会。

作为这个声明的一个例子,Linux IPv6源代码的作者曾经在葡萄牙的irc(Internet Relay Chat)上提出一些基础的想法和问题。在我们帮助他解决一些内核内部问题后,他编写了大约75%的Linux IPv6协议代码,而最后一次见到他是在美国为思科工作。

Linux 8086项目基本上已经从它的“侵扰”中恢复过来,现在是一个小的安静的项目,使用CVS树,由Alastair Riddoch领导,他一直在做出色的工作。随着镇议员的解散,现在可以自由的提出问题,加入和帮助这个项目。

从这个项目以及其他类似项目(有时会失败——还记得早期的Linux文字处理项目)中得到的教训非常清楚:

  • 从一开始就发布代码。如果不是很有用也没关系。对镇议会进行分类的最好方法就是简单地完成工作,然后告诉他们已经完成了。Linux、KDE和GNOME都采取了这种态度,并且都做得很好。你可以为正确的编程方式争论一辈子。一旦有了代码,人们(不管他们的技能如何)就可以使用它。
  • 感谢那些给你一点帮助,却能为项目做出巨大贡献的人。如果他们的第一个补丁有问题,不要忽略它们,解释为什么会有问题,并提出解决方案或是指出能寻找到解决方案的地方。每一分钟花在回答真正的问题上,帮助别人在一个项目上工作,将会得到十倍于项目的回报,对社会的回报将是不可估量的。
  • 不要忘记非开发者。我发现很可悲的是,当被问及“最重要的五名Linux内核人员”时,大多很少说出一些最重要的人的名字——所有那些维护网站、更改日志、邮件列表和文档的人都同样重要。莱纳斯说“给我看看代码”,这是对一个真实项目的狭隘看法。当你听到“我很想帮忙,但我不会编程”,你听到的是一个文档管理员。当他们说“但英语不是我的母语”时,你就有了另一种语言的文档和翻译人员。
  • 试着把有用的人从噪音中分离出来。试图把人们从大量无意义的讨论中分离出来很难,在Linux 8086的案例中,我放弃这个目标绝对是错误的。如何排除那些只说不做的人是一个研究课题。

所以下次有人想要对一个项目投票,或者讨论一个月的问题,然后执行它——请注意。他们有可能最终能找到正确的解决方案。但不管怎样,你还是有较大可能性继续开发下去。只要在项目推进时,让他们给你发个补丁就行了。

要小心“我们应该”,而是着手于“我该怎么”……

——1998

Cathedrals, Bazaars and the Town Council
Feature:Cathedrals, Bazaars and the Town Council
Alan Cox

均方误差的偏方差分解

Posted on 2021-05-14 | In ml
  • 均方误差期望 = 偏差 + 方差 + 噪音

  • 偏差显示了,预估模型和“真实”函数 $f(x)$ 之间的数值差别。

  • 方差显示了预估函数 $\hat{f}(x)$ 值与其均值的分散程度

https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff
https://datawhalechina.github.io/pumpkin-book/#/chapter2/chapter2

usb 转 usb 转换器

Posted on 2021-04-18 | Edited on 2021-04-23 | In 漫步键圈

489871548.jpg

19年初看到老莱频道剪辑师介绍的 Hasu u2u 转换器非常心动,可惜已售罄。
在geekhack上找到 Hasu 的帖子USB to USB keyboard converter build log,但完全不知道怎么制作。
这是第一次了解到 Hasu 和他的 TMK,后来在看Yang的HHKB蓝牙双模改装方案时发现也有 Hasu 的贡献。

20年8月看到50元成本自制转换器,正好ERGO88进展不顺,打算试试QMK换换心情。
结果是反复尝试进DFU都失败,一度以为运气不好,买到的 Arduino pro micro 板子没法刷固件。
纠结半天,曾打算买ISP工具重新烧录bootloader,最后担心花费太多时间精力还是放弃了。

21年初完成ERGO88后,重买 pro micro,这次以防万一,买了16MHz-5V版本。
16MHz u2u运行正常,换到8MHz发现去年买的板子竟然烧录正常。
问题应该是出在第一次进DFU上,尝试在插入USB前就短接,插入后放开再短接一次就能顺利进入。

原理图

20210421155504.png
如果买的是3.3V版本的pro micro,就不用再接U2线性稳压元件

50元成本自制转换器 里面包板线序没有很清晰的标注出来,原理图参考 USB Host Shield Library, For Connecing Other USB Devices。

Shield

20210421163704.jpg
usb hub的外接设备供电,需要和板子断开,如图中红圈所示断开线路。
飞线shield的raw针至图中箭头所示焊盘,使用 pro micro 的raw针为设备供电。

20210421163804.jpg
外接设备供电飞线,3.3V和RST针飞线。

线路参考: 在 Arduino Min (3.3V,8MHz) 上使用 Usb Host Shield Mini

130850.jpg

Arduino

20210422153200.jpg
旋转180度,层叠在一起。
右上第三针如果插接会短接VCC,这里我掰掉了 pro micro 的第三针GND脚。

固件

解决好供电,晶振频率的问题可以通过固件适配。

8Mhz https://config.qmk.fm/#/converter/usb_usb/pro_micro/LAYOUT_all

16MHz https://config.qmk.fm/#/converter/usb_usb/hasu/LAYOUT_all

如果键盘是非标键盘,或是有宏定义的需求,可以自行编译。
https://github.com/qmk/qmk_firmware/tree/master/keyboards/converter/usb_usb

在 keymaps 下新增映射表,并编译
./bin/qmk compile -kb converter/usb_usb/pro_micro -km default

烧录

  1. 下载hex固件文件
  2. 下载 qmk_toolbox,注意安装驱动
  3. 短接两次RST脚和GND脚,进入bootloader,该状态会维持8秒。
  4. 选择好hex固件文件,在DFU状态点击烧录按钮,等待界面升级日志提示成功。
  • 如果arduino插入toolbox没反应,检查驱动是否安装
  • 如果arduino两次短接没法进入DFU,尝试先短接RST、GND再连接电脑,放开再短接一次。

在 Arduino Min (3.3V,8MHz) 上使用 Usb Host Shield Mini
我修我自己——Arduino充当ISP烧录器修复Arduino记录
【HIDuino】 — 超迷你的USB-HID开发板
https://www.arduino.cn/thread-6001-1-1.html
Arduino串口调试助手(2013.12.28更新)


https://1upkeyboards.com/shop/controllers/usb-to-usb-converter/
USB Host Shield Library, For Connecing Other USB Devices
USB to USB keyboard converter build log(Pro Micro 3.3v with mini host shield)
50元成本自制转换器——普通键盘变全键可编程键盘键盘什么值得买
【官方双语】打鸡血的键盘-Hasu USB到USB键盘控制器转换器#linus谈科技

mysql中 distinct 和 group by 的性能对比

Posted on 2021-03-19 | Edited on 2021-04-02 | In db

建张表

1
2
3
4
5
CREATE TABLE `test_a` (
`id` int(11) NOT NULL auto_increment,
`num` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create procedure p_test_a(pa int(11))
begin

declare max_num int(11) default 100000;
declare i int default 0;
declare rand_num int;

select count(id) into max_num from test_a;

while i < pa do
if max_num < 100000 then
select cast(rand()*100 as unsigned) into rand_num;
insert into test_a(num)values(rand_num);
end if;
set i = i +1;
end while;
end

生成数据
call p_test_a(100000);

不加索引

1
2
3
4
set profiling=1;
select distinct num from test_a;
select num from test_a group by num;
show profiles;

20210319181857

加索引

1
ALTER TABLE `test_a` ADD INDEX `num_index` (`num`) ;

20210319182050

总结

  • 加了索引之后 distinct 比没加索引的 distinct 快了 27 倍。
  • 加了索引之后 group by 比没加索引的 group by 快了 50 倍。

再来对比 :distinct 和 group by
不管是加不加索引 group by 都比 distinct 快。
因此使用的时候建议选 group by

MySQL中distinct和group by性能比较[转]

Shell比较文件内容

Posted on 2021-02-26 | Edited on 2021-04-02 | In linux

牛年大吉!

场景

批量下载文件时,发现部分文件下载失败(大约10%)
手头上有原始文件地址、已下载文件名,需要找到下载失败的地址。

探索

A

首先是找到的awk差集命令

1
awk 'NR==FNR{ a[$1]=$1 } NR>FNR{ if(a[$1] == ""){ print $1}}' aaa.txt bbb.txt

思路是用数组存文件1的行数据,再用文件2搜是否存在
优点是效率高命令简洁,缺点是扩展麻烦,文件2需要做预处理,要把地址里的文件名单独提取一列。

B

然后找到的是awk对比脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#/bin/bash
file1="aaa.txt"
file2="bbb.txt"

lines=`cat $file1 | wc -l` + 1

for ((i=1;i<=$lines;i++))
do
line1=`awk 'NR=='$i'{print $0}' $file1`
line2=`awk 'NR=='$i'{print $0}' $file2`

if [[ $line1 != $line2 ]]
then
echo "line $i is not equal"
fi
done

优点扩展性更好,缺点是每次循环都需要定位行,性能浪费严重。

脚本

基于B魔改了一个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

#文件地址
file1="aaa.txt"
#已下载文件名
file2="bbb.txt"

lines=`cat $file1 | wc -l`+1

for ((i=1;i<=$lines;i++))
do
#定位当前循环对比行
line1=`awk 'NR=='$i'{print $0}' $file1`
#摘出文件名
name=`echo $line1 | grep -ioP "(?<=/)[^/]*?(jpg|jpeg|bmp|gif|png)" `

#如果在已下载文件中不存在,则为下载失败文件
if [[ `grep $name $file2` == "" ]]
then
echo $line1
fi
done

性能非常捉急,1000多条数据跑了半个多小时。
awk那的优化估计比较难,进awk代码段里写逻辑的话参考方案A。
grep那应该可以优化,用数组散列表来替换。
数据量较大的话还是方案A比较理想,或者写代码来处理。

awk 进阶(两文件的交集和差集)
awk比较两个文件内容

KL散度的解释【译】

Posted on 2020-11-26 | Edited on 2020-11-27 | In ml

原文地址Count Bayesie
这篇文章是博客Count Bayesie 上 Will Kurt 的文章
Kullback-Leibler Divergence Explained 的翻译和笔记
原文对 KL散度 的概念诠释得非常清晰易懂,评论区中有很多致谢,建议阅读

笔记

KL散度是原始分布中数据概率与近似分布中数据概率的对数差的期望,用于量化参数化近似代替观测分布时丢失了多少信息。散度越小,说明模拟越逼近现实。

信息

信息论奠基人香农认为“信息是用来消除随机不确定性的东西”,也就是以前不知道现在知道的事实。

熵作为度量信息的期望,引用PRML中的观点,信息量可以看成是在了解事物时,感受到的“惊讶程度”。低概率事件内蕴的信息会比高概率的信息多,比如革命性产品问世、突破性科学发现。正所谓“无常生妖”,低概率事件有更多信息符合直觉。

多个事件同时发生的概率是多个事件概率相乘,总信息量是多个事件信息量相加。
熵计算公式中的对数不大好理解,参考严谨推导可以发现信息量确实是$f(x)=-log{x}$。

概率和信息量的对数关系,可以理解为 两件事情信息量之和 = 两件事情同时发生的信息量:
$x_1$和$x_2$同时发生的概率:$P(x_1, x_2) = P(x_1)×P(x_2)$
$x_1$和$x_2$的总信息量:$log_2(P(x_1)P(x_2)) = log_2P(x_1)+log_2P(x_2)$

趣闻

评论区中,作者有回复关于熵的符号H的提问:

谢谢你的评论,我不禁对这个符号的历史做了一些研究!如果你读过《通信的数学理论》(该书改编自香农为信息论奠定基础的原始论文 http://math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf )你会发现香农解释了H的起源:

H就是玻尔兹曼著名的H定理中的H。

有趣的是玻尔兹曼最初把它命名为E,但后来他决定换成了H,虽说对他是不是取了希腊字母Eta H有些争议。

在玻尔兹曼关于熵的论文中,他使用了S,而S(不是E)仍然是熵的标准物理符号。(维基百科中关于热力学第二定律的注释用了S https://en.wikipedia.org/wiki/Second_law_of_thermodynamics)

参考

KL散度的理解(GAN网络的优化)
KL散度的理解
Tutorial on Variational Autoencoders
不知为不知—信息论和最大熵原则
信息量为什么要表示成对数的形式

译文

在这篇文章中,我们将研究一种比较两种概率分布的方法,即Kullback-Leibler散度(通常简称为KL散度)。在概率和统计中,我们经常用更简单的近似分布来代替观察到的数据或复杂分布。KL散度帮助我们测量当我们选择一个近似值时我们损失了多少信息。

biting-worms.jpg

空间蠕虫和KL散度!!!


Read more »

漫步键圈 - 固件

Posted on 2020-11-20 | Edited on 2020-11-22 | In 漫步键圈

nrf52-keyboard

Lotlab 开源固件,支持双模。
具体安装过程可参考 .travis.yml

环境

SDCC 用于编译 CH554
GCC 用于编译 NRF52832
nrfutil 用于生成DFU包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装git make和sdcc编译工具。
# 注意Ubuntu 18.04及之前的SDCC版本较旧,无法成功编译
sudo apt install git make sdcc

# 如果sdcc无法命令安装,可以手动安装
wget https://sourceforge.net/projects/sdcc/files/sdcc-linux-amd64/4.0.0/sdcc-4.0.0-amd64-unknown-linux2.5.tar.bz2 -O /tmp/sdcc-4.0.0-amd64-unknown-linux2.5.tar.bz2
tar xf /tmp/sdcc-4.0.0-amd64-unknown-linux2.5.tar.bz2 -C /tmp
sudo cp -r /tmp/sdcc-4.0.0/* /usr/local

# 下载GCC
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2
# 解压gcc
tar xf gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2
# 将GCC移动到用户目录
mv gcc-arm-none-eabi-7-2018-q2-update/ ~/.local/
# 删除压缩包
rm gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2

sudo apt install python3 python3-pip
# 安装 nrfutil
pip3 install nrfutil
Read more »

漫步键圈 - 硬件

Posted on 2020-11-09 | Edited on 2020-11-14 | In 漫步键圈

元件

SMT元件

PCB下单,贴片SMT
IMG_3197
IMG_3199
如果不嫌麻烦也可以自己焊

Read more »

地理空间距离计算优化【转】

Posted on 2020-11-03 | Edited on 2020-11-08 | In math

原理

地理空间距离计算方法较多,目前使用的可以分为两类:

  1. 球面模型,这种模型将地球看成一个标准球体
    球面上两点之间的最短距离即大圆弧长,这种方法使用较广,在服务端被广泛使用。
  2. 椭球模型,该模型最贴近真实地球,精度也最高,但计算较为复杂
    目前客户端有在使用,但实际上应用对精度的要求没有那么高。

下面着重介绍最常用的基于球面模型的地理空间距离计算公式,推导也只需要高中数学知识即可。

Read more »
123…29

Leon

282 posts
20 categories
58 tags
GitHub
Links
  • clock
  • typing-cn
  • mathjax
  • katex
  • cron
  • dos
  • keyboard
  • regex
  • sql
  • toy
© 2017 – 2024 Leon
Powered by Hexo v3.9.0
|
Theme – NexT.Muse v7.1.2