DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

决定去另一家的创业公司,也就是意味着之前的经历失败了。。

经过一个星期的煎熬,其实也不意外。自己还是把创业这部分想的太理想化,太简单了。。以为有人,有比自己强的人就够了,其实,远远不够,最后还是归结到做工程上。

其实,自己还是比较看重创业中”慢”节奏。只有慢,才能夯实基础,慢,才能找到相关的节奏,快并不是创业公司唯一的节奏。

想清楚,自己未来的一部分方向,应该是基础架构以及软件这块。争取做出来,能够把基础软件部分从无到有,做起来,往自己的兴趣做下去。

傻,慢,坚持自己的想法,固执地做下去,往自己的兴趣做下去

加油 ^_^

说实话,这几天,有很大的落差。心中,对于创业公司一丁点的好感,似乎,有点消耗殆尽。交流用微信,排期计划没有预期,沟通的不规范性,等等,周乾,马波各种说屎一样的东西,让人感觉没有交流的共同点。让人感觉绝望。

李辉戏言的,让我回去,基本不可能。走的时候,领导们都没找我,我回去了也不会接受,再说,我回去能干啥,面子确实是一个很大的问题,其次,发展总归是要想到的问题。

有点为自己这个说走就走的决定感到后悔了,之前,觉得有马波带着,还有可以跟周乾学习,现在有点看起来像是一个甜蜜的”陷阱”。

不过,接触到的人,对于代码,对于技术,都还有些追求,这真是值得庆贺的事情。

明天要跟瀚总吃饭,跟瀚总吐槽,能去瀚总那吗?呵呵。

总要为自己的决定负责,不管是好的,还是坏的,从中去学习自己想学习的东西,去看下别人是怎么学习,去看下别人是怎么要求自己的。之前做决定的时候,已经有了失败的打算,大不了,创业失败之类,就当学习半年之类的。

还是一点,在这种情况下,逼自己多去学习,多去了解不同的东西,不悔决定!

restcontroller

@restController的注解,相当于@Controller和@ResponseBody的集合,相当在类上加上@ResponseBody的注解。同时,在RestController的注解中,还包含@Async的部分。

security

关于spring-boot-security部分,采用SecurityProperites的方式,来进行configure,实现HttpSecurity和AuthenticationManagerBuilder

default

java8中针对接口部分,可以利用default来实现具体方法,类似于不用abstract类的方式

jpaReposity

jpa的注解方式,在注解中写sql,

redisTemplate

关于redis部分,一般的使用

1
2
3
4
5
6
7
8
9
10
11
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(20);

jedisPool = new JedisPool(jedisPoolConfig,
NightConfig.getConfigValueByKey("nightingale.query.redis.host"),
NightConfig.getConfigIntValueByKey("nightingale.query.redis.port", 6379));


Jedis jedis = jedisPool.getResource();
String value = jedis.get(key);
jedisPool.returnResourceObject(jedis);

这样的使用,导致每次需要显式地释放redis链接,代码的倾入性太高。

这时候,可以使用RedisTemplate封装相关的redis,避免每次显式释放链接的痛苦。原因在于每次redis执行时,相当于redisTemplate执行一个叫做RedisCallback的东西,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
try {

if (enableTransactionSupport) {
// only bind resources in case of potential transaction synchronization
conn = RedisConnectionUtils.bindConnection(factory, enableTransactionSupport);
} else {
conn = RedisConnectionUtils.getConnection(factory);
}

boolean existingConnection = TransactionSynchronizationManager.hasResource(factory);

RedisConnection connToUse = preProcessConnection(conn, existingConnection);

boolean pipelineStatus = connToUse.isPipelined();
if (pipeline && !pipelineStatus) {
connToUse.openPipeline();
}

RedisConnection connToExpose = (exposeConnection ? connToUse : createRedisConnectionProxy(connToUse));
T result = action.doInRedis(connToExpose);

// close pipeline
if (pipeline && !pipelineStatus) {
connToUse.closePipeline();
}

// TODO: any other connection processing?
return postProcessResult(result, connToUse, existingConnection);
} finally {

if (!enableTransactionSupport) {
RedisConnectionUtils.releaseConnection(conn, factory);
}
}

从上面的代码可以看到,运行完action后,最后都会有finally,通过RedisConnectionUtils去releaseConnection,从而避免我们写的代码里去显式地调用释放链接

json部分

json这块可以使用Jackson或者Gson

jackson的注解为JsonAutoDectect,同时辅以JsonIgnoreProperites来使用,有一个mapWrapper来写

gson部分,使用New GsonBuilder.create().toJson的方式,同时辅以@Expose的注解,表明序列化哪一个field,从而起跟上面一样的反效果。不过需要使用

1
new GsonBuilder.excluedFieldWithoutExposeFields().create()

注解相关

@Configuration

@SpringBootApplication 表明是一个spring-boot的程序

@Cached redis相关?

@EnableAutoConfiguration tells Spring Boot to start adding beans based on classpath settings, other beans, and various property settings.

@PropertySource 跟autoConfiguration配对?

@ComponentScan 相关controller和service的扫描

@Bean

python爬虫

漫画抓取

关键函数说明:

1
2
3
4
5
6
7
8
def getImglink(page):
imgsoup = BeautifulSoup(p.text, 'lxml')
imglink = imgsoup.findAll('img')

for z in range(len(imglist)):
img = requests.get(imglist[z-1])
with open(str(z)+'.jpg', 'wb') as f:
f.write(img.content)

async Servlet

servlet 3提供 async servlet的机制,

首先,支持@WebServlet的注解,

Tomcat’s Comet, WebLogic’s FutureResponseServlet and WebSphere’s Asynchronous Request Dispatcher are some of the example of implementation of asynchronous processing

tomcat io模式

三种策略:

  • BIO 默认开启的模式,阻塞IO
  • NIO
    利用java的非阻塞IO技术
1
protocol = 'org.apache.coyote.http11.Http11NioProtocol'
  • APR

NIO + APR模式的库,这种模式是基于JNI的,即JAVA调用本地库的方式进行IO

tomcat对静态资源的处理

defaultServlet

zero-copy的特性,sendfile之上的tomcat

netty零拷贝

使用列表

列表同数组的区别:

  • 列表为不可变的
  • 列表具有递归结构,但数组是连续的

所有列表可以通过Nil和::来构造出来,

连接列表 :::

length

last/init head/tail

reverse

归并排序

1
2
3
4
5
6
7
8
def merge(xs:List[T], ys:List[T]):List[T] =
(xs, ys) match {
case (Nil, _) => ys
case (_, Nil) => xs
case (x::xs1, y::ys1) =>
if(less(x,y)) x::merge(xs1, ys)
else y::merge(xs, ys1)
}

折叠列表,类似二叉树? /: :\

(z/:List(a, b, c))(op)等价于op(op(op(z,a),b),c)

列表排序 sort

集合类型

ListBuffer

ArrayBuffer

Queue

Stack

1
2
3
val counts = mutable.Map.empty[String, Int]

val counts = Map("i"->1)

有状态的对象

函数式(不可变)对象 有状态的对象

var变量x的getter方法命名为x, setter方法命名为x_=

1
var a:Float =_

=_ 初始化默认值,

类型参数化

更好地编写泛型类和trait