admin 的所有文章

CTO、技术总监和技术经理有啥区别?

最近朋友圈上被CTO的故事刷的满屏都是,着实又火了一次。

大概是某个C轮融资的医疗网站CTO被离职。而CTO是一个知乎大V和微信大号。此事一出,在微信群有支持也有反对之声。支持此CTO被离职的认为其在工作时没有Review程序,自己不写代码,而是热衷出没于技术大会,写互联网圈的花边新闻。而CTO侧的原因是深度参与创业多年,期权回报到头来一场空。

你我都不是吃瓜群众,这事不同角色不同的利益点,肯定态度不一样。作为一个技术老司机,今天和大伙谈谈这三个角色到底有啥不同。

程序员

程序员,英文名coder/programmer,大家常自嘲叫码农的阶段。这个角色职责是把需求或产品实现为用户可用的软件产品。

此职位为执行级别。另外因为经验较少,一般需要求助别人,或与别人一起完(ban)成(zhuan)一个任务。

此阶段大概要经历3年,程序员的职责如下:

1、负责公司运营系统的设计与开发工作

2、运营数据处理和分析

高级程序员

高级程序员学名工程师。到了这个level,英文名可改叫做engineer或developer。此时你的功力开始增强,这与你平时的积累努力是分不开的,祝贺你~

此时的你不仅可以完成任务,开始注重代码的质量, 能够写出工业级的代码 。

你的经验可胜任模块级的系统设计,承担完成较为复杂的技术,能有效的自我管理,有帮助别人快速解决问题(trouble shooting)的能力。

此阶段你需要经历到7、8年左右的体验,中间要经历一段深刻自我历练的过程。

有时给人致命一击其实是心里的小蟊贼。一般人在5年前后遇到一个门槛,碰到天花板+彷徨期,或者你打心眼里不在喜欢编程,可尝试转为其它角色,如产品经理,售前售后支持等岗位,也不失为好选择。

当我们熬过这段儿,就会“山随平野尽,江入大荒流“,渐入佳境矣。

高级程序员定义软件功能、做开发计划推进和管理。可以带几个个帮手把产品规划的功能实现,你是团队中的”大手“,遇到难题也是你亲自攻艰克难。

所以,一个高级程序员,他的职责很清晰:

1、负责产品核心复杂功能的方案设计、编码实现

2、负责疑难BUG分析诊断、攻关解决

架构师

到了架构师级别,想必你已经学会降龙十八掌,可登堂入世,成为一位准(lao)专(you)家(tiao)。

我们大喊声:“单打独斗,老衲谁也不惧!“,遂开始领导一众技术高手,指点武功,来设计和完成一个系统,大多是分布式,高并发的系统架构平台。

架构师的任务是为公司产品的业务问题提供高质量技术解决方案。可能每条产品线都设置了架构师,也可能多条生产品线的的后端是由一个架构师设计的平台提供。

RBraUjm.png!web

通过上面架构师的部分成果,总结其职责如下:

1、需求分析:“知彼”有时比“知已”还重要。管理市场,产品等的需求,确立关键需求。坚持技术上的优秀与需求的愿景统一,提升技术负债意识,提供技术选项,风险预判,工期等解决方案。

2、架构设计:在产品功能中抽取中非功能的需求,由关键需求变成概念型架构。列出功能树,分层治之,如用户界面层、系统交互层,数据管理层。达成高扩展,高可用,高性能,高安全,易运维,易部署,易接入等能力。

3、功能设计与实现:对架构设计的底层代码级别实现。如公共核心类,接口实现,应用发现规则、接口变更等。

技术经理

人生就是不断上升的过程,你已经到达经理的层次了。如今的你,需要不断提高领导力,需要定期召开团队会议讨论问题。

首先我们要更加自信,在工作中显示自己的功力,给讲话增添力量。如:“本次项目虽然有很大的困难,我们也需苦战到底。当然示先垂范,身先士卒,方能成功!”

你需要和大家站在一起,因为人们也都有解决问题的能力,更需要有以下的能力与责任:

1、任务管理:开发工作量评估、定立开发流程、分配和追踪开发任务

2、质量管理:代码review、开发风险判断/报告/协调解决

3、效率提升:代码底层研发和培训、最佳代码实践规范总结与推广、自动化生产工具、自动化部署工具

4、技术能力提升:招聘面试、试题主拟、新人指导、项目复盘与改进

技术总监

如果一个研发团队超过20人,有多条产品线或业务量很大,这时已经有多个技术经理在负责每个业务,这时需要一位技术总监。

技术总监的职责:

1、组建平台研发部,与架构师共建软件公共平台,方便各条产品业务线研发。

2、通过技术平台、通过高一层的职权,管理和协调公司各个部门与本部门各条线。现在每个产品线都应该有合格的技术经理和高级程序员。

CTO

首席技术官,英文名Chief Technology Officer。是与CEO、COO、CFO同级的领导者,是技术和业务融合的领袖。

国内与国外对CTO的定义有些许不同。

美国对CTO的职责是设计公司三年内的产品和服务的技术发展方向,较少参与技术团队的日常管理和项目管理事务。基本是前瞻性的策略思维,比如Google的谢尔盖.布林一直保持对技术方向的敏锐,比如无人驾驶汽车,人工智能等走向。

在国内,CTO大部分则偏重于研发管理,相当于技术总监的Plus版。它相当于美国互联网公司常设的工程师副总裁+CTO的工作并集。但总体事情比美国的CTO层次低,大部分CTO的是领导技术团队开发各类产品,解决技术问题,管理不同的项目,排期交付。还有一部分的职能类似于架构师或总工程师,作为技术侧的权威,为下一步的发展方向 做研究探讨,为CEO提供建设型决定参考。

CTO的职责如下列表:

1、技术愿景:识别新技术、利用新技术、整合新技术、驱动新技术。驱动商业战略、驱动产品战略
2、技术架构:建立主营业务中的技术架构与实施模式,建立技术体系标准
3、流程制度:建立高质量,高效率的技术团队。健全的项目管理体系;完善的员工能力发展体系
4、知识培训:建立以研发内容为主的知识库管理体系、技术分享与技术文化的体系
5、业务支撑:与其它部门的沟通协作,如HR、市场、BD、财务、客服等提供技术管理接口;在产品技术层面能够领先于业内同行
6、影响力:在公司内部与行业中具备一定影响力与口碑
7、视野&格局&执行力:看待问题全面,具有强大的学习力,具备技术前瞻力,敏锐的市场嗅觉,战略落地的能力
小结

上面为大家描绘互联网技术团队的角色区分,我们一起来做一个小结:

CTO做的事情,是商业、产品、技术、管理、团队相平衡的综合统管,公司的技术研发方向与重点商业化的结果负责,激励员工,营造工程师文化。

而技术总监主要是协调团队内部各个资源,引入工具,和方法提升工作效率。

技术经理角色相对具体,绩效考核,产品落地,执行优胜劣汰的规则。

正像《少有人走的路》,每个人的成长路径都不同,但无一不是兴趣与使命驱动——无论你是程序员,技术经理,还是在CTO的角色。大家一起发挥潜力,去迎接不期而遇的挑战与胜利后的曼妙风光。

 

WinScp自动执行脚本

我们经常使用WinSCP工具通过sftp协议上传获取文件,本文描述通过bat批量处理文件。

首先,我们打开dos命令窗口使用 cd d :DWinSCP 打开WinSCP安装目录

上传文件:

winscp.exe /console /command “option batch continue” “option confirm off” “open sftp://user:pwd@ip:port” “option transfer binary” “put D:需要上传的文件路径 /服务器文件存放目录” “exit” /log=log_file.txt

这里为了方便理解,一一解释。

winscp421.exe /console /command     命令名
 “option batch continue”           默认批处理  
 “option confirm off”             关闭提示信息
“open ftp://user:pwd@ip:port”  user:访问用户名 ,pwd:用户密码 ,ip:ip地址,port:端口号  默认22
“option transfer binary”   使用二进制格式传送

log=log_file.txt 日志文件地址
 “exit”                     ::执行完命令后退出 

注意:以上 command 后的都为参数 需在一行体现  如想分开写 可把命令单独放到一个文件

如:aa.txt

option echo off
option transfer binary
open <sftp_or_ftp>://<user>:<password>@<host_ip>:<port> -privatekey <private_key_file>
cd <remote_dir>
put *.doc
exit

用命令执行该脚本:winscp /script=aa.txt /ini=<WinSCP.ini_location> /log=<log_file>
如果需要配置传输参数,在WinSCP.ini配置,例如PreserveTime=0保持源文件的时间戳

 

下载文件:

一下是下载文件代码,同上传一样,如需单独写脚本可 用如上方式单独保存脚本执行。

CD /d D:WinSCP
winscp.exe /console /command “option batch continue” “option confirm off” “open sftp://root:root@10.168.38.72:22” “option transfer binary” “get /test.txt D:sftptest” “exit” /log=D:sftptestlog.txt

宝塔–服务器运维面板

永远免费的服务器运维面板

 

https://www.bt.cn/

 

开源地址:https://github.com/aaPanel/BaoTa

宝塔开源许可协议:https://www.bt.cn/kyxy.html
使用手册:https://www.kancloud.cn/chudong/bt2017/424204
论坛地址:https://www.bt.cn/bbs
反馈建议: https://www.bt.cn/bbs/forum-43-1.html
Bug提交:https://www.bt.cn/bbs/forum-39-1.html

安装命令:

Centos
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
Ubuntu/Debian
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh




宝塔服务器面板,一键全能部署及管理,送你3188元礼包,点我领取

Tomcat中给server.xml加入元素

<Context>代表了运行在<Host>上的单个Web应用,一个<Host>可以有多个< Context>元素,每个Web应用必须有唯一的URL路径,这个URL路径在<Context>中的属性

path中设定。<Context>元素的属性: 

 

path:指定访问该Web应用的URL入口,如:http://127.0.0.1:8080/helloApp1。 

 

docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。

reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。

在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发布阶段将reloadable设为false。

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="ture" >
<Context path="" docBase="aaa" debug="0" reloadable="true"/>
</Host>

 还有就是给上传目录配置静态资源映射,比如我这里的 有一个上传目录 /www/uploads ,用户上传的图片都会保存到这个 uploads 文件夹来,那如何在服务器访问这个目录呢?一样,加入:

1 <Context path="/uploads" docBase="/www/uploads" debug="0" reloadable="true" />

 

Tomcat之Session名称修改-springboot

Tomcat里面的默认session名称为jsession,在浏览器第一次访问应用的时候,就会调用request.getSession()来获取session,如果没有就会生成一个唯一的session id ,然后再通过cookie写回到浏览器,然后每次浏览器访问,都会带着这个session id, 来标示这个用户。
————————————————
版权声明:本文为CSDN博主「狂飙的yellowcong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yelllowcong/article/details/88928402

  

tomcat的session设定

需要在tomcat的配置文件里面,配置sessionCookieName 这个字段,可以修改默认的session名称

 

<Context path=”/” docBase=”webapp” reloadable=”false” sessionCookieName=”yellowcong”></Context>

  

springboot 的session名称设定

server.session.cookie.name=yellowcong

 参照:https://blog.csdn.net/yelllowcong/article/details/88928402 

修改tomcat默认的session时间

session超时设置

具体设置很简单,方法有三种:

  1. 在主页面或者公共页面中加入:session.setMaxInactiveInterval(600);参数600单位是秒,即在没有10分钟活动后,session将失效。
      这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。
  2. 也是比较通用的设置session失效时间的方法,就是在项目的web.xml中设置
    // 设置为0,-1 表示永不超时
  <!-- 设置session失效,单位分 --> 
  <session-config> 
  <session-timeout>1</session-timeout> 
  </session-config>

  

  1. 直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下conf/web.xml中找到元素,tomcat默认设置是30分钟,只要修改这个值就可以了。

需要注意的是如果上述三个地方如果都设置了,有个优先级的问题,从高到低:1>2>3

异常:Invalid character found in the request target. The valid characters are defined in RFC 3986

一、背景

  事情是这样的,前几天做一个基本的数据库“增删改查”的需求,前端传参的方式是“JSON字符串”,后端接收到此参数后,使用阿里巴巴fastjson进行解析,然后入库。需求很简单吧,但是偏偏遇到问题了。

  我发现,JSON字符串里面无数组,纯粹的都是json结构的时候,即都是“{}”时,不会报错,传参入库没问题。但是只要传参的值里面有数组,即有“[]”的结构时,就报错。报错内容如下(我的tomcat版本是8.5.45):

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

 

二、原因

  tomcat的原因。 tomcat严格按照RFC规范进行范文解析,随着网络环境的变化,RFC规范也在不断的修改和升级中,发布了好多版本。而tomcat的不同版本中,采用的RFC规范的版本是不同的。所以你会在下文发现,有的低版本tomcat没有这个问题。

  tomcat自tomcat 8.0.35版本之后对URL参数做了比较规范的限制,必须遵循RFC 7230 and RFC 3986规范,对于非保留字字符(json格式的请求参数)必须做转义操作。例如:RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

  Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中——百度百科。

  附上网络大牛的源码分析:

分析的是org.apache.tomcat.util.http.parser.HttpParser

//tomcat 8.2.3 版本及 tomcat 7.0.82 ,都有如下代码,读取配置
String prop = System.getProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow");
if (prop != null) {
    for (int i = 0; i < prop.length(); i++) {
        char c = prop.charAt(i);
        if (c == ‘{‘ || c == ‘}‘ || c == ‘|‘) {
            REQUEST_TARGET_ALLOW[c] = true;
        } else {
            log.warn(sm.getString("httpparser.invalidRequestTargetCharacter",Character.valueOf(c)));
        }
    }
}

而tomcat 8.0.14 版本中并没有读取配置,对 | { } 的处理,而是默认为合法字符。
static {
    for (int i = 0; i < 128; i++) {
        if (i < 32) {
            isToken[i] = false;
        } else if (i == ‘(‘ || i == ‘)‘ || i == ‘<‘ || i == ‘>‘  || i == ‘@‘  ||
                   i == ‘,‘ || i == ‘;‘ || i == ‘:‘ || i == ‘\‘ || i == ‘"‘ ||
                   i == ‘/‘ || i == ‘[‘ || i == ‘]‘ || i == ‘?‘  || i == ‘=‘  ||
                   i == ‘{‘ || i == ‘}‘ || i == ‘ ‘ || i == ‘t‘) {
            isToken[i] = false;
        } else {
            isToken[i] = true;
        }
        if (i >= ‘0‘ && i <= ‘9‘ || i >= ‘A‘ && i <= ‘F‘ ||i >= ‘a‘ && i <= ‘f‘) {
            isHex[i] = true;
        } else {
            isHex[i] = false;
        }
    }
}
可以看出在 8.0.x 左右的一些版本中,tomcat.util.http.parser.HttpParser. requestTargetAllow (下文方法三)这个配置是没有生效的,即| { } 这3个符号认为是合法的。

 

三、解决

  注:我是使用“方法五”解决问题的,推荐“方法五”。

  方法一:换到低版本的Tomcat。

  方法二:在Catalina.properties中添加tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}这个东西明显是允许“|”和大括号的,但是我现在的问题是中括号。

  方法三:添加tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true这个是允许url中带有特殊字符的。试过了,也不好使。

  方法四:对传递的“JSON字符串”进行url编码后在传递,可以规避这个方括号。前端用“encodeURI(xxx)”方法编码,后端用“URLDecoder.decode(xxx, “utf-8”)”解码即可。

  方法五:在tomcat目录的conf文件夹下,server.xml的Connector中添加了这个relaxedQueryChars=”[,]”。

      注:

1、如果还有其他特殊的字符串,也可以直接添加到这个属性里;

2、如果你是springboot项目,可以在SpringBootApplication的的main方法中增加:System.setProperty(“tomcat.util.http.parser.HttpParser.requestTargetAllow”,”[]”);       技术分享图片

参考

1、https://blog.csdn.net/Hitler698/article/details/85720156

2、https://my.oschina.net/pding/blog/1794176

3、http://www.bubuko.com/infodetail-3238579.html

如何将解压版的tomcat设置为windows 服务启动

在web服务器上通常需要是web容器随开机自动启动,恰好Tomcat可以作为服务启动,只要经过我们简单的配置,就可以将免安装版的Tomcat添加到系统服务中。

1.1一个服务器上只有一个tomcat的情况

    首先需要配置以下环境变量:

   JAVA_HOME:JDK 路径

   JRE_HOME:JRE 路径

   CATALINA_HOME:Tomcat 路径

在 path 环境变量最前面加入:%JAVA_HOME%bin;%CATALINA_HOME%bin;

1.2一个服务器上只有多个tomcat的情况

  在binservice.bat、shutdown.bat、startup.bat三个文件顶部都添加如下内容

SET "JAVA_HOME=C:Program FilesJavajdk1.8.0_131"
SET "CATALINA_HOME=D:apache-tomcat-8.5.47-BIMPlatform"

  JAVA_HOME为安装的jdk的目录

        CATALINA_HOME为当前tomcat的跟目录

2.好了,环境变量配置完成,接着在 CMD 下运行 service.bat install

C:Usersyuhuashi>service.bat install               或者 service.bat install servername
Installing the service ‘Tomcat6’ …
Using CATALINA_HOME: “D:ProgramerFilesapache-tomcat-6.0.35”
Using CATALINA_BASE: “D:ProgramerFilesapache-tomcat-6.0.35”
Using JAVA_HOME: “d:ProgramerFilesJavajdk1.6.0_30”
Using JVM: “d:ProgramerFilesJavajdk1.6.0_30\jrebinserverjvm.
dll”
The service ‘Tomcat6’ has been installed.

现在 Tomcat 服务已经安装在系统中了,继续运行 services.msc 打开服务管理控制台。

找到 Apache Tomcat 服务,右键选择属性,修改启动类型为“自动”或“自动(延迟启动)”并确定。

搞定,再次开机时 Tomcat 就会随系统自动启动了。

 

3.如果想移除的命令为

service.bat uninstall
service.bat uninstall servername