《工作碰上的技术问题及处理经验》
Posted kingstarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《工作碰上的技术问题及处理经验》相关的知识,希望对你有一定的参考价值。
续上一篇随笔:https://www.cnblogs.com/kingstarer/p/12249028.html《工作碰上的技术问题及处理经验》(四)
我这人记忆力比较差,经常出现有些知识学了不久后就忘了,或者有些问题花了很多时间百度解决后,再过一段时间碰上时只有模糊印象,却忘了具体解决方法。
最近几年工作时我开始有意识地把登记每天工作碰上的技术问题做个简单笔记。
一般上班时间比较忙,只能草草记了一两句话。等过一段时间,我会把这个笔记整理一下,把问题和处理经验整理通顺,以加深自己的印象。
20190402: 今天碰上一个脚本文件编码与系统编码不符,导致sed运行报错的问题。我脚本里面写了一个命令sed -e ‘s/月份/月份 ${V_MONTH}/g‘ 执行时报错"sed: -e expression #1, char 21: unterminated `s‘ command" 我在执行sed之前先执行set -x,打开脚本调试模式。看到输出是sed -e "s/324302267335/324302267335 201904/g"。 这个输出说明编码是GBK,因为一个中文占了两个字节。但我系统的LANG设置为en_US.UTF-8。不相符,所以需要改一下。 20190407: 今天发现xargs命令做字符串处理还是挺方便的,以前知道用它来跟管道组合处理参数太多超过命令行限制的情况。这里摘录几个用法: 替换字符串:echo "nameXnameXnameXname" | xargs -dX 多行输入单行输出:(echo a; echo b; echo c) | xargs 组装shell命令:cat arg.txt | xargs -I {} ./sk.sh -p {} 20190408: 今天发现sourceinsight双击选中文字后会自动被修改,变成一个奇怪的问号图标。开始以为是我键盘有键被卡住了,挨个键检查了一下,没发现问题。 后来偶然发现原来我打开了金山词霸,想起以前也看过网友吐槽,词霸里面的取词和划译功能实现方法很粗暴,会不停往系统发快捷键消息。 于是尝试把金山词霸关了,果然好了。 20190409: 今天发现oracle的systimestamp类型是带时区的timestamp,需要用cast(systimestamp as timestamp)转换一下才变成不带时区的。 今天用proc*c写的程序导出数据库表数据,发现有一些字段值是NULL,但我程序没报错。理论上proc如果不用指示变量,取出空的数据时会报错的。 后来查查,发现原来我这个程序用proc*c预编译时设置了UNSAFE_NULL=yes,所以没报错。 20190410: 今天发现oracle有一个语法insert all,可以指定一条记录同时插到两个库表: insert all into t1(c1) int t2(c2) select * from t; proc*c执行dml语句时支持预编译一次,执行sql多次。不过前提是要设置选项release_cursor=no(默认是no) 今天发现proc有一个参数:prefetch,指定sql语句句柄打开后预先从数据库取出多少条记录。这个参数默认是1,批量任务可以考虑把它改大,有助于提高性能。 今天想用gcc的-Og选项编译程序,发现居然不支持。估计是我用的版本太低了。网上说-Og选项只会打开与-g不冲突的优化选项。 20190415: 今天发现cp有一个参数-p,复制时保留原文件的修改时间:cp -p old new shell清空文件的技巧 true命令: true > emptyfile 20190416: 用awk写了一个辅助宏代码对齐的脚本 # 输入宏代码,脚本会在每行后面补齐空格和 awk -v v_tab_lenth=8 ‘{ # 首先读取所有输入行 计算所有输入文本单行最大长度 v_arr_input[NR] = $0; v_str_len = length($0); v_arr_input_len[NR] = v_str_len; if (v_str_len > v_max_len) v_max_len = v_str_len; } END{ v_max_tab_cnt = int(v_max_len / v_tab_lenth) + 2; print "v_max_tab_cnt = "v_max_tab_cnt for (i = 1; i <= NR; ++i) { v_str_tab_cnt = int(v_arr_input_len[i] / v_tab_lenth); v_tab_cnt = v_max_tab_cnt - v_str_tab_cnt - 1; #if (v_str_tab_cnt * v_tab_lenth < v_arr_input_len[i]) v_tab_cnt = v_max_tab_cnt - v_str_tab_cnt - 1; #else v_tab_cnt = v_max_tab_cnt - v_str_tab_cnt; # print "v_tab_cnt = "v_tab_cnt, "v_str_tab_cnt = "v_str_tab_cnt, "v_arr_input_len[i] = " v_arr_input_len[i] printf("%s", v_arr_input[i]); for (j = 0; j < v_tab_cnt; ++j) printf(" "); print("\\"); } }‘ tmp.txt 20190417: 今天发现一个函数fcloseall(_fcloseall),作用是把fopen打开的文件句柄全关了。 但我实际测试,发现fopen打开一个句柄fp,然后调用fcloseall,但这个fp句柄还可以正常读写和关闭。 不过确实证明它有fflush的作用。 20190420: 今天发现proc查询数据到char *类型缩主变量,居然是通过strlen计算其空间大小。 这个设定好奇怪。在官方文档里面也提醒了调用者,需要用非‘