Linux 远程拷贝 scp 命令及 not a regular file 问题解决方法

scp 文件名  root@远程ip:/路径/
将本地home目录下的test.tar的文件拷贝到远程主机192.168.1.23的/home/adm/目录下,则命令为:scp /home/test.tar root@192.168.1.23:/home/adm/  回车后输入密码就可以了
scp提供了几个选项  在scp后加就行了
    -p 拷贝文件的时候保留源文件建立的时间。
    -q 执行文件拷贝时,不显示任何提示消息。
    -r 拷贝整个目录   www.2cto.com
    -v 拷贝文件时,显示提示信息。

 

linux 下scp传文件时错误 scp: /usr/tools: not a regular file 不能成功传送 解决方法

1:有可能没权限 chmod 777

2:  在使用scp时加上-r 参数 scp -r root@192.168.16.5:/usr/tools/xxxx

0

使用cnpm淘宝镜像代替npm

介绍

安装NodeJS之后使用npm来安装包使用的是国外的地址,经常会出现超时错误,可以通过修改为国内的淘宝源来加速安装。

配置

临时使用

永久使用

直接配置

通过如下命令可以查看是否配置成功

如果需要恢复成原来的官方地址只需要执行如下命令:

使用cnpm

安装淘宝的cnpm,然后在使用时直接将npm命令替换成cnpm命令即可

然后安装时使用如下命令

 

0

dubbo服务启动后主机名ip不对,怎么办?

为什么dubbo服务启动后主机名ip不对,我们需要知道dubbo默认的缺省主机 IP 查找顺序。

缺省主机 IP 查找顺序:

  • 通过 LocalHost.getLocalHost() 获取本机地址。
  • 如果是 127.* 等 loopback 地址,则扫描各网卡,获取网卡 IP。

主机配置

注册的地址如果获取不正确,比如需要注册公网地址,可以:

  1. 可以在 /etc/hosts 中加入:机器名 公网 IP,比如:
  2. dubbo.xml 中加入主机地址的配置:
  3. 或在 dubbo.properties 中加入主机地址的配置:

端口配置

缺省主机端口与协议相关:

协议 端口
dubbo 20880
rmi 1099
http 80
hessian 80
webservice 80
memcached 11211
redis 6379

可以按照下面的方式配置端口:

  1. dubbo.xml 中加入主机地址的配置:
  2. 或在 dubbo.properties 中加入主机地址的配置:
0

如何配置Spring Cloud应用使用指定IP或忽略某张网卡?

问题说明

分布式应用部署到服务上,由于服务器可能存在多张网卡,造成IP地址不准的问题。

解决方法

1、直接添加忽略某张网卡的配置:

正则:

2、指定默认IP:

3、除了这些配置,还有以下的这些配置:

ignored-interfaces和preferred-networks这两个配置。这两个配置决定了spring cloud应用在启动的时候所使用的网卡和IP地址。ignored-interfaces接收一个正则表达式数组,配置名字虽然是ignored-interfaces,忽略的网卡,但是因为其接收的是正则表达式,所以我们可以任意的选择和反选本机的网卡。preferred-networks是指倾向于使用的IP地址,接收一个正则表达式数组,用于选择Spring Cloud应用使用的本机的IP地址。通过这两个配置,我们可以任意指定Spring Cloud应用使用的网卡和IP地址。

0

如何使用Arthas来排查dubbo应用的问题?

Arthas是阿里巴巴开源的应用诊断利器,Apache Dubbo是阿里巴巴开源的高级RPC框架,如何使用Arthas来排查dubbo应用的问题?

下面分享一些使用Arthas排查Dubbo问题的经验。

dubbo-arthas-demo

所有的排查都是基于这个非常简单的一个应用,浏览器请求从Spring MVC到Dubbo Client,再发送到Dubbo Server。

Demo里有两个spring boot应用,先启动服务端server-demo,再启动客户端client-demo

客户端:

client

服务器端:

server

Arthas快速开始

  • https://alibaba.github.io/arthas/install-detail.html

Arthas-start

启动后,会列出所有的java进程,选择1,然后回车,就会连接上 ServerDemoApplication

1-detail

Dubbo线上服务引发异常,如何获取调用参数?

  • https://alibaba.github.io/arthas/watch.html

当线上服务引发异常时,最着急的是什么参数导致了抛异常?

在demo里,访问http://localhost:8080/user/0,UserServiceImpl就会引发一个异常,因为user id不合法。

在Arthas里执行,然后再次访问,就可以看到watch命令把参数和异常都打印出来了。

watch

如何调试Dubbo服务代码?

  • https://alibaba.github.io/arthas/redefine.html

在本地开发时,可能会用到热部署工具,直接改写代码,不需要重启应用。但是在线上环境,有没有方法直接动态调试代码?

在Arthas里,可以通过redefine命令来达到线上不重启,动态更新代码的效果。

例如我们修改下UserServiceImpl,用打印出具体的对象来:

redefine

本地编绎后,传到线上服务器,然后用命令来更新代码:

update

这样子更新成功之后,访问http://localhost:8080/user/1,在ServerDemoApplication的控制台里就可以看到打印出了用户信息。

怎样动态修改Dubbo的logger等级?

  • https://alibaba.github.io/arthas/ognl.html
  • https://alibaba.github.io/arthas/sc.html
  • https://commons.apache.org/proper/commons-ognl/language-guide.html

在排查问题时,需要查看到更多的信息,如果可以把loggergrade修改为DEBUG,就非常有帮助。

ognl是apache开源的一个轻量级表达式引擎。下面通过Arthas里的ognl命令来动态修改logger等级。

首先获取Dubbo里TraceFilter的一个logger对象,看下它的实现类,可以发现是log4j。

logger-class

再用sc命令来查看具体从该哪个jar包里加载的:

sc-jar

可以看到log4j是通过slf4j代理的。

那么通过获取logger,再修改它的级别:

logger-edit

可以看到修改之后,rootlogger的级别转化DEBUG

怎样减少测试小姐姐重复发请求的麻烦?

  • https://alibaba.github.io/arthas/tt.html

在平时开发时,可能需要测试小姐姐发请求过来联调,但是我们在调试时,可能不小心直接跳过去了。这样子就尴尬了,需要测试小姐姐再发请求过来。

Arthas里提供了tt命令,可以减少这种麻烦,可以直接重新请求。

tt

上方的命令捕获到了3个请求。然后可以重新初始化请求:

re-tt

Dubbo运行时有一些过滤器?耗时是多少?

  • https://alibaba.github.io/arthas/trace.html

Dubbo运行时会加载很多的过滤器,那么一个请求会经过某种过滤处理,过滤里的耗时又是多少呢?

通过Arthas的trace命令,可以很方便地知道Filter的信息,可以看到详细的调用栈和耗时。

trace

Dubbo动态代理是怎样实现的?

  • https://alibaba.github.io/arthas/jad.html
  • com.alibaba.dubbo.common.bytecode.Wrapper

通过Arthas的jad命令,可以看到Dubbo通过javaassist动态生成的Wrappr类的代码:

jad

获取Spring上下文

除了上面介绍的一些排查技巧,下面分享一个获取Spring Context,然后“为所欲为”的例子。

在Dubbo里有一个扩展,把Spring Context保存到了里面。因此,我们可以通过命令获取到。

last

下上面的语句:

  • SpringExtensionFactory@contexts.iterator.next 获取到  SpringExtensionFactory里保存的spring context对象
  • #context.getBean("userServiceImpl").findUser(1) 获取到  userServiceImpl再执行一次调用

总结

Arthas里的功能很强大,更多功能大家可以自行探索学习。

0

给年轻程序员的一些技术面试的建议

之前帮项目组面试了一些应届毕业生,在写代码的间隙和这些快毕业的年轻人交流也学到了很多。针对面试中遇到的问题,写一篇文章总结一下如何进行技术面试,给年轻程序员一些建议。

一、简历

简历很重要,排版和文字体现了态度和专业程度,写到上面的项目和技能决定了面试方向。

1、简历排版

排版的基本原则

a) 对齐。简历整体应保持一个对齐样式。

b) 字体和色彩保持一致,最好不要出现三种以上的色彩和字体。

c) 页数为一到二页,大多数好的简历都是一页写完。便于 HR 和技术面试官筛选。

排版工具不限,Word、Markdown、网页都可以,推荐使用 Latex,Latex 是出版公司使用的专业排版软件,高度自由、专业大方。。

2、定制化内容

对应于技术岗位要求,不要出现过多非必须的描述。如:学生会干部经历、个人爱好、甚至照片都是非必要的。应该有的是实习经历、项目经历、竞赛经历等。

3、扩展项

简历可以表达的内容有限,又是静态的。可以通过富媒体扩展引入

a) 个人博客网站。个人博客最好是多年有高质量内容更新的,面试官可以通过博客了解到面试者学习关注的方向,对技术问题的思考和总结。推荐使用 WordPress/Github Pages 等工具自己搭建。

b) Github。最好是有高 Star/Fork 的个人项目,体现技术影响力。面试官可以了解到编码风格、软件工程素养。

c) 项目演示 Demo。

二、面试考察项

面试技巧

1、基础知识

最基本的岗位能力要求,包括语言基础、操作系统、计算机网络、数据库、数据结构、软件工程、数据技术等等。至少需要对某一个方向有较深入的研究和思考。

2、聪明程度

这是一个主观又难以量化的指标,当面试官问出一个问题时,他是知道答案的。他可能只是简单看过答案,或者做项目时遇到这个问题,或者刚好思考过这个问题,而对面试者来说可能完全是陌生的。这样来看其实不公平,用一个比较少遇到的问题去考察其他人,这种问题也不能测试出面试者的聪明程度。那如果出的题是从简历里引申出来又稍微有深度和难度的呢。这时就可以看到面试者的应变能力和知识迁移能力。用这两个指标去衡量时会更有效一些。举例:

「看你简历上写的了解 Linux 文件系统,如何在终端里删除一个名字为乱码的文件」,这个题目里有明显提示-Linux 文件系统,面试者也有这个基础能力,他如果能想到文件的 inode 数据结构,再结合管道就可以答出这道题。

「看你项目中提到了协程,怎么去设计一个协程库」,面试者可能没有看过协程源码,但知道基本原理后结合面试官的提示是可以推导答出大概的框架。

3、沟通能力

沟通更多是一种方法。

a) 是否可以做到结论先行。回答问题时,先明确给出答案,再给出推导过程。

b) 是否可以把回答归纳总结为有条理的子项。归纳的过程也是展示思考的过程,原则是子项独立不重复;整体不遗漏。

c) 是否可以把一个其他人不熟悉的概念用简洁易懂的语言向他讲明白。我们可以用这条标准来衡量自己是否真正理解一个概念,那就是把这个概念给完全不懂的人讲清楚。

d) 在传达信息时,是否可以及时调整表述,以确保信息被正确接收到。「项目计划」中提到,作为项目经理,我们必须要记住一个基本前提,就是防止误解是信息发送者而不是接收者沟通职责。

其他沟通方法可以参考「非暴力沟通」。

三、面试官与面试者

管理大师德鲁克说,在组织中的人既是管理者,也是被管理者;既是管理的主体,同时又是客体,都承担双重角色。而面试官与面试者也是这种关系。一方面,面试官承载着这家公司的品牌形象和文化,也在接受面试者的评价和选择。另一方面,面试官极有可能有一天也是要去面试的。那么从这两个方面,作为普通技术人员的面试官应该做些什么?

1、面试官的职责

a) 提前 review 简历,针对提到的技能和项目,定制化一份可以综合评价能力的面试题

b) 平等认真倾听和记录面试者作答,引导面试者展现能力

c) 向面试者介绍公司和项目组在做的事情

d) 面试者有主动寻求建议,应适当给出建设性的答复

2、技术人员出走的能力

面试官作为一个有较多工作经验的普通开发人员,也会有一天转换角色成为面试者。为了适应这个激烈变化的互联网行业,他们应该保持随时出走的能力。开发工程师平时可以关注这些:

a) 提高业务能力和积累高价值的项目经历

b) 维护更新一份自己的简历

c) 学习新的语言和技术,创建自己的项目和产品

d) 积极分享,提高自己在业界的影响力(写公众号、博客、Github、开发者社区)

e) 主动了解业界情况(薪资待遇、发展机会、业务范围)

f) 有机会的话与猎头维持良好的联系

总结

其实不光程序员,任何行业的从业人员,都需要对自己有一个认真负责的职业规划。

0

如何写一个自己的 Chrome 谷歌浏览器插件?

前言

有的公司的网络不可以直接上外网,需要在一个 OA 管理网站上请求授权后有 2 小时连接外网的时间。所以需要每隔 2 小时去这个 OA 网站上点击一下按钮。那就可以写一个 JS 脚本来有事没事续一秒。

之前也曾预研过 Chrome 插件写法。于是学着写一个简单的插件。功能不复杂,也遇到了一些问题,在此记录一下。

Chrome 插件结构

mainfest.json 定义了插件的配置

backgroud 字段指明 background.js 为在后台永远默默执行的代码。content_scripts 字段指明当我们在地址栏打开 http://oa.com/* 匹配的网站时,它会去执行 content.js,相当于监听正则表达式匹配的网站。default_popup 字段指明点击插件按钮时弹出来的框的页面内容 popup.html,其实就是一个普通网页,如下所示,它需要单独的 popup.js 来进行交互。弹窗页面的 js 是打开后执行一次,生命周期和普通网页一样。

完成这个需求只需要打开一个 OA 网站的 tab 放在一边,在 content.js 里监听页面中的剩余时间,当剩余时间小于 N 分钟时,提交按钮事件就可以达到目的了。但这个按钮一天只能点 6 次,超过之后必须输入验证码。这时就无能为力了。

排期迭代

功能虽然简单,也要一步步来,分为三期迭代。

一期:跑通 Chrome 插件的例子,理解原理机制

二期:在插件弹窗页面实时显示访问开发网剩余时间;不需要验证码授权时,剩余时间小于阈值则自动授权

三期:需要验证码授权时,把验证码显示在弹窗里,提醒输入验证码后进行授权。后来发现这个功能不好做,验证码模块的 HTML 代码是写在 iframe 中的,这是一个跨域问题啊(敲黑板)!


主要逻辑

主要逻辑在后台代码 content.js 中,使用 setInterval 定时功能固定时间去检测访问情况。

比较奇怪的是单独直接打开 popup.html,它会调用 popup.js,里面也会执行 Ajax 请求 OA 网站,但会出现跨域错误。显然站点服务端是不支持跨域的。

那么写在插件里 JS 又是怎么达到目的的呢。那是因为 Chrome 插件是浏览器自产自销的,不受限于同源策略。

普通网页能够使用 XMLHttpRequest 对象发送或者接受服务器数据, 但是它们受限于同源策略. 扩展可以不受该限制. 任何扩展只要它先获取了跨域请求许可,就可以进行跨域请求。

这里的 Ajax 请求也会带上本地的 Cookie。


iframe 跨域问题

页面引用了单独的验证码模块,一旦使用 getElementById 类似的方法,就会出现

Blocked a frame with origin from accessing a cross-origin frame

的错误,stackoverflow 上也有讨论(http://stackoverflow.com/questions/25098021/securityerror-blocked-a-frame-with-origin-from-accessing-a-cross-origin-frame)。显然在不侵入验证码模块时,无法让两个窗口进行通信,HTML5 的 postMessage 方案也不行。

不过毕竟是 Chrome 的插件,还是有方法获取 iframe 的内容的:使用 content_scripts 的 all_frames = true 选项。content_scripts 是打开匹配的网站时,content.js 进行加载,获取到验证码后和 popup 弹窗进行通信,把提醒消息和验证码发到弹窗。弹窗手动输入验证码后发送消息到 content.js 发起授权。

0

如何使用 tcpdump 进行抓包分析?

如果在联调接口时,遇到这样的问题:可以 telnet 联通,但无法调通服务接口。那可以使用 tcpdump 进行抓包分析。

查看三次握手过程

使用命令 sudo tcpdump host 131.87.110.XX -i eth0 查看握手过程。

-i:指定监听的网卡,有的机器有多块网卡。我测试的机器 eth0 能抓到收发的包,而 eth1 只能抓到收的包。

host:指定要监听的包的来源 IP。131.87.110.XX 为对端的商户 IP,报文中使用 remote_mch_IP 代替。

一个正常的握手过程如下:

实际的返回是:

回包标志

可以看到对端服务器发送一个 SYN 后直接 RESET 了。

原因分析

服务器端因为某种原因关闭了连接(如服务 Coredump,调用 Socket.close() 方法等),而客户端依然在读写数据,此时服务器会返回复位标志 RST。

0

设计模式原则的开闭原则的理解

开闭原则

即Open Closed Principle,它是最基础也是最重要的设计原则,我们遵循其它的设计原则如单一职责原则、依赖倒置原则、里氏替换原则等最终都是为了开闭原则。

开闭原则要求一个软件实体,如类、函数或模块,要对扩展开放(提供方),对修改关闭(使用方)。当有一个新的功能或需求来了时,我们应该是通过增加新的类、函数、模块等手段来代替直接修改原来的类或函数。

总之一句话就是用抽象构建框架,用实现扩展细节

案例

重构前UML图

重构前UML图

代码1

现在若要增加一个统计平台拼多多,那就需要在yearSales方法里增加if else判断分支,另外调用方的客户端也要跟着修改,这就违背了开闭原则。根据对修改关闭,对扩展开放的宗旨,我们需要这样改。

代码2

 

 

0

idea里的maven项目的Plugins的红色波浪线错误的原因及解决

maven的pom报plugins错误的原因及解决方法

错误信息

Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.7.1 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced

碰到一个类似以上的错误.以maven-surefire-plugin-2.7.1.jar报红为例子

原因

maven的plugin并未正在下载到本地.

首先查看maven仓库位置

idea里的maven项目的Plugins的红色波浪线错误的原因及解决

 

进入
~\.m2\repository\org\apache\maven\plugins\maven-surefire-plugin\2.7.1

的话,会发现里面只有一个

的文件,而并没有maven-surefire-plugin-2.7.1.jar

解决办法

1.删除所有以lastUpdated结尾的文件

2.重新点击reimport即可

idea里的maven项目的Plugins的红色波浪线错误的原因及解决

如果点击更新后发现

下还是没有maven-surefire-plugin-2.7.1.jar,去http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.7.1/下载

包再重复步骤2即可解决。

0