NOIP/NOI/IOI不同的比赛
http://www.noi.cn/articles.html?type=10 NOI的信息
https://www.zhihu.com/question/332128488?sort=created NOI与NOIP的区别
https://ac.nowcoder.com/acm/home 牛客网中关于NOI与NOIP的一些题目
https://pre.ac.nowcoder.com/acm/archive/oi-ybt/problem 信息学题目
https://ioinformatics.org/ 国际奥林匹克信息赛
https://wangchujiang.com/linux-command/ linux命令搜索
codec: sbc, aac,
playback: pcm data, alsa
bluez, bluedroid, linux TV, android TV
看sequence是否连续,看delta是否大于80ms,看frame是否小包
pcm data是否为无声数据
看是否有现场卡住,underrun
https://cloud.tencent.com/developer/article/1488607 android架构设计特点
Boot Rom, Boot loaders, Trusted Execution Environment
https://my.oschina.net/weichou/blog/1036513
C Secure Coding Rules:
SEI Cert C Coding Standard(2016 Edition)
http://gen.lib.rus.ec/search.php?req=SEI+Cert+C+Coding+Standard&lg_topic=libgen&open=0&view=simple&res=25&phrase=1&column=def
Common Programming Language issues:
1. Command Injection
2. Format String
3. buffer overflow
4. Integer Overflow
Example L3 rule: exp37 call functions withthe correct number and type
fd = open(参数1,参数2) error,应该有3个参数
Example L2 rule: exp30 Do not depend on the order of evaluation for side effects
void func(int i, int *b) {
int a = i + b[++i]; ++i的行为,如果存在顺序不一致;会出问题;
printf("%d, %d", a, i);
}
改法
void func(int i, int *b) {
int a = i + b[i+1]; ++i的行为,如果存在顺序不一致;会出问题;
++i;
printf("%d, %d", a, i);
}
Example L1 rule : exp34, Do not dereference null pointers
void func(int i, const char *b) {
char *buf;
buf = (char *)malloc(i); malloc返回为空,或长度i为0;将有问题
memcpy(buf, b, i);
}
改法
void func(int i, const char *b) {
char *buf;
buf = (char *)malloc(i);
if(buf == NULL || b == NULL) {
/*Handle error*/
}
memcpy(buf, b, i);
}
ftrace的使用,主要是非tv平台;a2dp的卡顿,使用ftrace分析Underrun的原因是cpu loading过高,stp_dump3的进程占用的。
gdb工具,valgrid工具,coverity代码检查
查看Scratch的源代码 - 开放百科 - 灰狐
https://wiki.huihoo.com/wiki/?title=Scratch&action=edit
【Android】pcm音频数据调节音量大小 - 简书
https://www.jianshu.com/p/50c697bec409
PCM音频数据调整音量 - 简书
https://www.jianshu.com/p/ca2cb00418a7
关于 单凯
https://kaikai-sk.github.io/about_me.html
手机做src连接sink设备,调节音量的2种方式:
1.手机支持absolute volume,传音量;sink设置音量
2. 手机传给sink设备的pcm data保护音频audio振幅,
在线查看android 源代码
http://androidxref.com/9.0.0_r3/xref/system/bt/
/system/bt/ 如果需要porting linux的代码在这个路径下,该如何做?
场景化与抽象化:涉及的主体与角色,交互过程,子过程,message;
虚拟世界(编程)->现实世界(人的互动),软件中(分层)-硬件中(分层)-现实世界中(人分层)
github开源项目40个_weixin_30650859的博客-CSDN博客
https://blog.csdn.net/weixin_30650859/article/details/99386240
软件中不同模块的通信(message),现实世界中的message(手语,手势,视频,音频,文字)
软件中难以表示“模糊概念”,现实世界可以“冗余,模糊”;软件生成软件(根据rule规则),现实中编程(“模糊”规则)
软件中如何表示模糊规则?
映射关系:文字->语音,文字->图片,视频=图片+文字+语音
http://www.wowotech.net/tag/porting porting技术,一套代码在不同平台下的适用性;
设计模式
https://www.cnblogs.com/amanlikethis/p/4843266.html
linux文件I/O缓存思想:
- 速度与效率考虑,系统I/O(内核)与标准C库函数,在操作磁盘文件是对数据进行缓存
- 那些技术可以屏蔽或者影响缓存?那些场景需要用到这些技术?
- 用户空间与kernel空间,read()与write()函数,内核缓存区,缓存区flush,什么时候?
跨平台yocto, linux,android
https://github.com/Mr-YangCheng/ForAndroidInterview 面试
https://github.com/sonuauti/Android-Web-Server 简单web server
https://github.com/leesk8012/AndroidConnections Android connections (Bluetooth, TCP/IP, USB)
https://github.com/kingspp/Android-TCP-IP-Socket This repository consists of basic introduction for Server-Client model using Android Wifi Hotspot, which uses TCP/IP model using Primary Sockets
https://github.com/wzbos/Android-NDK-Socket 基于TCP/IP在NDK下的SOCKET通信示例
https://github.com/saminiir/level-ip A hacker's userspace TCP/IP stack
https://github.com/liexusong/tcp-ip-stack linux的tcp/ip
https://github.com/webpro/programming-principles 以java为例的编程思想,扩展应用到C,C++ https://github.com/iluwatar/java-design-patterns https://java-design-patterns.com/
https://github.com/faif/python-patterns
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html
https://blog.csdn.net/weixin_42093428/article/details/83187114 wifi的流程
https://github.com/search?l=C&q=modular+design&type=Repositories https://github.com/me115/design_patterns C++版本
https://github.com/ChanceMaker/Senior_Design_Project 这个团队正在开发的语音识别系统已经完全自主实施和培训。这是非常有利的机器学习应用程序。使用某些机器学习技术,可以准确,快速地完成每个单词的严格编程
https://github.com/MarcoFlo/Optimal-Database-Design-Problem/blob/master/solver.c 简单的优化算法
https://github.com/yashdivecha/Design-and-Analysis-of-Algorithm https://github.com/Benjarit/Algorithm_Design_and_Programming
内核和操作系统设计的基本思想和方法。 https://github.com/mnxx/operating-systems-development-project/blob/master/processus.c
https://github.com/garciad16/CIS-2750-ICalendar-App
https://github.com/SuriZhang/TCP-Chatroom 简单tcp
https://github.com/SzymonKatra/FATNode_FileSystem 简易文件系统fat
https://github.com/Ji-Keyu/Simple-Shell IPC通信模拟
https://github.com/shachijun/merge-sort-csv-file-with-connecting-two-machines linux简单编程例子
https://github.com/nearc/pascal_compiler 简单编译器
https://github.com/gatieme/LDD-LinuxDeviceDrivers linux驱动
https://github.com/doxygen/doxygen/tree/master/src doxygen源代码
https://github.com/tesseract-ocr/tesseract/tree/master/src tesseract代码,包含lstm
https://github.com/notepad-plus-plus/notepad-plus-plus notepad++源代码
https://www.jianshu.com/p/2d4d91129ddb 十二个值得一读的源码
http://www.androidchina.net/5563.html 游戏代码看
APR(Apache Portable Runtime)
这是由 Apache 社区维护的 C 开源库,主要提供操作系统相关的功能(文件系统、进程、线程、用户、IPC)。此外还提供了一些网络相关的功能。
APR 原先是 Apache Web 服务器的一个组成部分,后来独立出来,成为一个单独的开源项目。
主页:https://apr.apache.org
https://blog.csdn.net/ranxiaoxu123/article/details/52003376 值得看的代码 https://github.com/steveLauwh/SGI-STL
https://blog.csdn.net/a110658684/article/details/78862253 代码
linux中编程思想:分层,隔离,linux io性能调优;调度算法
https://www.ituring.com.cn/book/800 Linux/Unix设计思想
https://cloud.tencent.com/developer/information/linux%E8%AE%BE%E8%AE%A1%E6%80%9D%E6%83%B3 一些经典的设计; linux;
状态机,MVC,IPC,不同的通信模型,事件分发算法;
跨语言的调用思想:C语言调用C++的,C++调用C的;C语言调用java的,C++调用java的;java调用C与C++;C调用python,python调用C;matlab与C++的互相调用
从C端到B端,我的设计思考及感受 https://www.jianshu.com/p/e673d7eb0047
professional c with modular design method C高级编程:基于模块化设计思想的C语言开发
C高级编程:基于模块化设计思想的C语言开发
怎么从本质上理解面向对象的编程思想? https://www.zhihu.com/question/305042684/answer/550196442
linux设计中强调了一个基本观点:
机制和策略的分离
机制: 做某样事情固定的步骤,方法
策略:每一个步骤采用不同的方法
机制是固定的,策略往往是不固定的。在linux内核中不应该实现策略
e.g1:
Linux提供api可以让线程优先级调高调低,linux内核本身并不管谁高谁低,提供api属于机制,谁高谁低属于策略。
也就是说, 由应用程序告诉内核,那个进程拥有更高的优先级,而内核本身不负责这些事情。
e.g2:
在linux2.4所使用的设备文件系统devfs(位与内核空间),在linux2.6引入udev(用户空间设备管理)。
单一职责原则
单一职责原则(Single responsibility principle),就一个类而言,应该只有一个引起它变化的原因。
在实际编程中的体现,比如一个类只是某一个事物相关的集合,一个函数只做一件事情,不要在这个函数中编写一些不想关的逻辑,这样可以最大程度的提高程序的可维护性,可复用性。
开放-封闭原则
开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改,即对扩展是开放的,对修改是关闭的。新的需求,应该通过增加新的代码来完成,而不是修改现有的代码。绝对的对修改关闭是不可能的,可以预先猜测最有可能发生的变化种类,然后构造抽象来隔离那些变化。
在实际编程中的体现,比如接手了一个复杂的代码库,要基于此完成某种功能时,如果一上手就咔咔咔大改里面的逻辑,不仅不是正确的做法,有时越改越深入,如果不完全理解这个代码库的大部分逻辑,就不能完成当前的需求,耽误了很长时间,老大肯定会不开心的^_^。
依赖倒置原则
1. 高层模块不应该依赖底层模块。两个都应该依赖抽象;
2. 抽象不应该依赖细节。细节应该依赖抽象。
开发程序时,高层模块调用底层模块的函数。当要做新项目时,发现高层模块基本一致,想要复用,但是要换用不同的数据库或者存储方式(底层模块),而高层模块与底层访问数据库的模块绑定了,无法复用,这就出现了倒置。解决办法是不管高层模块还是底层模块,都应该依赖抽象,具体一点就是接口和抽象类。
在实际生活当中的应用,比如计算机的主板、CPU、内存、硬盘等都是针对接口设计的,如果针对实现来设计,比如某一个型号的主板只支持某一个型号的CPU,这将会大大制约计算机的发展。在实际编程中的应用,比如,一个部门写了一个lib,其他部门都要使用,那么这些部门就应该相互沟通好,大家先把接口固定,然后各自编写自己的程序,只要接口设计的稳定,这些部门之间就可以自己写自己的程序,不用担心相互干扰。
里氏代换原则
子类型必须能够替换掉它们的父类型。意思是如果一个软件实体使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别,即在软件里面,把父类都替换成它的子类,程序的行为没有变化。再通俗点,如果一个方法需要父类对象作为输入,如果你提供一个子类对象,它也应该正常工作,如果它不能正常工作,那么这种写法就违反了里氏替换原则。
迪米特法则
迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要调用领一个类的某一个方法的话,可以通过第三者转发这个调用。在类的结构设计上,每一个类都应当尽量降低成员的访问权限,不需要公开的就不要公开,其根本思想是强调了类之间的松耦合。
Android架构思考:模块化、多进程 http://www.sohu.com/a/129970049_465908 路由机制;多线程
https://github.com/SpinyTech/ModularizationArchitecture
http://blog.spinytech.com/2016/12/28/android_modularization/
多进程,什么时候需要?http://blog.spinytech.com/2016/11/17/android_multiple_process_usage_scenario/
Android系统编程思想篇:建造者模式 https://www.jianshu.com/p/475027a94c5b
浅析android系统设计中的回调思想 https://blog.csdn.net/qq_31778741/article/details/85074748
Android系统编程思想篇:单例模式 https://www.jianshu.com/p/906aa5f8c7c0
http://www.imooc.com/article/257802 MVP思想; RPC思想;Service思想
看到差别:MVP与MVC的区别, https://www.cnblogs.com/hebao0514/p/5687959.html
https://www.zhihu.com/question/19759722?sort=created 大牛们是怎么阅读 Android 系统源码的?
https://www.oschina.net/question/2245602_180023
https://segmentfault.com/p/1210000008721369/read 设计模式23种思想
待解决的问题思考与描述
(不同语言c,c++,python,java 等特有的情况与通用的情况)技术使用的场景
- 通用的打开文件open函数的逻辑是怎样? (open输入:路径地址,包括绝对路径与相对路径的解析;open文件的形式)
- 一个函数功能的输入参数、输出参数是怎么确定的?
- 如何使一个函数的功能尽可能的与其他函数的功能,解耦和?减小函数的依赖性?
- 函数A的error handle怎么处理?比如函数A中使用了函数B,如果函数B失效了,怎样降低程序die的情况?
- 状态机的例子,状态机可以应用的场合有哪些?(bluetooth中a2dp的状态机,tcp、ip中的状态机,进程状态切换的状态机?)
- 字符串操作有哪些?是如何实现的?
- C中有全局变量,当函数A,B,C都需要使用这个全局变量,但是只能保证一个函数对全局变量修改,如何实现?(锁)
- 程序在其他地方调用了函数A、B、C但是期望的是执行顺序是函数ABC的顺序,如何实现?(线程同步)
- 当有多个逻辑需要and(与)、or(或)操作时,比如有逻辑1,2,3,4一起条件判断,使用什么方法可以降低代码复杂度?(位掩码技术,bit mask技术; https://www.jianshu.com/p/e159f3a506ac)https://bbs.csdn.net/topics/200055867
- parser技术用到了哪些思想与数据结构?(https://blog.csdn.net/weixin_34080571/article/details/88669757)
- 进行输入检查的方法有哪些?(正则表达式检查,字符串分割检查,)
- ring buffer的适用场景?(https://blog.csdn.net/qq_26093511/article/details/65648750 ,当读取速度大于写入速度时,在环形缓冲区的支持下不会丢掉任何一个字节(硬件问题除外)。 为什么? 因为读数据实际上没有消耗buffer,写数据要清空buffer,对buffer内容做操作)https://www.cnblogs.com/bluedoctor/p/5892726.html
- 哪些技术适用于 读> 写的操作?哪些技术使用读 < 写的操作?
- 假设程序设计分为ABCD层,从上到下有什么技术支持调用?(C语言中函数call就是);从下到上有什么技术支持回调?(C语言中callback)?跨层调用(由A调到C,有什么技术?由C到A,有什么技术?)。对于不同的语言,其实现特点有什么区别?
- 处理器1,2,3希望交互流程为处理器1 -> 2,2->3,什么技术可以实现?
- 对于单核的设备,线程1,线程2,线程3,线程4异步执行;对于4核设备,线程异步执行,技术差异?
- 同步与异步,有哪些技术?阻塞技术会导致什么问题?
考试:高中教师资格证考试,研究生考试(信号与系统),计算机等级考试,软件设计师考试,高级设计师考试,公务员考试,高考
蓝牙工程师需要的能力:
1. 蓝牙Spec,在https://www.bluetooth.com/ 中注册,下载pdf的spec,不同profile:a2dp, avrcp, hid, hogp等
2. 蓝牙测试pts,参考 https://launchstudio.bluetooth.com/
https://www.bluetooth.com/specifications/qualification-test-requirements/ 这里测试的场景与不同profile的子过程
通过pts的pdf了解profile的过程,以a2dp为例;看src,sink情况,不同的过程对应的bluedroid stack的代码;
不同profile的pts测试过程不同;如何通过HCI log,查看pts测试过程是否正确?
3. HCI log的查看,HCI log分为:正常的HCI log,PTS测试的HCI log; PTS的HCI log可以查看PTS测试哪里出了问题
正常的HCI log,可以看本机设备与对端设备交互流程是否正常
4. 蓝牙stack的移植,code porting;将一包bluedroid的code,根据实际功能需求,移植到不同的嵌入式设备;不同profile的裁剪,新的HCI command加入要怎么加入;HCI command测试的结果怎么量化?
5. 蓝牙架构的设计,app层->bt mw层->bt stack层->driver层,每一层的变动;app层实现哪些功能?bt mw层实现哪些功能?
bt stack层? 不同层的扩展功能怎么扩展? bt stack层可以分层,btif层,bta层,l2c层等等?
6. 蓝牙可移植性的分布研究,一个基本的bt程序,需要包含哪些部分?(app代码对应了bin文件,bt mw层,bt stack层对应了哪些.so? drvier层对应了什么.ko?)如果需要再蓝牙app中添加一个功能,哪些部分需要改动?功能正确性验证如何保证?
7. 蓝牙功能测试方式,app功能测试正常,bt mw层测试正常,bt stack层测试正常,driver层测试正确,不同层的测试逻辑是什么?如何写这些测试用例?
8. 解决bug,对bug的分析;通过对log的分析,定位问题点;从正常流程的分析,找到异常点;
不同profile的流程不同;以a2dp为例,蓝牙播放音乐,正常的流程是什么样子?
9. linux编程:多线程试用在哪些场景?window下多线程与linux下多线程的异同?
socket使用场景?回调函数使用场景?同步调用与异步调用的场景?
10. linux脚本,linux的编译技术,linux的makefile写法: