美国最大的论坛 Reddit,最近有一个热帖。
一个程序员说自己喝醉了,软件工程师已经当了10年,心里有好多话想说,”我可能会后悔今天说了这些话。”
他洋洋洒洒写了一大堆,获得9700多个赞。内容很有意思,值得一读,下面是节选。
加粗部分,我比较认同。
(1)职业发展的最好方法是换公司。
(2)技术栈不重要。技术领域有大约 10-20 条核心原则,重要的是这些原则,技术栈只是落实它们的方法。你如果不熟悉某个技术栈,不需要过度担心。
(3)工作和人际关系是两回事。有一些公司,我交到了好朋友,但是工作得并不开心;另一些公司,我没有与任何同事建立友谊,但是工作得很开心。
(4)我总是对经理实话实说。怕什么?他开除我?我会在两周内找到一份新工作。
(5)如果一家公司的工程师超过 100 人,它的期权可能在未来十年内变得很有价值。对于工程师人数很少的公司,期权一般都是毫无价值。
(6)好的代码是初级工程师可以理解的代码。伟大的代码可以被第一年的 CS 专业的新生理解。
(7)作为一名工程师,最被低估的技能是记录。说真的,如果有人可以教我怎么写文档,我会付钱,也许是 1000 美元。
(8)网上的口水战,几乎都无关紧要,别去参与。
(9)如果我发现自己是公司里面最厉害的工程师,那就该离开了。
(10)我们应该雇佣更多的实习生,他们很棒。那些精力充沛的小家伙用他们的想法乱搞。如果他们公开质疑或批评某事,那就更好了。我喜欢实习生。
(11)技术栈很重要。如果你使用 Python 或 C++ 语言,就会忍不住想做一些非常不同的事情。因为某些工具确实擅长某些工作。
(12)如果你不确定自己想做什么东西,请使用 Java。这是一种糟糕的编程语言,但几乎无所不能。
(13)对于初学者来说,最赚钱的编程语言是 SQL,干翻所有其他语言。你只了解 SQL 而不会做其他事情,照样赚钱。人力资源专家的年薪?也许5万美元。懂 SQL 的人力资源专家?9万美元。
(14)测试很重要,但 TDD (测试驱动的开发)几乎变成了一个邪教。
(15) 政府单位很轻松,但并不像人们说的那样好。对于职业生涯早期到中期的工程师,12 万美元的年薪 + 各种福利 + 养老金听起来不错,但是你将被禁锢在深奥的专用工具里面,离开政府单位以后,这些知识就没用了。我非常尊重政府工作人员,但说真的,这些地方的工程师,年龄中位数在 50 岁以上是有原因的。
(16)再倒一杯酒。
(17)大多数头衔都无关紧要,随便什么公司都可以有首席工程师。
(18)手腕和背部的健康问题可不是开玩笑的,好的设备值得花钱。
(19)当一个软件工程师,最好的事情是什么?你可以结识很多想法相同的人,大家互相交流,不一定有相同的兴趣,但是对方会用跟你相同的方式思考问题,这很酷。
(20)有些技术太流行,我不得不用它。我心里就会很讨厌这种技术,但会把它推荐给客户,比如我恨 Jenkins,但把它推荐给新客户,我不觉得做错了。
(21)成为一名优秀的工程师意味着了解最佳实践,成为高级工程师意味着知道何时打破最佳实践。
(22)发生事故时,如果周围的人试图将责任归咎于外部错误或底层服务中断,那么是时候离开这家公司,继续前进了。
(23)我遇到的最好的领导,同意我的一部分观点,同时耐心跟我解释,为什么不同意我的另一部分观点。我正在努力成为像他们一样的人。
(24)算法和数据结构确实重要,但不应该无限夸大,尤其是面试的时候。我没见过药剂师面试时,还要测试有机化学的细节。这个行业的面试过程有时候很糟糕。
(25)做自己喜欢的事情并不重要,不要让我做讨厌的事情更重要。
(26)越接近产品,就越接近推动收入增长。无论工作的技术性如何,只要它接近产品,我都感到越有价值。
(27)即使我平时用 Windows 工作,Linux 也很重要。为什么?因为服务器是 Linux 系统,你最终在 Linux 系统上工作。
(28)人死了以后,你想让代码成为你的遗产吗?如果是那样,就花很多时间在代码上面吧,因为那是你的遗产。但是,如果你像我一样,更看重与家人、朋友和生活中其他人相处的时光,而不是写的代码,那就别对它太在意。
(29)我挣的钱还不错,对此心存感激,但还是需要省钱。
(30)糟糕,我没酒了。
(完)
步骤,参考
配置目录:
——TFTP server配置工作目录:
/home/titron/tftpboot
——NFS server 配置工作目录:
/home/titron/export/rfs *(rw,sync,no_root_squash)
u-boot下,设置环境变量:
=> setenv ethaddr 2E:09:0A:03:8A:28
=> setenv ipaddr '192.168.0.3' (板子ip)
=> setenv load_run_qnx_tftp 'tftp 0x40100000 192.168.0.20:ifs-rcar_h3.bin; go 0x40100000' (服务器ip)
$ sudo gedit /etc/default/tftpd-hpa
将原来的内容为:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
#TFTP_DIRECTORY="/var/lib/tftpboot" #修改为自己需要的路径,与上面创建的目录一致
TFTP_ADDRESS="0.0.0.0:69"
#TFTP_OPTIONS="--secure" #可以通过查看mantftpd,看各种参数的意义
#修改为
TFTP_DIRECTORY="/home/shenhao/tftpboot"
TFTP_OPTIONS="-l -c -s"
在文件/etc/exports中进行定义, 将目录 /home/renesas/export/rfs 共享出来。
/home/renesas/export/rfs *(rw,sync,no_root_squash)
参看下面的修改:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/home/titron/export/rfs *(rw,sync,no_root_squash)
启动tftpserver
$ sudo service tftpd-hpa start
启动nfs server
$ sudo /etc/init.d/rpcbind restart
$ sudo /etc/init.d/nfs-kernel-server restart
# ifconfig ravb0 192.168.0.3
# fs-nfs3 192.168.0.20:/home/renesas/export/demo /demo
candleLight_fw candleLight固件还支持BUSMASTER。
注: 淘宝有人在售,100多块RMB。
【step 1】Prepare
mydroid$ export TARGET_BOARD_PLATFORM=r8a77965
mydroid$ source build/envsetup.sh
mydroid$ lunch salvator-userdebug
mydroid$ make -j3
…...
[100% 66/66] Target vbmeta image: out/target/product/salvator/vbmeta.img
#### build completed successfully (06:23 (mm:ss)) ####
【step 2】make OTA package
mydroid$ make otapackage #——会生成sd卡用的全部系统升级包
(or, mydroid$ make full_otapackage)
…...
[100% 75/75] Package OTA: out/target/product/salvator/salvator-ota-eng.dongtz.zip
…...
running: java -Xmx2048m -Djava.library.path=out/host/linux-x86/lib64 -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 /tmp/tmpqPUopK.zip out/target/product/salvator/salvator-ota-eng.dongtz.zip
done.
#### build completed successfully (06:28 (mm:ss)) ####
【step 3】Edit code
修改代码以后。
【step 4】re-make
mydroid$ make #——重新编译
mydroid$ make otapackage #——重新生产升级包
mydroid$ ./build/tools/releasetools/ota_from_target_files -i out/target/product/salvator/salvator-ota-eng.dongtz.zip out/target/product/salvator/salvator-ota-eng.dongtz.original.zip out/target/product/salvator/ota_diff_package.zip #---这里有错误发生,也许还有bug,导致不能生成差分包
Traceback (most recent call last):
File "./build/tools/releasetools/ota_from_target_files", line 1996, in <module>
main(sys.argv[1:])
File "./build/tools/releasetools/ota_from_target_files", line 1887, in main
OPTIONS.info_dict = common.LoadInfoDict(input_zip)
File "/home/dongtz/work/android/android_v530_m3n/RENESAS_RCH3M3M3N_Android_P_ReleaseNote_2019_08E/mydroid/build/make/tools/releasetools/common.py", line 169, in LoadInfoDict
raise ValueError("can't find META/misc_info.txt in input target-files")
ValueError: can't find META/misc_info.txt in input target-files
【方法1 】通过recovery实现
通过recovery升级的功能进行实现的。
Recovery提供的功能如下,使用apply update from sdcard功能即可升级OTA包。
【方法2 】通过adb实现
可以通过adbroot/adb remount/adb push指令实现,但是需要连接到电脑PC端,且支持adb才行。
$ ./adb push -p /home/m3n_imgs/salvator-ota-eng.dongtz.zip /data/update.zip
$ ./adb shell uncrypt /data/update.zip /cache/recovery/block.map #---注意:要等待一段时间,直到命令执行退出…,然后在执行如下命令;
$ ./adb shell "echo \"--update_package=@/cache/recovery/block.map\" > /cache/recovery/command"
$ ./adb reboot recovery #---注意:要多等待一段时间,直到升级完成。
......
[ 2.969568] read strings
[ 2.972384] android.hardware.health@2.0-impl: wakealarm_init: timerfd_create failed
[ 2.982487] audit: type=1400 audit(1576201012.192:7): avc: denied { wake_alarm } for pid=1400 comm="charger" capability=35 scontext=u:r:charger:s0 tcontext=u:r:charger:s0 tclass=capability2 permissive=0
[ 2.983643] healthd: battery none chg= #---这里要一直等待,不要断电,直到出现下面的log信息提示
[ 123.044678] init: Received sys.powerctl='reboot,' from pid: 1401 (/sbin/recovery)
[ 123.052392] init: Clear action queue and start shutdown trigger
[ 123.058413] init: processing action (shutdown_done) from (<Builtin Action>:0)
[ 123.065652] init: Reboot start, reason: reboot,, rebootTarget:
[ 123.071825] init: Shutdown timeout: 6000 ms
[ 123.076064] init: terminating init services
[ 123.080274] init: Sending signal 15 to service 'recovery' (pid 1401) process group...
[ 123.089378] init: Sending signal 15 to service 'charger' (pid 1400) process group...
[ 123.097858] init: Sending signal 15 to service 'tee_supplicant' (pid 1398) process group...
[ 123.106414] init: Sending signal 15 to service 'ueventd' (pid 1064) process group...
[ 126.210034] reboot: Restarting system with command ''
NOTICE: R-Car M3N Initial Program Loader(CR7)
NOTICE: Initial Program Loader (Rev.2.0.7)
NOTICE: Built : 13:05:37, Apr 1 2021
NOTICE: PRR is R-Car M3N Ver.1.1
5pin USB的概念来自于OTG(On-The-Go)标准:
ID引脚的功能用于区分是Host还是Peripheral:
USB OTG概念的引入,使得USB device既可以作为Host,又可以作为Peripheral。
电路中,3.3V regulator接收来自USB host的VBus,产生3.3V输出。
D+/D-上的15K上拉电阻用于表明device的通讯速度:
以下这两个特征是Host拥有的:
除了这些物理连接外,USB还要提供以下功能:
除了可以做Host/Peripheral这样的双角色外,OTG需要额外的电路支持两种新的协议——HNP(Host Negotiation Protocol) & SRP(Session Request Protocol)。
在OTG命名中,Host被称为A-Device,Peripheral被称为B-Device。
参考:
摄像头画面有黑条纹闪烁,这种现象称之为频闪。
频闪是一种物理光电成像现象,是一种在特定监控场景下才会出现的现象,不是摄像头损坏导致的。
摄像头默认是自动曝光+逐行曝光方式,监控环境亮度很高时,为保证画面效果,摄像机会权衡降低增益和曝光时间(快门)。
当快门降的很低的时,每一帧拍摄的画面都曝光不足,从视频上来看就表现为黑色条纹或LED闪烁现象。
形象一些说,就像你走在大太阳下(光照太强),眼睛(摄像机)会眯成一条缝(快门降低),减少光线进入(曝光量)。这样的话,太阳你是看清了,但天上飞的飞机你就看不到了(因为你眼睛眯了缝,导致飞机反射的光线进来的太少了)。就是这个道理,所以遇到问题后知其所以然,然后解决掉问题。
根本方法就是:改变摄像头的进光量,提高曝光时间。
1 、调整摄像机角度
如果监控画面中有部分区域亮度很高,其他区域亮度较低,可以尝试调整角度,减少亮区,避免画面过亮,从而提高曝光时间。
2 、设置区域补偿
区域补偿设置方法:进入摄像头的web管理页面->设置->摄像头->画面显示->区域补偿->自定义。
自定义选中画面中较暗区域进行补偿,提高曝光时间。
区域补偿后画面亮度整体会提高,建议结合改善后的实际效果进行多区域尝试和选择。
3、利用遮光纸
可以尝试给摄像头镜头前贴一个黑色遮光纸,相当于增加了一层滤片来降低摄像头的进光量,从而提高曝光时间,改善频闪现象。
手机拍照出现波纹可能是以下几个原因:
(1). 如果用手机拍摄电视、电脑等屏幕时,由于屏幕是按照一定频率刷新画面的,刷新频率(图像在屏幕上更新的速度)超过人眼感知的范围,但手机拍摄头却可以捕捉到,刷新过程中的屏幕就显示为条纹.
(2). 如果在灯光环境下拍照时,灯光由交流电供电,具有一定的闪烁频率,当灯光频率与摄像头扫描频率不匹配时,会出现水波纹现象.
(3). 如果夜景环境下拍照时,也可能因为光线过暗出现条纹,建议您适当增加周围光照.