Posted in 技术

【阅后有感】《程序员必读的职业生涯规划书》

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“记住你即将死去”

浮动的时代,躁动的我们。但在动车上看书,往往静的下来。就这样让时间静静的耗着,躺着在文字之间度过。再品 Easy 的《程序员必读的职业生涯规划书》,牛逼,非常牛逼,就是牛逼。我是在年前上班粗粗看过,武汉到杭州的路上我仔细翻阅了各章内容。尤其原理篇就吸引我了,不知道是不是因为刚好前面一段时间看过《Poor Dad Rich Dad》,里面的原理讲的是那么有点像。Easy 自己也在四画像中提到了罗伯特,将走向财务自由划为了四个维度。下面是我阅后有感的四个方面吧:

如何看待工作?


什么是工作?对于工作的解释,超级阿嬷讲的,最接地气:“如果不知道自己想干什么,就先工作。只要工作,就可以得到米、酱、酱油、朋友和信任。可以一边工作,一边寻找真正想干的事,千万不要游手好闲。” — 《超级阿嬷的信》

阿嬷的意思是,任何的工作都离不开人和钱。因此,职业和事业的不同就是。职业更在乎的是与谁一起工作,还有能挣多少钱。

第一是与人一起工作,领导、小领导、师兄和同事等。在工作中,你依旧是你,你的性格,你的能力会被领导看见…有些同事在与你相处下,渐渐成为了你的朋友。同样你会拥有了部分同事或者新朋友的信任。至少8个小时每天的工作,不得不说工作就是是生活必不可少的一部分。如果是你真正想干的事,往往这时间会更长,往往分不清工作与生活的边界。

第二是工作才能获得薪资。比较认可 Easy 说的,工作最重要的是累积金钱。是的,泥瓦匠曾在一度浪过,一度挥霍,一度允许自己犯错的日子里思考。我,但着实觉得穷怕了。金钱是现实世界用以维持生计的必须资源。所以多挣点钱没错,等有一天发现它有用的时候,一定用得上。

薪资和跳槽挂钩吗?一定挂钩,但容易走入误区的是跳槽不等于涨薪。跳槽只是解决了现在的很差,换了个更好的工作。比如,996 每天晚归的娃娃,可能拿着比如高出几K的薪资。往往算下工时的薪资,你恰恰比人家低了好多。而这样的你丧失了运动,即对健康这个资产的投资,往往日积月累的身体负债让你得不偿失。这句话是我看李开复《向死而生》得出的。往往失去过了才懂得珍惜,李开复也如此。他在书中和大师对话中,说到自己人生目标,以为自己自我认识完全。恰恰没,在没日没夜的工作中,他丧失了本真,追名逐利的日子里他光彩的背后付出更多。

我真的自我认识完全了吗?


李开复没有,我也没有。往往自我认识容易让我越陷越深。看《向死而生》,李开复他自己批判的自己。随波逐流,追逐自认为的“最大影响力”,现实社会带着他,陷入了追名逐利。同样,我不是批判李开复,他的价值,他向死而生,他在死亡擦过了边球。我欣赏他,欣赏那些向死而生的人。乔布斯说的,“记住你即将死去”。所以做一个简单的人,做一个充满正能量的人。因为负能量容易更负,坑越深就越爬不上来了。你我一直在处于自我认识完全的过程,这个过程不要去拒绝它,然后享受它。同样不能丢弃它,它就是梦想。就算不能实现,梦想终归是梦想。如果这个梦想没有实现,可以再树立下一个梦想。这样,人到死都能拥有众多的梦想。人生就是这样的反反复复。不进则退,机会留给一直学习的人。但学了不亏难道都是对吗?这是下面要说的话题。

自我认识,就是成长,成长来源思考,来源落地的行动。

学了不亏


学了不亏,这是个好的态度。但保持两点去做会让你更贴近现实。第一学了不亏是因为工作需要,业务能力学习,业务相关技能的学习让你更好的在这个岗位体现出你的价值。这样雇主和你的价值联系也紧密,你会得到相应的升职加薪以及会有一定的股份报酬赌注。

第二是你的兴趣,兴趣驱动的学习往往是不累,并不那么疲惫。并不那么疲惫,不代表学习没有曲线,每个学习都不会那么顺利。仿佛就是从解决问题,解决问题到一个稳定的软件一样。

很多人问题学这个好吗,学这个咋样?我就说学了不亏,因为这段时间去学某个东西,总比不抉择亏。学着学着就明白了哪个该学哪个不该。学着你就会学习放弃,同样学会对自己总结,学会分享总结。

乐于分享,初心不变,虚荣也罢


这个点我没做到以后说。书本文章地址:传送门

欢迎扫一扫我的公众号关注 — 及时得到博客订阅哦!
— http://www.bysocket.com/ —
— https://github.com/JeffLi1993 —

 

Posted in 思考

年计划,技术儿告诉你怎么做?

博主:BYSocket
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!
新年我的本命年,大家辛苦了。新年快乐,健健康康就好。

关于计划


谈年计划,总是计划赶不上变化。但不计划,像我这种健忘的,曾经会老是在想我该干嘛。所以好记性不如烂笔头,我该记得都记着。比如天计划:
回到年计划。很多人会列出年计划,自然很多人会失败。但往往一开始很多人会感觉胜券在手中一样。年计划相比天计划,只不过是时间长点罢了。因此年计划,是每天做的事情一个阶段性小结的结果。
切勿切勿,假大空。比如“升职加薪迎娶白富美当上CTO”…升多少、加多少是个头、自然白富美看脸蛋和技巧、CTO那就胡扯吧。因此,年计划不是梦想。年计划是未来3-5年愿景的一个年度目标。是一个具体的、可实现、有结果导向、有时间约束的目标。最好最好不要超过 3 件事,因为欲望无止境,可能你先做好一件事试试会更好。

关于怎么做年计划


第一、正式心态

计划其实是种对生活对工作的记录。比如周报产生自工作日报。计划并不会夺走你很多的时间,恰恰可以帮你在更好的时间找到做更好的事情。

第二、从 3 年 5 年 10 年找出今年要干的事情

比如 5 年后,我想成为一名作者。我觉得如果不误人子弟,恰恰这是最简单的事情,做快乐的事,并帮助社会与人。但,我今年不可能成为一名作者。因为我不想误人子弟,同样得考虑销量。
年计划呢?我就先写,从一名博主开始。零散的写了个把年,系列写的不多。所以今年的目标是写技术系列文章。

第三、具体实施呢

那就简单了。从 5 年分割到年,从年分割到周就行了。具体计划是每周产出 2 篇技术系列文章。另外我用着,换着感觉就 Evernote 在手,就行了。顺便说下,我是个 Listful 控。
简单,有效,一件事就够了。这就是年计划
Posted in Working Skills, 技术

【工作代码】复杂 JSON 值替换处理

总结下最近的工作遇到的点:
入参复杂 JSON 层层嵌套,Java 怎么优雅的处理。

一、关于 JSON

JSON 是类似 XML 用于存储和交互文本信息。但优于 XML ,其更小,更快,更易懂和解析。其是一个无序的”名称/值”对的集合。由

{ 左括号
"" 名称 String
:
值
} 右括号

组成。然后 名称值对 以逗号分隔。

二、场景描述

是一个正则匹配替换的操作。一个很长很复杂的 JSON 入参,通过正则匹配其 content 对应的值中的图片地址并替换。

三、思考

框架选型 – fastjson
(fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。)

a . 思路
Java 是面向对象的语言。我要利用 fastjson 把复杂的 JSON 写出其对应的 BO 对象,然后正则替换 content 内容(即 operatorContent 方法),然后重新生成 JSON 响应。即下面代码操作:

OperatorBO operatorBO = JSON.parseObject(jsonString, OperatorBO.class);
operatorBO.setContent(operatorContent(operatorBO.getContent()));
String newJsonString = JSON.toJSONString(operatorBO);

 

好处:代码易读,容易维护
坏处:BO 实在是太复杂,而且很多数组嵌数组。PHP -> Java 服务化过程中很多不可控,容易出 BUG。

涉及的API :
序列化对象到 JSON:

String jsonString = JSON.toJSONString(obj);

反序列化 JSON 到对象:

VO vo = JSON.parseObject("...", VO.class);
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

b . 思路
只是替换操作,所以不用太考虑代码易读性。直接利用 fastjson 直接转出 JSONArray 对象,然后操作该对象即可。JSONArray 对象本质就是一个 List<Object> 如下代码:

public class JSONArray extends JSON {
    private final List<Object> list;
    protected transient Object relatedArray;
}

具体伪代码如下:

String jsonString = "[{" + "\"content\":\"content value 1\"" + "}]";
JSONArray itemDataJsonArr = JSON.parseArray(jsonString);
String content = itemDataJsonArr.getJSONObject(0).getString("content");
content = content + "23";
itemDataJsonArr.getJSONObject(0).put(CONTENT,content);

好处:不用关心其他复杂的键值对,目标只关注要替换的节点名称。
坏处:代码不易读,相对也还容易维护。

涉及的API :
替换对应的节点名称的值:

JSONObject.put("...",value);

反序列化 JSON 到 JSONArray 对象:

JSONArray jSONArray = JSON.parseObject("...");

思路 c d e …

 

四、小结

根据服务化场景,在不确定入参 JSON 的复杂度情况下,选择了思路 b.这篇其实是工作上的小小结。任何技术,任何框架的 API 是否好用优雅,是具体场景决定的。

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in Java, 技术

有趣的译文 《Java Pattern 那些小事》

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

一、现代的玩具 – Java 可以做很多事

一个 Q 与 A 的对话,展示了 Java 那些小事。

Q : 5 是整数吗?

A : 是。


Q : -23 是数吗?

A : 是,但负数使用场景很少。


Q : 5.32 是整数吗?

A : 不是,我们不用这种数值类型表示 5.32 。


Q : 5 属于什么数值类型?

A : int (整型)。
批注: int 是基本类型,int 代表整数。


Q : 快,想出另一个整数!

A : 19?


Q : 那 true 属于什么数值类型?

A : boolean (布尔型)。


Q : false 属于什么数值类型?

A : boolean。


Q : 想得出其他布尔值吗?

A : 没有,布尔值只有 true 和 false。


Q : int 是什么?

A : 一种类型。


Q : boolean 是什么?

A : 另一种类型。


Q : 什么是类型?

A : 类型是一个相关值集合的名称。


Q : 能举例解释下类型吗?

A : 使用类型就像使用一种集合一样。比如使用 boolean 可以表示逻辑值:是与非


Q : 能创建新的类型吗?

A : 我们还不知道怎么创建。


Q : 画出下面类的基本关系。

abstract class Seasoning {}

class Salt extends Seasoning {}

class Pepper extends Seasoning {}

A : 这样画?
图 1.1 Seasoning 类关系图

wechatimg4


Q : 是的。Seasoning 是数据类型,Salt 和 Pepper 是 Seasoning 的具体类型。

A : 好的。三个都是新类型吗?


Q : 是的。那么 new Salt() 是一个 Seasoning 吗?

A : 是的。 new Salt() new 关键字表示创建了 Salt 的一个实例,每个 Salt 的实例也是 Seasoning。


Q : new Pepper() 也是吗?

A : 是的。它也是一个 Seasoning。 new Pepper() new 关键字表示创建了 Pepper 的一个实例,每个 Pepper 的实例也是 Seasoning。


Q : 什么是 abstract , class 和 extends 关键字?

A : 简单地说:
abstract class 表示抽象数据类型
class 表示具体类型
extends 连接了具体类型到数据类型


Q : 还有其他的 Seasoning 具体类型吗?

A : 没有,因为只有 Salt 和 Pepper 继承 Seasoning。


Q : 正确。只有 Salt 和 Pepper 是 Seasoning 的具体类型。我们见过类似 Seasoning 数据类型吗?

A : 没有。但是 boolean 类型有两个值:true 和 false。
批注:值与具体类型是不同的。


Q : 再定义一个 Seasoning 具体类型:

class Thyme extends Seasoning {}

A : 再来一个:

class Sage extends Seasoning {}

Q : 4 个 Seasoning 具体类型了。

A : 是的。


Q : 什么是笛卡尔点?

A : 是一对数字。


Q : 曼哈顿地点位于哪里?

A : 两个城市街道的十字路口。


Q : 看代码,CartesianPt 类和 ManhattanPt 类有啥不同于 Salt 类和 Pepper 类

abstract class Point {}
class CartesianPt extends Point {
    int x;
    int y;
    CartesianPt(int _x, int _y){
        x = _x;
        y = _y;
    }
}
class ManhattanPt extends Point {
    int x;
    int y;
    ManhattanPt(int _x, int _y){
        x = _x;
        y = _y;
    }

}

A : 两个类中 {} 包含了三个元素。x 和 y 是表示点的坐标,但是构造函数里面包含什么呢?(批注:构造函数是同类名的函数)


Q : CartesianPt 和 ManhattanPt 各自的构造函数里面包含各自的字段值。

A : 那怎么使用构造函数呢?


Q : new 关键字作用于构造函数,会创建一个新的该类型实例。

A : 这样子呀。


Q : 比如下面的代码:

new CartesianPt(2,3);

使用 CartesianPt 的构造函数,创建一个 CartesianPt 实例。

A : 这样创建的 CartesianPt 实例 ,其字段 x 值为 2,y 值为 3。

class CartesianPt extends Point {

还有 extends 关键字表示创建的 CartesianPt 也是 Point。


Q : 对。那么下面代码是创建一个 ManhattanPt 实例吗?

new ManhattanPt(2,3);

A : 是,它也有 x 值为 2,y 值为 3。


Q : 构造函数就这样?

A : 基本是了,但在没有定义过构造函数的代码里,以前用过构造函数。这是怎么实现的呢?


Q : 比如 Salt 和 Pepper 没有任何字段,但是它们有个默认构造函数。

A : 这是正确使用默认构造函数的方式吗?


Q : 是的。默认构造函数没有包含字段值。使用 new 关键字创建实例时,创建的实例没有字段值。

A : 好,下面这段代码呢?

new Point()

Q : Point 是一个抽象类,它是不完整的类,所以 new 关键字不能创建 Point 实例。

A : 这就说得通了,继续。


Q : 以下定义的类是另一种抽象数据类型和它的具体数据类型吗?

abstract class Num {}
class Zero extends Num {}
class OneMoreThan extends Num {
    Num predecessor;
    OneMoreThan (Num p) {
        predecessor = p;
    }
}

A : 是的。它们定义了一种抽象数据类型和两个具体数据类型。
图 1.2 Num 类关系图

wechatimg5


Q : new Zero() 是 Num 的实例吗?

A : 明显是的。就像 new Salt() 是 Salt 的一个实例。


Q : new OneMoreThan(new Zero()) 是 Num 的实例吗?

A : 是。OneMoreThan 继承了 Num,new OneMoreThan() 是一个 OneMoreThan 实例,本身也是一个 Num 实例,并包含了一个 Num 实例(这里是指new Zero())。


Q : 为什么 OneMoreThan 可以这样实现?

A : new Zero() 是一个 Num 实例,OneMoreThan 的实例创建时,包含了 Zero 的实例。


Q : 包含 Zero 实例?

A : OneMoreThan 的实例拥有一个值叫做 predecessor,即这个值可以是 new Zero()。


Q : predecessor 只能是 Zero 的实例?

A : 不是的。Num predecessor 说明了 predecessor 是一个 Num,所以具体表现为 OneMoreThan 或者 Zero 的实例。


Q : 那 new OneMoreThan(new OneMoreThan(new Zero()))呢?

A : 一个 Num 的实例,最外层的 new OneMoreThan 拥有了一个 Num 的实例:new OneMoreThan(new Zero())


Q : 那 new OneMoreThan(0)?

A : 胡说,0 不是一个 Num 。


Q : new Zero() 和 0 一样吗?

A : 不一样,虽然 new Zero() 和 0 概念相似,但不一样。


Q : new OneMoreThan(new Zero()) 和 1 概念相似?

A : 是的,但是他们是不一样的。


Q : new OneMoreThan( new OneMoreThan( new OneMoreThan(new Zero())))和哪个数概念相似?

A : 3


Q : Num 比 boolean 多吗?

A : 多很多。


Q : 比 int 多吗?

A : 不。


Q : 说下 new Zero() 和 0 的区别呢?

A : 我们得区别它们。new Zero() 是 Zero 的一个实例,意味着也是 Num 。0 是一个 int。


Q : 正确。不同数据类型的实例就是不同的。

A : 类型是一系列实例的统称。


Q : 基本类型(int 和 boolean)是不同的。

A : 那些不是基本类型呢?


Q : 类定义不引入基本类型,比如上面提到的 new Zero() 不单单是 Zero 的实例,也是 Num。任何继承 Num 的数据类型都是。

A : 然后呢?


Q : 就像每个数据类型继承 Object。

A : 就是说,所有类都是一个对象。


Q : 正确,下面有所体现。

A : 好的。


建议一:
自定义数据类型时,使用抽象类
自定义具体数据类型时,使用 extends 关键词继承抽象类


Q : 看看下面的定义?

abstract class Layer {}
class Base extends Layer {
    Object o;
    Base(Object o) {
        this.o = o;
    }
}
class Slice extends Layer {
    Layer l;
    Slice(Layer l) {
        this.l = l;
    }
}

A : 定义了 Layer 抽象数据类型和其两个具体数据类型 Base 和 Slice。其中 Base 包含一个值对象 Object。


Q : new Base(new Zero()) 是什么?

A : 一个 Base 的实例,即是 Layer 又是 Object 的实例。


Q : new Base(new Salt()) 是什么?

A : 一个 Base 的实例。但 new Base(new Salt())new Base(new Zero()) 是同一个数据类型吗?


Q : 是的。因为对象实例由 new 关键字创建,而它们都是 Base。

A : 因为 Base 包含的值对象是 Object。所以可以是 new Salt()new Zero()


Q : 任何都是个 Object 吗?

A : new 关键字创建的都是对象。自然 String 、Arrays 也是对象,这里我们不展开讲。


Q : 是的。下面的是 Layer 实例吗?

new Base(5)

A : 5 没有通过 new 创建,所以这个错误的语法。


Q : 下面的是 Layer 实例吗?

new Base(false)

A : false 没有通过 new 创建,所以这个错误的语法。


Q : 下面的是 Layer 实例吗?

 new Base(new Integer(5))

A : 是的。 new Integer(5) 创建了一个 int 对象。


Q : 那么怎么创建一个 Layer 实例拥有 false?

A : 简单:

 new Base(new Boolean(false))

Q : int Integer / boolean Boolean 混乱了?

A : 以后会涉及到。


Q : 期待更多吧。

A : 迫不及待。

Posted in 技术, 网络

用 Wireshark 图解:TCP 三次握手

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

tcp00

“snow warn throughout the winter”

一、什么是 Wireshark ?
简单地说,Wireshark 是抓包工具。官网说,“Wireshark 是一个网络包分析工具。 网络数据包分析仪将尝试捕获网络数据包并试图尽可能详尽显示该数据包。”

推荐一本书《Wireshark 网络分析就这么简单》,Wireshark 工具下载地址 https://www.wireshark.org/download.html。

Wireshark 不单单能抓包,主要的 Features 是对数据包进行各种的分析。下载打开界面非常简单直观:

tcp01

最上面是 Packet List 窗口,它列出了所有网络包。

在 Packet List 中选定的网络包会详细地显示在中间的 Packet Details 窗口中。

最底下是 Packet Bytes Details 窗口(16 进制数据),我们一般不会用到它。

 

二、我们抓什么包呢?如题 TCP
TCP 一脸懵逼。记得上次在 《图解Http协议》得知,HTTP 是一个客户端和服务器端请求和响应的标准TCP。其实建立在 TCP 之上的。那我们就抓 HTTP,这很简单。

 

三、实操 Wireshark

选择 Capture – Options,选择当前网络,点击 Start 。如图:

tcp02

浏览器打开我的博客 www.bysocket.com ,然后在 Wireshark 中的过滤器输入博客 IP 过滤:ip.addr == 106.14.40.18

选择第一行,如第一张图,简单介绍下 Packet Details 窗口参数详情:

Frame – 物理层
Ethernet – 数据链路层
Internet Protocol Version – 网络层
Transmission Control Protocol – 传输层

大家知道 网络层次划分为 标准的OSI七层模型,还有 TCP/IP四层协议 以及 TCP/IP五层协议。如图:

其中,Transmission Control Protocol – 传输层是我们最为关心的。如图已经展开了:

tcp04

具体我们先学习 TCP 报文段格式:

tcp05

那么第二个红框,由上至下,一一大家可以对应下,重点的是:
Sequence number – 序号
Acknowledgment number – 确认号
Flags – 标志位
— Acknowledgment 确认位
— Push 急迫位
— Reset 重置位
— Syn 同步位
— Fin 终止位

a. 第一次握手标志位
localhost Seq=0 -> 博客地址
从标志位看出,同步位有值,在做请求(SYN):Syn 同步位为1
tcp06

 

b. 第二次握手标志位
博客地址 Seq=0 Ack=1 -> localhost
从标志位看出,确认位、同步位有值,在做应答(SYN+ACK):Syn 同步位为 1 、Acknowledgment 确认位为 1
tcp07

c. 第三次握手标志位
localhost Seq=1 Ack=1 -> 博客地址 (注: Seq=Seq+1)
从标志位看出,只有确认位有值,在做再次确认(SYN):Acknowledgment 确认位为 1
tcp08
综上所述,一个完整的三次握手就是:请求(SYN) — 应答(SYN+ACK) — 再次确认(ACK)

tcp09

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in 清文

、北京北京

北京北京

单曲循环汪峰的歌

写下对北京的回忆

几词文,几处景,两友人,一米厂

糖葫芦

大包子

油条

还有第一晚可怕的雾霾

凌晨落地的景色,候机前写了

《试错》

是不是你和我一样

每当夜深安静迷茫

总是想的太多

却每次都被时间浇熄

30岁的眼泪

还是那么不切实际

盼望地

以为爱情能解脱生活的狼狈

所以别要求太多

不错过那些努力可以解决的东西

无法长大

也就不要学着别人挣扎

往想去的地方飞

走过看过听过去试错

然后去了第一处景

北京 798 艺术区

知道了

曹勇(画家)

一位由画而生的旅者

说过

“人的生命很短暂,一定要到绘画的最高舞台去。”

停下买了个糖葫芦,写了

《穿越文艺区》

摄影展

先穿越到照片当时当地

手机没电了

停下步来

随处而安喝一小杯

充会电

再前行

切景至天安门

不想多说 人多

晚上寄宿友人

聊拉家常

约早另一友人

逛米厂中

和现在工作一样呼吸节奏

听说老雷

在对面那个高楼中

眺望

昨夜的大风

刮走了雾霾

漫步人少的颐和园里

止步写了两句

秋离冬至踏园中

高柳随风舞骚影

然后

北京北京

再会

Posted in Working Skills, 技术

Java Web 工作技巧总结 16.10

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

在你成为领导者以前,成功只同自己的成长有关。
当你成为领导者以后,成功都同别人的成长有关。

1.聊聊并发插入&代码

场景:业务中有些ERP第三方调用该接口,导致多组同样的数据包会调用同一个插入接口。一般都是XXXParamList,一个批量插入的接口。

首先聊聊批量插入的代码,一般都会这样搞,伪代码

for(XXXParam xxx : XXXParamList)
validationXXXParam(xxx);
XXXDao.batchInsert(XXXParamList)

a.前端 – 灰色按钮
就是提交的时候控制,不能重复条form或者ajax。
b.后端 – 分布式锁
分布式锁的资料上次分享过:传送门 ->
http://www.cnblogs.com/PurpleDream/p/5559352.html
c.数据库 – UK
在数据库建表中设计时,设置 SQL UNIQUE 约束:传送门->
http://www.w3school.com.cn/sql/sql_unique.asp

2.继续说说数据库字段设计

技巧1 关系表 -> JSON Text字段
场景:比如商品详情页面,白色Apple,金色Apple…对应的图片显示。这样针对goods寸一条记录,记录着有个字段是 sku_image:
goodsid {[“白色”:“url”],[“金色”:“url”]}

而且Text字段是不对的。应该约定好大小,比如 VARCHAR(1000)
为啥呢?其实每次get都是流量,转换成流量方向想,那就是带宽,大字段如果在高流量高并发的情况下,容易造成查询量太大,会造成网关超过带宽。

有时候登录线上数据库PM后台,忘记了某表的字段,但只知道某表。我是这样干去取代 DESC table_name 或 SHOW CREATE TABLE table_name,SQL 很简单
SELECT * FROM XXX WHERE 1 LIMIT 1;
直接可以看到列名,修改下 WHERE 里面的条件就可以查询你想的查询的。

3.grep 命令

一般日志用过日志中心查询,但是更多情况下,单机下都会跑到服务器上直接找到自己想要的日志相关。
我是这样的,找到某异常XXXException
cat xxx.log grep ‘XXXException’
然后显示该行上下几行内容,使用 -C 参数输出匹配行的前后各4行
cat xxx.log grep ‘XXXException’ -C 4

grep 小命令 详解:传送门
https://linux.cn/article-5453-1.html

4.Maven 骨架工程

来到公司,发现小项目一个接一个地上。说罢就想起前东家的骨架工程。
很简单的就能生成 HelloWorld 项目,XXXarchetype 是我开发的估计工程依赖。生成骨架项目关键代码:
mvn archetype:generate -DgroupId=com.TT -DartifactId=helloworld -DarchetypeGroupId=com.TT -DarchetypeArtifactId=com.TT.XXXarchetype -DarchetypeVersion=0.0.1-SNAPSHOT -DinteractiveMode=false

详细教程,传送门->
http://www.voidcn.com/blog/aosica321/article/p-5764716.html

5.DO BO 互转工具

一般这种都是代码生成器,兼Java配置项。作用于两种业务model的互转:
mapstruct(效率最高)、orika(最快)、dozer(用的多)
详细教程,传送门
http://www.tianshouzhi.com/api/tutorials/mapstruct
http://blog.csdn.net/a258831020/article/details/48247187

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in Spring, 技术

带着问题学 Spring MVC 源码: 一、概述

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

简单就好,生活可以很德国

Q:什么是 Spring MVC ? ※

Spring MVC 是 Spring Web 的一个重要模块。Spring 支持 Web 应用,Spring MVC 是对 MVC 模式的支持。

Q:MVC 模式? ※

MVC 模式是种经典的软件架构,分 Model 模型、View 视图及 Controller 控制器 三种角色。架构的意图明显区分三种角色的职责,使其不相互依赖。Java 领域最经典的实现 JSP + Servlet + JavaBean,后续也陆续出来了众多优秀框架,SSH 中的 Struts ,还有 SSM 中的 Spring MVC 等。mvc%e6%a8%a1%e5%bc%8f

 

Q: Spring 还要什么其他模块? Web?IOC 容器?AOP?※

IOC 容器模块、AOP 模块都是。还有数据访问/集成、Web 等模块都是。这里其他不展开讲,其中 Web 模块建立在 IOC 容器之上,要记住。

来自官网的模块图:spring-overview

Q: Web 模块包含 springmvc 吗? ※

包含。Web 模块包含 spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet。其中 web-mvc 是我们要学习源码包。

1. spring-web 模块提供基本 Web 集成功能,包括初始化 IOC 容器等工作。

2. spring-webmvc 包含 MVC 模式的实现和 REST Web 服务的实现。该模块基于了 spring-web 模块。

资料来源自:官方文档 MVC 章节,其他模块具体参考官网。

 

Q: spring-webmvc 模块具体包含什么内容? ※

spring-webmvc 模块里面包:

  • org.springframework.web.servlet
    提供与应用程序上下文基础结构集成的 Servlet,以及 Spring web MVC 框架的核心接口和类。
  • org.springframework.web.servlet.mvc
    Spring 附带的 Servlet MVC 框架的标准控制器实现。

    • org.springframework.web.servlet.mvc.annotation
      用于基于注解的 Servlet MVC 控制器的支持包。
    • org.springframework.web.servlet.mvc.condition
      用于根据条件匹配传入请求的公共 MVC 逻辑。
    • org.springframework.web.servlet.mvc.method
      用于处理程序方法处理的基于 Servlet 的基础结构,基于在 org.springframework.web.method 包上。
  • org.springframework.web.servlet.view
    提供标准的 View 和 ViewResolver 实现,包括自定义实现的抽象基类。

    • org.springframework.web.servlet.view.freemarker
      支持将 FreeMarker 集成为 Spring Web 视图技术的类。
    • org.springframework.web.servlet.view.json
      支持提供基于 JSON 序列化的 View 实现的类。

上面列出来核心的包。org.springframework.web.servlet.view 包中, View 视图实现有常见的:JSON 、FreeMarker 等。org.springframework.web.servlet.mvc 包中,Controller 控制层实现包括了注解、程序方法处理等封装。自然,看源码先从 org.springframework.web.servlet 包看其核心的接口和类。

Q: 核心类和接口有哪些? ※

DispatcherServlet 类:调度HTTP请求控制器(或者处理器Handler)。

 

View 视图层

ModelAndView 类:模型和视图的持有者。

View 接口:MVC WEB 交互。该接口的实现负责呈现视图或者暴露模型。

 

Controller 控制层

HandlerMapping 接口: 请求从 DispacherServlet 过来,该接口定义请求和处理程序对象之间的映射。

HandlerInterceptor 接口:处理程序的执行链接口。

Q: 又是 MVC 的样子,还有吗? ※

哦。对了还有张图:

mvc

所以重要的类还有 ViewResolver、HandleAdapter等。

Q: 谢谢,下篇聊什么?

当然聊重要类的源码实现咯~,下篇见。

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in 清文

随记 9.26

72e172b3gw1f5tlp60gryj20je0m8ta0“不知道,觉得今天想要记点什么,我就记了。”

下班早早一天:

站在红绿灯人行道 闭嘴

车流 喇叭 

人流 嘴炮

车灯像一道光

人影是一群丧尸

奔走在躁动的城市里

嗑完一包最爱核桃味瓜子,顺便赏完一部励志:Front Of The Class 影评

《Front Of The Class》励志,值得看。
中文名翻译成《叫我第一名》,一位帅哥 Jimmy Wolk 主演主人公。他表现了就是生活中的第一名,表现了做自己的第一名。
电影中,倔强的主人公外壳和工地里的保护帽一样坚固。他是出色的小学老师,孩子的启蒙者,给孩子带来属于他们的教育童年。这时我想起了,我童年常在我妈妈房间的沙发中睡觉,满满回忆里都是妈妈告诉我她的一生故事点滴。就这样,他却患有让他不能像正常老师一样上课的病,但恰恰让孩子们和接受一个人会不由自主打喷嚏一样,接受了他。he did it!
还有那个小女孩,那个小胖男。他在像他初中校长一样,挽救树立了孩子的心灵的方向。这件事情恰恰是他最想完成,最最想做的事情。
没有什么悲情,只有看到他乐观中的欢笑,欢笑中的感动。