关于树莓派SSH登录和输入卡顿的原因,各种说法都有,多数都说是dns的问题和GSSAPI的问题,试过了都不行,找到一个关于IPQoS 的方法,设置后解决了。

/etc/ssh/sshd_config最后追加

IPQoS cs0 cs0

IPQoS的解释
对应的服务 IPv4优先级/ EXP / 802.1P DSCP(二进制) DSCP(十进制) TOS(十六进制) 应用
BE 0 0 0 0 Internet
AF1 Green 1 1010 10 28 Leased Line
AF2 Green 2 10010 18 48 IPTV VOD
AF3 Green 3 11010 26 68 IPTV Broadcast
AF4 Green 4 100010 34 88 NGN/3G Singaling
EF 5 101110 46 B8 NGN/3G voice
CS6 6 110000 48 C0 Protocol
CS7 7 111000 56 E0 Protocol

虽然市场瞬息万变,但是巴菲特的这些基础投资理念,几十年来却都没有变过。他把这些基础投资理念叫做“永不过时的指导

 

1. 基本原则一:永远不去预测市场

作者告诉我们,巴菲特很早就宣称过,自己根本没有能力预测整个市场的走向。他在书里举了一个例子。

某些合伙人给巴菲特打电话,说某某股票将会像几个月前那样持续利好,应该赶紧买。但是巴菲特对他们的提议,实际上是不屑一顾的。

巴菲特曾说:“如果他们在2月份就知道道琼斯指数在5月份会达到865点,那他们当时为什么不让我进场?如果合伙人三个月前不能预测道指的走向,那他们凭什么觉得自己突然之间具备了预测能力?”

换句话说,巴菲特不仅不喜欢自己去预测市场,也无法忍受那些“擅长”预测的人,尤其是在市场趋势出现之后发表马后炮观点的合伙人。他把这种看法称作“偏见”

2. 基本原则二:投资“深度价值”

投资不看市场趋势,看什么呢?看的就是“深度价值”。这条原则也就是著名的“价值投资原则”。

作者认为,巴菲特所谓的“深度价值”,就是那些产品过硬、经营有方,但是又很不起眼的公司。一旦发现这样的公司,他就会开始比较这个公司的实际资产和市场估值。如果市场估值过低,那巴菲特就会毫不犹豫地出手,买那个公司的股票。

巴菲特曾经说过:“我们买卖股票,不是基于对市场前景的看法,而是要基于对一个公司前景的看法。”

比如有一次,巴菲特发现了一家默默无闻的公司,名叫“桑伯恩地图”。这家公司做的事情就是给美国的每个城市画地图,而且他们的地图可以精确到每栋楼。巴菲特认为当时的市场严重低估了这个公司的价值,所以他就大量买进这家公司的股票,最后大赚了一笔。

在2020年度致股东公开信中,巴菲特讲到了什么样的企业才值得收购。他提出了三条标准:

第一,该企业的净有形资本必须取得良好回报。

第二,该企业必须由能干而诚实的管理者管理。

第三,该企业必须以合理的价格买到。

在现实中,符合这三个要求的大型收购机会很少。不过巴菲特觉得这也没关系,他宁愿等待好的机会,也不会对不好的机会出手。

他曾经说过这么一句话:“只有面对真正的好球时,我才会挥杆打一球”。

3. 基本原则三:放长线,钓大鱼

作者告诉我们,在衡量公司业绩的时候,巴菲特从来不关心短期结果。他认为,三年是衡量一个公司业绩的“最短期限”,他曾经建议投资人,最少要关注一个公司最近五年的业绩。

那么,巴菲特手下的伯克希尔-哈撒韦公司的长期情况又是如何呢?根据最新的财务报告,从1965年到2019年,伯克希尔-哈撒韦公司每股市值的复合年增长率为20.3%,是“标普500”增长率的2倍多。

如果在把这个“长期”的时间延长,从1964年到2019年,伯克希尔-哈撒韦公司的市值增长率是的2744062%,也就是增长了27440倍多,这个数字十分令人吃惊。

在2020年度致股东公开信中,巴菲特再次说明“放长线、钓大鱼”原则的好处:它不仅有利于增加成功投资带来的收益,也有利于减少失败投资带来的问题。随着时间的流逝,一些错误的、失败的投资,可以被“治愈”。

4. 基本原则四:业绩的好坏,要知道跟谁比

巴菲特很早就说过:业绩是相对的。相对的意思,就是有合适的比较对象。

那个用来比较的标杆,就是可以看成“风向标”的美股几大指数,比如道琼斯指数、标准普尔500指数等。

作者告诉我们,巴菲特曾经视道琼斯指数为标杆,并以跑赢道琼斯指数为目标

如果某一年道琼斯指数下跌了10%,而他的投资只跌了5%,他就认为自己获得了胜利;反过来,如果某一年道琼斯上扬了25%,而他的投资只增长了20%,他就觉得自己失败了,坚决不会为此庆祝。

5. 基本原则五:复利

巴菲特在给合伙人讲解投资基础时,总会谈到他最喜欢的概念:复利收益。他画过一张“蓝图”,告诉合伙人金钱增长的速度是多么惊人:

“假设投资10万美元,年收益是4%,那么10年后你会得到148024美元;按照同样的收益率,30年之后,这个数字会飙升至324337美元。如果把收益率增加到16%,那么10万美元在30年后将增加到850万美元。”

反过来,巴菲特也曾经告诉合伙人,费用、税收等其他被忽略的因素,可能会让财富大幅缩水。

总而言之:微小的变量在长期也能带来巨大的变化

 

1.下载并安装

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.5.2.deb \ && sudo dpkg -i minikube_1.5.2.deb

2.查看是否支持虚拟化

egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no

3.启动minikebe,需要网络下载

1)本地运行

sudo minikube start --vm-driver=none 2)使用vbox运行(不能使用root用户,vbox非不能用root)
minikube start --vm-driver=virtualbox 3)设置默认运行环境
sudo minikube config set vm-driver none
or
minikube config set vm-driver virtualbox

4)国内网络限制,使用aliyun的资源
minikube start --vm-driver=virtualbox --image-mirror-country=cn 
?  Ubuntu 18.04 上的 minikube v1.5.2
?  Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.
?  Starting existing virtualbox VM for "minikube" ...
⌛  Waiting for the host to be provisioned ...
⚠️  VM is unable to access k8s.gcr.io, you may need to configure a proxy or set --image-repository
?  正在 Docker '18.09.9' 中准备 Kubernetes v1.16.2…
?  Relaunching Kubernetes using kubeadm ... 
⌛  Waiting for: apiserver
?  完成!kubectl 已经配置至 "minikube"
?  为获得最佳结果,请安装 kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl/
4.查看状态minikube,连接ssh
key1088@key1088-Vostro-3459:~$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

key1088@key1088-Vostro-3459:~$ minikube ssh _ _ _ _ ( ) ( ) ___ ___ (_) ___ (_)| |/') _ _ | |_ __ /' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\ | ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/ (_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ exit

5.启动dashboard
添加PATH变量
export PATH=$PATH:$HOME/.minikube/cache/v1.16.2/ minikube dashboard

参考:https://minikube.sigs.k8s.io/docs/start/linux/

 

树莓派最近开始清理清理上面的灰,玩一些东西.

录音设备使用USB摄像头集成的录音功能(N年前的老货,开始发挥余热),使用命令查询设备是否被发现.

pi@raspberrypi:~/workdir $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: CAMERA [USB2.0 PC CAMERA], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0

1.使用arecord命令进行录音记录,默认不添加-d参数,一直进行录制.(ctrl+c可以结束掉它)

pi@raspberrypi:~/workdir $ arecord -D "plughw:1,0" -r 16000 -c 1 -t wav -f S16_LE 2019102820252.wav
Recording WAVE '20191028.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
^CAborted by signal Interrupt…
arecord: pcm_read:2103: read error: Interrupted system call



2.使用audacity进行杂音取样.选中杂音段进行文件导出.(选择文件->导出音频->选择wav格式即可,保持文件名称noise.wav)





3.使用sox工具进行降噪处理.(如果没有安装使用apt-get install soxi进行安装)



先进行噪音提取码提取



sox noise.wav -n noiseprof noise.prof



根据噪音提取码进行降噪处理(0.21为系数,推荐使用0.21)



sox 20191028202528.wav new.wav noisered noise.prof 0.21



降噪后的音频对比如下,降噪还是挺明显.



如果使用MYSQL数据库,不一小心误操作,删除掉不该删除的数据,同时又没有打开BIN-LOG,怎么办呢?除了后悔没有按时备份还能怎么办??本篇带来一遍恢复数据的文档,不能完全恢复只是给一个思路
此方法只用与MyISAM引擎,同时只是实用于部分数据,如果使用delete from xxx不带where条件的删除,是没有办法恢复的,使用此方法也不能完全恢复,只会找回一些数据,总比没有什么都没有要一些吧.
还有网上很多文档说delete只是修改的索引值而不是真正的删除,这个至少我没有办法也许是版本的问题就不去深究了.
**注意:当遇到数据被误删除事,请不要立马恢复之前的备份(如果可以的),而是先把服务停掉不让其继续写数据,再把数据库的数据文件备份出来,在mysql数据目录下面,已数据库名称为目录.
**
开始操作
MyISAM的存储引擎每一个表需要三个文件,如下(XXX代表表名称):

  • XXX.frm 表结构
  • XXX.MYD 数据文件
  • XXX.MYI 索引文件

恢复数据我们只需要重点关注数据文件即可.使用16进制模式打开文件,看一下文件内容隐约能看到一些内容.
在WINDOWS下面可以用UE打开,在linux下面直接使用hexdump命令即可,命令如下:

hexdump -e '8/1 "%02X ""\t"" "' -e '8/1 "%c""\n"'  test.MYD

在打开数据文件之前,先看一下我使用的数据表结构和测试数据.

mysql> desc test;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| userid     | int(10)     | NO   | PRI | NULL    |       |
| username   | varchar(60) | NO   |     | NULL    |       |
| password   | varchar(60) | NO   |     | NULL    |       |
| lastupdate | date        | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> select * from test limit 10,10;
+--------+----------+----------+------------+
| userid | username | password | lastupdate |
+--------+----------+----------+------------+
|     13 | admin13  | passwd13 | 2017-03-11 |
|     14 | admin14  | passwd14 | 2017-03-11 |
|     15 | admin15  | passwd15 | 2017-03-11 |
|     16 | admin16  | passwd16 | 2017-03-11 |
|     17 | admin17  | passwd17 | 2017-03-11 |
|     18 | admin18  | passwd18 | 2017-03-11 |
|     19 | admin19  | passwd19 | 2017-03-11 |
|     20 | admin20  | passwd20 | 2017-03-11 |
|     21 | admin21  | passwd21 | 2017-03-11 |
|     22 | admin22  | passwd22 | 2017-03-11 |
+--------+----------+----------+------------+
10 rows in set (0.00 sec)

然后打开数据文件,截取一段16进制数据.

69 6E 31 32 08 70 61 73  in12^Hpas
73 77 64 31 32 6B C2 0F  swd12kÂ^O
01 00 19 00 0D 00 00 00  ^A^@^Y^@^M^@^@^@
07 61 64 6D 69 6E 31 33  ^Gadmin13
08 70 61 73 73 77 64 31  ^Hpasswd1
33 6B C2 0F 01 00 19 00  3kÂ^O^A^@^Y^@
0E 00 00 00 07 61 64 6D  ^N^@^@^@^Gadm
69 6E 31 34 08 70 61 73  in14^Hpas
73 77 64 31 34 6B C2 0F  swd14kÂ^O
01 00 19 00 0F 00 00 00  ^A^@^Y^@^O^@^@^@
07 61 64 6D 69 6E 31 35  ^Gadmin15
08 70 61 73 73 77 64 31  ^Hpasswd1
35 6B C2 0F 01 00 19 00  5kÂ^O^A^@^Y^@
10 00 00 00 07 61 64 6D  ^P^@^@^@^Gadm
69 6E 31 36 08 70 61 73  in16^Hpas
73 77 64 31 36 6B C2 0F  swd16kÂ^O
01 00 19 00 11 00 00 00  ^A^@^Y^@^Q^@^@^@
07 61 64 6D 69 6E 31 37  ^Gadmin17
08 70 61 73 73 77 64 31  ^Hpasswd1
37 6B C2 0F 01 00 19 00  7kÂ^O^A^@^Y^@
12 00 00 00 07 61 64 6D  ^R^@^@^@^Gadm
69 6E 31 38 08 70 61 73  in18^Hpas
73 77 64 31 38 6B C2 0F  swd18kÂ^O
01 00 19 00 13 00 00 00  ^A^@^Y^@^S^@^@^@
07 61 64 6D 69 6E 31 39  ^Gadmin19
08 70 61 73 73 77 64 31  ^Hpasswd1
39 6B C2 0F 01 00 19 00  9kÂ^O^A^@^Y^@
14 00 00 00 07 61 64 6D  ^T^@^@^@^Gadm
69 6E 32 30 08 70 61 73  in20^Hpas
73 77 64 32 30 6B C2 0F  swd20kÂ^O
01 00 19 00 15 00 00 00  ^A^@^Y^@^U^@^@^@
07 61 64 6D 69 6E 32 31  ^Gadmin21
08 70 61 73 73 77 64 32  ^Hpasswd2
31 6B C2 0F 01 00 19 00  1kÂ^O^A^@^Y^@
16 00 00 00 07 61 64 6D  ^V^@^@^@^Gadm
69 6E 32 32 08 70 61 73  in22^Hpas
73 77 64 32 32 6B C2 0F  swd22kÂ^O
01 00 19 00 17 00 00 00  ^A^@^Y^@^W^@^@^@
07 61 64 6D 69 6E 32 33  ^Gadmin23
08 70 61 73 73 77 64 32  ^Hpasswd2

userid=13的明细对应着一下16进制数据快.

01 00 19 00 0D 00 00 00  ^A^@^Y^@^M^@^@^@
07 61 64 6D 69 6E 31 33  ^Gadmin13
08 70 61 73 73 77 64 31  ^Hpasswd1
33 6B C2 0F

简单解析一下这些数据结构的意思.

  • 01 00 19 00 :这里是4位数据头,不代表头就是4为,这个数据头不固定
  • 0D 00 00 00 :为userid的值13,int占4位.
  • 07 61 64 6D 69 6E 31 33 :07代表长度 后面7位为数据,varchar数据这样表示.
  • 08 70 61 73 73 77 64 31 33 :varchar和上面一样.
  • 6B C2 0F :为date类型,占位为3.值为2017,计算方法是"day + month32 + year16*32'"
  • 具体其他数据字段长度和结构可以详见MYSQL官方文档
    https://dev.mysql.com/doc/internals/en/myisam-column-attributes.html

咱们删除一条数据看一下数据快的变化:

mysql> delete from test where userid = 13;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test limit 9,10;
+--------+----------+----------+------------+
| userid | username | password | lastupdate |
+--------+----------+----------+------------+
|     12 | admin12  | passwd12 | 2017-03-11 |
|     14 | admin14  | passwd14 | 2017-03-11 |
|     15 | admin15  | passwd15 | 2017-03-11 |
|     16 | admin16  | passwd16 | 2017-03-11 |
|     17 | admin17  | passwd17 | 2017-03-11 |
|     18 | admin18  | passwd18 | 2017-03-11 |
|     19 | admin19  | passwd19 | 2017-03-11 |
|     20 | admin20  | passwd20 | 2017-03-11 |
|     21 | admin21  | passwd21 | 2017-03-11 |
|     22 | admin22  | passwd22 | 2017-03-11 |
+--------+----------+----------+------------+
10 rows in set (0.00 sec)
删除后的数据块如下:
69 6E 31 32 08 70 61 73  in12^Hpas
73 77 64 31 32 6B C2 0F  swd12kÂ^O
00 00 00 1C 00 00 00 00  ^@^@^@^\^@^@^@^@
00 00 0A D4 FF FF FF FF  ^@^@Ôÿÿÿÿ
FF FF FF FF 73 77 64 31  ÿÿÿÿswd1
33 6B C2 0F 01 00 19 00  3kÂ^O^A^@^Y^@
0E 00 00 00 07 61 64 6D  ^N^@^@^@^Gadm
69 6E 31 34 08 70 61 73  in14^Hpas
73 77 64 31 34 6B C2 0F  swd14kÂ^O
01 00 19 00 0F 00 00 00  ^A^@^Y^@^O^@^@^@
07 61 64 6D 69 6E 31 35  ^Gadmin15
08 70 61 73 73 77 64 31  ^Hpasswd1
35 6B C2 0F 01 00 19 00  5kÂ^O^A^@^Y^@
10 00 00 00 07 61 64 6D  ^P^@^@^@^Gadm
69 6E 31 36 08 70 61 73  in16^Hpas
73 77 64 31 36 6B C2 0F  swd16kÂ^O
01 00 19 00 11 00 00 00  ^A^@^Y^@^Q^@^@^@
07 61 64 6D 69 6E 31 37  ^Gadmin17
08 70 61 73 73 77 64 31  ^Hpasswd1
37 6B C2 0F 01 00 19 00  7kÂ^O^A^@^Y^@
12 00 00 00 07 61 64 6D  ^R^@^@^@^Gadm

USERID=13数据块变化对比

delete后
00 00 00 1C 00 00 00 00  ^@^@^@^\^@^@^@^@
00 00 0A D4 FF FF FF FF  ^@^@Ôÿÿÿÿ
FF FF FF FF 73 77 64 31  ÿÿÿÿswd1
33 6B C2
delete前
01 00 19 00 0D 00 00 00  ^A^@^Y^@^M^@^@^@
07 61 64 6D 69 6E 31 33  ^Gadmin13
08 70 61 73 73 77 64 31  ^Hpasswd1
33 6B C2 0F
前20位被破坏了,但是后面的数据还可以,只是数据很少了,如果没有数据写入的话,还有一线恢复的生机,主要找到后面数据的对应关系才能恢复
如果是大批量的数据被删除,恢复就需要看运气了,大家还是定时做好备份和开始mysql的log-bin模式.
关于头长度和delete头长度请阅读mysql官方
https://dev.mysql.com/doc/internals/en/layout-record-storage-frame.html

关于解析test.MYD文件格式,写了一些代码希望对理解MDY文件结构有些帮助.

key1088@key1088-host:~/code/repari$ cat repariMYD.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
void writeSQL(char *filebuf,unsigned int flen);
int main(int argc, char **argv)
{
    int fd=0;
    unsigned flen = 0;
    unsigned char *filebuf = NULL;
    struct stat fsbuf;
    char    *filename = NULL;
    if ( argc < 2 ) {
        printf("repari Mysql MyISAM DataFile\n");
        printf("%s [MyISAM DATA .MYD File] \n", argv[0]);
        exit(-1);
    }
    filename = argv[1];
    if ( stat(filename,&fsbuf) == -1 ) {
        printf("open file test.MYD error,msg = %s\n", strerror(errno));
        exit(-1);
    }
    flen = fsbuf.st_size;
    printf("Read %s filesize is %u\n", argv[1], flen);
    if ( flen == 0 ) {
        printf("file is empty\n");
        exit(-1);
    }
    if( (fd=open(filename,O_RDONLY) ) == -1 ) {
        printf("open file test.MYD error,msg = %s\n", strerror(errno));
        exit(-1);
    }
    filebuf = (unsigned char *)malloc(flen*sizeof(char)+1);
    if ( filebuf == NULL ) {
        printf("malloc error,msg = %s\n", strerror(errno));
        close(fd);
        exit(-1);
    }
    read(fd,filebuf,flen);
    close(fd);
    writeSQL(filebuf,flen);
    free(filebuf);
    return 0;
}
void writeSQL(char *filebuf,unsigned int flen)
{
    char    c;
    unsigned i = 0;
    long tmplen = 0;
    unsigned char tmp[5];
    unsigned char tmpchar[255+1];
    int y,m,d;
    while ( i < flen ) {
        if ( filebuf[i] == 0x00 ) {
            i++;
        }
        printf("head=[%02x]", filebuf[i]);
        if( filebuf[i] == 0x03 ) {
            i = i + 1 + 4; /* 1 + 4head */
        } else if ( filebuf[i] == 0x01 ) {
            i = i + 1 + 3; /* 1 + 3head */
        }
        /* int 4B */
        memset(tmp,0x00,sizeof(tmp));
        if ( (i+4) >  flen ) {
            printf("\nover\n");
            return;
        }
        memcpy(tmp,filebuf + i, 4);
        /*需要倒序*/
        sprintf(tmp,"%02x%02x%02x%02x",tmp[3],tmp[2],tmp[1],tmp[0]);
        printf("[%s] %ld - ", tmp, strtol(tmp,NULL, 16));
        i = i + 4;
        /*varchar */
            /* 1位长度 */
        memset(tmp,0x00,sizeof(tmp));
        if ( (i+1) >  flen ) {
            printf("\nover\n");
            return;
        }
        memcpy(tmp,filebuf + i, 1);
        sprintf(tmp,"%02x",tmp[0]);
        tmplen = strtol(tmp,NULL,16);
        i = i + 1;
            /* DATA */
        memset(tmpchar,0x00,sizeof(tmpchar));
        if ( (i + tmplen)>  flen ) {
            printf("\nover\n");
            return;
        }
        memcpy(tmpchar,filebuf + i, tmplen);
        printf("%s - ", tmpchar);
        i = i + tmplen;
        /*varchar*/
            /* 1位长度 */
        memset(tmp,0x00,sizeof(tmp));
        if ( (i+1) >  flen ) {
            printf("\nover\n");
            return;
        }
        memcpy(tmp,filebuf + i, 1);
        sprintf(tmp,"%02x",tmp[0]);
        tmplen = strtol(tmp,NULL,16);
        i = i + 1;
            /* DATA */
        memset(tmpchar,0x00,sizeof(tmpchar));
        if ( (i+tmplen) >  flen ) {
            printf("\nover\n");
            return;
        }
        memcpy(tmpchar,filebuf + i, tmplen);
        printf("%s - ", tmpchar);
        i = i + tmplen;
        /*date 3位 */
        memset(tmp,0x00,sizeof(tmp));
        memset(tmpchar,0x00,sizeof(tmpchar));
        if( (i+3) > flen) {
            printf("\nover\n");
            return;
        }
        memcpy(tmp,filebuf + i,3);
        sprintf(tmpchar,"%02x%02x%02x",tmp[2],tmp[1],tmp[0]);
        tmplen = strtol(tmpchar,NULL,16);
        y = m = d = 0;
        y = tmplen / 32 / 16;
        m = (tmplen - (32*16*y)) / 32;
        d = tmplen - (32*16*y) - (32*m);
        printf("%d-%d-%d",y,m,d);
        i = i + 3;
        printf("\n");
    }
}
key1088@key1088-host:~/code/repari$