续上一篇随笔:https://www.cnblogs.com/kingstarer/p/11355612.html《工作碰上的技术问题及处理经验》(三)
我这人记忆力比较差,经常出现有些知识学了不久后就忘了,或者有些问题花了很多时间百度解决后,再过一段时间碰上时只有模糊印象,却忘了具体解决方法。
最近几年工作时我开始有意识地把登记每天工作碰上的技术问题做个简单笔记。
一般上班时间比较忙,只能草草记了一两句话。等过一段时间,我会把这个笔记整理一下,把问题和处理经验整理通顺,以加深自己的印象。
20180721: gprof 可以打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗时最多的函数。 20180723: 字符集和字符编码的关系:字符集是指字符的集合,也就是一些图形的集合,在字符集里面每个图形会有一个整数值编码。比较常见的是Unicode字符集。虽然为每个字符分配了一个唯一的整数值,但具体怎么用字节来表示每个字符,是由字符编码决定的。字符编码有GBK ASCII UTF8。相同的字节序列使用不同的字符编码解析,会得到不同的字符表整数序列,从而显示出不同字符。因为文件信息里面没有编码这个属性,所以编辑器在读取文件时先要猜测文件的编码方法。如果保存时编码与读取时用的编码不一样,就会出现乱码。 20180802: crontab里面设置MAILTO=""可以避免脚本出错时产生邮件。(如果不然,时间久了会消耗尽/var下面的inode节点空间) 查看哪个目录(不包含子目录)下文件数最多 find . -type d | awk '{print "echo $(ls " $0 "|wc -l) " $0}' | sh | sort -n | tail 查看哪个目录(包含子目录)下文件数最多 find . -type d | awk '{print "echo $(ls -R " $0 "|wc -l) " $0}' | sh | sort -n | tail 20180803: 今天找到sqlplus按退格符不删除字符,而只是显示^H的解决方法。有两种方法,试过都有效: 1 使用stty erase ^H,把删除字符按键改为退格键。 2 修改SecureCRT会话选项,找到Terminal->Mapped Keys选项卡,钩选"Other mappings"分组下面两个选项改成一个打钩,另一个不打钩即可。(我是打钩了"Backspace send delete") 顺便总结一下SecureCRT其它使用技巧吧: a Terminal->Emulation 把Scrollback buffer改大点,这样可以看到更多的历史输出 b 如果服务器使用UTF-8字符编码,需要在Terminal->appearance把"Character encoding"改为UTF-8才能正常显示中文。 c 在Connection->Logon Actions选项卡可以设置终端登录后自动执行的操作。(如果需要比较复杂的自动登录功能,还可以使用vbs脚本。设置在登录时自动执行vbs。vbs脚本可以使用Script->Start Recoding Script根据鼠标键盘操作生成脚本。) d terminal->Log File选项卡可以设置把操作日志自动输出到日志文件。 e View->Chat Window可以打开文本输入框,可以在文本框写好脚本命令后一次执行(可以使用鼠标辅助编辑) f View->Button Bar可以打开一个按钮窗口,把常用命令写在一个按钮里面,需要时点击按钮即可自动输出 g 如果一次打开多个终端,想同时执行一个命令,可以使用交谈窗口(View->Chat Window)编辑好命令,然后右键钩先“Send Chat to All Tabs”,再发送 h 如果打算执行临时记录比较关键的操作日志,可以使用File->Log Session功能,可以把操作过程屏幕输出到指定文件 i Options->Global options可以设置“选中文字自动复制”“右(中)键自动粘贴”功能 j 有时候不小心用cat输出二进制文件后,屏幕会出现花屏。这里使用Edit->Reset就好了。或者使用echo -e 'xf' (原理是ascii码14会让屏幕花屏,15可让屏幕恢复正常) k 如果需要往服务器输入大量文本(剪贴板都无法容纳),可以先把文本保存到文件。使用Transfer->Send ASCII选择发送文件。 l 有些服务器设置间隔多长时间不操作就会自动断开连接,可以在设置Session options->terminal选项卡里面"Anti-idle"设置间隔多少秒自动发送字符。(一般是发空格)或者在离开时执行命令while [ 1 ]; do echo; sleep 1; done(可以配置在Button Bar里面的快捷按钮) m 如果终端输出字符不满屏,可以考虑是否Session options->terminal->emulation->Size设置的终端高度和宽度太小。如果不是,看看stty命令设置是否有问题。 n 如果使用ls --color=auto输出的内容没有彩色,可能是终端类型设置的问题。 o 打开多个终端操作时,可以使用锁屏功能防止来回切换时误操作比较重要的终端,ctrl+s锁屏 ctrl+q解锁 p 使用ssh2连接服务器时,可以在终端选项卡右击选择"Connect SFTP Tab"快速打开sftp功能上传或下载文件。 q secureCRT可以配置端口转发功能,需要使用ssh2连接的服务器才可以用。配置路径:Session options->Connection->PortForwarding 20180807: 今天发现有些同事不知道这两个shell脚本运行技巧: sh -x 调试运行 sh -n 检查脚本是否有语法错误 awk需要从屏幕读取信息时可以使用:getline < "-",用户输入会保存在$0 20180808: 今天给同事们准备培训ppt时,我在一个页面里面放了很多元素,通过动画控制出现顺序。 但发现这样放的元素太多了页面很混乱,不好编辑。后来发现可以暂时隐藏一些暂时不关心的素材,这样编辑起来方便很多。 方法:格式->选择窗格->关闭需要隐藏的元素右边的眼睛 20180810: 今天完成gcc在32位win系统编译 20180814: 今天发现atof("1F01F00000.01")得到的值是1.000000,想来是碰到第一个非数字的字符就返回了 20180815: excel默认筛选数据时碰上空行就会停止,不进行空行后面的数据行的筛选。 如果要忽略空行先全选,再进行数据筛选。 excel 分列第三步可以选中不同列设置数据类型 20180816: vs2010默认if/else语句块是不能大纲折叠的,需要修改设置 工具->选项->文本编辑器->C/C++->格式设置->大纲语句块 把False改为True 20170817: 今天发现source insight居然更新了,出了source insight 4,对中文支持比较好,而且默认文件编码变成utf-8。 之前一直苦恼,现在项目源码是utf-8,用source insight看比较累。 不过用4麻烦的是gbk编码默认显示是乱码,要手动选择编码重新加载。 20180824: oracle允许在线重建索引增加online选项,对于频繁访问的表进行索引重建可以考虑使用这个特性。 20180907: 今天碰到两个问题:1 对一个sql做逻辑等价修改后执行计划发生比较大变化,导致效率慢很多。 我们项目原来有一个交易使用的sql里面有类似这样的逻辑:where tran_id in ('T1', 'T2', ..., 'TN') 最近为了让这个sql显示更灵活,我们建了一个表,把in子句里面的id全放到表里面,然后把sql改成这样where tran_id in (select tran_id from tbl_tran_inf) 结果上线后发现原来只需要运行2秒的sql突然变成60秒。后来查了一下发现是新的sql的tran_id没使用索引。‘ 这个是一个值得注意的教训,尽管改造前后sql逻辑结果是一样的,但效率却差不少,以后要关注这种非功能变化。 问题2: 我们项目中出现了bug,导致把一些交易的返回报文发给了错误的前端socket。幸好我们每个交易有一个跟踪号,前端系统发现收到的返回报文跟踪号与发出的不一样,抛弃了交易。 做异步程序时要多注意报文错乱的问题。 20180909: 今天打开一个之前保存在本地的csden博客网页,打开一会后总是会自动跳转到csdn首页。不得以只能关了js。 网上找了fireforx关闭js的方法:在火狐地址栏输入:about:config。搜索javascript.enabled,然后双击该栏,把值变为false即可 20180910: 使用ssh做端口转发的命令例子: ssh -L 33019:10.153.198.92:33016 hg@132.97.190.157 -N 20180911: 今天在A_SVN_SRV服务器搭建了svn服务,想在B_SVN_CLIENT服务器上访问(两台都是linux)。不过A_SVN_SRV与B_SVN_CLIENT直连不了。 幸好有win主机C,可以通过ssh分别访问A_SVN_SRV与B(但a与b不能访问c,只能单向访问)。于是尝试通过secureCRT来做ssh端口转发实现服务互转。 配置如下: 首先,建session A,通过ssh连接服务器A_SVN_SRV。在session options->PortForwarding添加一条映射规则。 Local端口填3691,Remote端口填36901。这样就实现了将主机A_SVN_SRV的3690端口映射到主机C的36901端口。 访问C的36901端口就等于访问了A_SVN_SRV的3690端口。 接着,建Session B,通过ssh连接服务器B_SVN_CLIENT。在session options->PortForwarding->Remote/X11添加一条映射规则。 Remote端口填3690,Local端口填36901。这样就实现了将主机C的36901端口映射到主机B_SVN_CLIENT的端口3690端口。 B_SVN_CLIENT服务器上访问本机3690端口就等于访问了C的36910端口。 今天在win上用gcc编译代码时碰上一个问题:有一个.c文件编译总是失败,gcc运行到一半会自动退出,报错“MapViewOfFileEx:尝试访问无效地址”。 编译其它.c没问题,就这个总是报错。于是尝试用#if 0屏蔽部分代码再编译,逐步缩小编译代码范围。最终确定是由于包含了某个头文件时出现问题。并且把这个头文件名字改一下,编译也能通过。 怀疑是由于有重名头文件导致的。到硬盘找了一下,发现这个头文件在目录里面有一个对应的.gch文件,删了再重新编译就好了。 20180912: windows下的批处理脚本,可以使用start /b把一个命令在后台启动运行,如start /b dir 20180913: 今天听一个网友介绍greenplum分布式数据库,号称可以通过增加机器线性增加数据库性能。有机会要试试真假。 vs 离线安装扩展:把其它机的扩展文件复制到C:UsersAndrewAppDataLocalMicrosoftVisualStudio10.0Extensions 然后在扩展管理器就可以看到,启用即可 20180918: 今天从一台机复制svn到另一台机后,启动时总报找不到对应的.so,但我的so也有复制过来的。 即使我修改了ld_library_path也无效。 后来上网找了资料,使用readlef -d查看程序,发现里面指定了rpath。把so放到rpath指定的路径再启动就好了。 20180919: 分布式系统不同组件之前处理同一个业务超时时间要符合漏斗原则。 今天写一个头文件,在最后面的#endif 后没加回车,导致其它cpp文件引用它后编译报奇怪的错误,查了好一会。 今天编译安装svn服务器,中间make过程耗时很长。后来发现使用make -j 4启动四个进程同时编译,速度快不少。 20180928: 番茄vs助手终于安装好。今年年初由于进了新项目,不能在自己本地写代码,需要到云桌面上开发。云桌面c:/program file是受限的,没法自行安装程序。 开始时跟着原来的团队一样,使用source insight 3开发代码,一段时间后觉得特不好用,最受不了的是它对utf8中文支持不好。 后来偶然发现原来云桌面上默认安装了vs2010,于是尝试使用vs2010写代码,但是没vc助手还是不习惯。而且项目里面的代码还有很多gcc语法特性, 没法在vs上编译。后来发现在vs上可以使用gcc编译,写起代码就方便多了。但是没有vs写代码还是不方便。 偶然机会,让我发现原来云桌面上默认安装了一个旧版本的vc助手,但可惜过了注册时间,所以不可用。于是上网找方法破解(正版要上千块钱,舍不得买) 但这些破解版都需要替换安装目录下面一个dll文件,而我们开发环境没权限修改。 在网上找了好久,最后终于发现有一个工具叫trial-Reset,它可以在注册表删除vs助手的使用信息,这样就不会过期了。 20181010: 今天一个同事找过来,说我们提供的sql逻辑有问题,他们在程序里面运行出现ora-24347错误。原在很容易找出来,是因为sum了空值记录。但我查了一下代码,发现我们程序用的是同样的逻辑,居然没报错。 后来仔细分析了一下,发现这个“聚合函数出现空值”并不是一个oracle错误,而只是警告。java认为这种警告是异常而我们写的c程序没处理警告,所以没出现异常。 类似的情况还有密码快过期的警告,java程序登录数据库时会因为这个警告而导致登录失败,而使用sqlplus则不会出错。 20181011: 今天一个同事让我看一个问题:他有一个proc脚本,在plsql developer编译是正常的,但是传到服务器上编译后运行就会出现异常。 我后来发现在来是他脚本里面有中文,在plsql developer运行时编码选对了,所以编译通过。但在服务器上NLS_LANG设置错了,导致服务器编译脚本时出异常。 20181012: 今天发现gcc支持%.*s格式化输出,这对于打印没'