111qqz的小窝

老年咸鱼冲锋!

lua学习笔记

lua是一门轻量级的脚本语言…好像比较适合写游戏?在 太阳神三国杀 中见过很多lua脚本。 由于splash 的渲染脚本需要用lua来写,因此来学习一波。

直接上语法…看到了python和pascal的影子orz

 

golang 学习笔记

先放资料,可能比较侧重于go在系统调用方面的内容.

这里不会记录详细的go的语法,只会记录学习的过程,踩到的坑,以及其他我认为值得记录的内容.

go的switch语句终于是人类思维的语句了…匹配中了不需要加break..

defer关键字可以延迟语句到上层函数退出时再执行,而且是会把延迟的语句压入栈,然后按照FILO的顺序执行…好像有点有意思?

参数列表..如果有多个变量的类型相同,只写一个类型关键字就行…

:=并不是pascal中的赋值符号(浪费感情…,而是简洁定义变量的语法,不能使用在函数以外.

感觉go中同时有一点C++和很多python的影子…

 

 

 

30分钟上手GO语言–基础语法

A Go Programmer’s Guide to Syscalls

视频笔记:Go 和 syscall – Liz Rice

爬虫学习笔记

再次迫于生计。。。

 

参考了面向新人的 Python 爬虫学习资料

大致的学习路线为:

一: 简单的定向脚本爬虫( request — bs4 — re )

二: 大型框架式爬虫( Scrapy 框架为主)

三:浏览器模拟爬虫 ( Mechanize 模拟 和 Selenium 模拟)

有Python基础和一点html基础的话。。。貌似上手是0难度的

年轻人的第一个爬虫(虽然代码是直接copy的…

 

年轻人的第二个爬虫:https://github.com/111qqz/spider-demo,爬了我家一周的天气情况

爬虫能够work我觉得主要取决于两个因素

一个是,一个网站的网页源码,其实是在我们本地存储的

另一个是,网页的代码是有规律的…

所以初级的爬虫的难度就仅仅在于找规律。。。然后配合chrome 开发者工具的模拟点击功能和 xpath这种文本解析工具… 就可以搞定了。。。

关于反爬虫的处理办法,以及如何提高爬虫的速度,可能才是“爬虫工程师”的核心技能?

参考资料:

BeautifulSoup官方文档,一个将html数据结构化的python库

Scrapy官方文档,一个爬虫框架

 

java-grpc 踩坑记录

最近的项目需要java和python之间的进程通信,想到了之前使用过的的grpc.

参考官方quickstart

  • JDK: version 7 or higher

看起来只依赖jdk,美滋滋

然后按照文档执行

./gradlew installDist

报错:

看起来是gcc或者clang的问题… 先装个clang再说,可能clang太常用了,所以文档没有提到,这下一定可以了。

然而又报错:

??????

看起来是stdc++的lib没有找到。

在centos上安装了:libstdc++.x86_64 4.8.5-28.el7_5.1 @updates
libstdc++-devel.x86_64 4.8.5-28.el7_5.1 @updates
libstdc++-static.x86_64

这回一定没问题了吧?

然而继续报错,变成了javedoc找不到

简直了。。。grpc的文档还是一如既往的辣鸡。。。目前还在坑里面,先把前面踩的坑记录一下。

然后继续报错:

 

好像不是很对啊…

文档固然辣鸡,但是会不会有其他打开方式?

于是跑到工程院那边请教了同事…发现果然打开方式不正确…

正确的方式是直接在依赖管理工具如maven中添加,并不需要手动编译安装…

参考这个搞它一发先

同时按照maven-in-five-minutes 了解一下maven的使用

Although hardly a comprehensive list, these are the most common default lifecycle phases executed.

  • validate: validate the project is correct and all necessary information is available
  • compile: compile the source code of the project
  • test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
  • package: take the compiled code and package it in its distributable format, such as a JAR.
  • integration-test: process and deploy the package if necessary into an environment where integration tests can be run
  • verify: run any checks to verify the package is valid and meets quality criteria
  • install: install the package into the local repository, for use as a dependency in other projects locally
  • deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

There are two other Maven lifecycles of note beyond the default list above. They are

  • clean: cleans up artifacts created by prior builds
  • site: generates site documentation for this project

发现mvn package的时候会报几百行的错误

于是先执行mvn validate验证一下情况,
最上面的错误如下:

参考An exception occurred when I use maven plugin, Why?  发现可能是maven版本不行,去官网下载了目前的最近版本3.5.4,ok了

下一步该进行mvn compile,也ok

然后是mvn test,又是几百行错误…核心的信息是java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument

参考java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument

添加了两个依赖(再次吐槽grpc-java官方文档&demo的不靠谱)

似乎是ok了.

然后执行mvn package,继续报错,好在只有几十行…

摘重点: Unable to find a single main class from the following candidates

看样子是找不到程序入口在哪里了…好像很合理,毕竟grpc-java的example里每个文件都带了main函数

参考SpringBoot: Unable to find a single main class from the following candidates,在pom.xml中添加如下的属性就行了.

 

然后另一边,将python的server启动起来

注意ip和端口号要保持一致. ok了

 

最后的代码请参考grpc-java-maven-exmaple

2018 to do list

迫于最近的事情有点多,还是记录一下。 果然to do list什么的,还是要按照年份记录啊。

  • 了解linux strace命令
  • 速成go语言,并了解go于系统调用https://hackernoon.com/strace-in-60-lines-of-go-b4b76e3ecd64
  • 熟悉hustoj V2版本目前的代码
  • 看完<code in practice>
  • mit 6.828 lab1。。。感觉要咕
  • 看完<unix 系统系统手册>的20,21章信号部分, 为hustoj的重构补充基础知识.

spring 学习笔记

迫于生计,又要从零开始学习spring.

在这篇文章之前,对java的基础是2015年写过一个java大作业,对spring是一无所知。

为了学习spring,我按顺序做了以下事情:

 

 

 

 

 

 

[spring] 依赖注入

真是个不明觉厉的术语…其实是个特别简单的概念orz

用白话讲,如果一个class A中用到了class B的实例,那么class B的实例就是class A的依赖,如果不是在class A中定义class B的实例,而是通过某个接口,将class B的实例传入classA,就叫依赖注入。

 

依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不开谁。

简单来说,a依赖b,但a不控制b的创建和销毁,仅使用b,那么b的控制权交给a之外处理,这叫控制反转(IOC),而a要依赖b,必然要使用b的instance,那么

  1. 通过a的接口,把b传入;
  2. 通过a的构造,把b传入;
  3. 通过设置a的属性,把b传入;

这个过程叫依赖注入(DI)。

那么什么是IOC Container?

随着DI的频繁使用,要实现IOC,会有很多重复代码,甚至随着技术的发展,有更多新的实现方法和方案,那么有人就把这些实现IOC的代码打包成组件或框架,来避免人们重复造轮子。

所以实现IOC的组件或者框架,我们可以叫它IOC Container。

作者:phoenix
链接:https://www.zhihu.com/question/32108444/answer/220819349
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考资料:

Dependency Injection Demystified

What is dependency injection?

 

 

codeforces 501 B. Obtaining the String

题目链接:http://codeforces.com/contest/1015/problem/B

题意: 给出字符串s和字符串t,问一个将s变为t的策略。 可以做的变换为,交换s中相邻的字符串,该操作最多不能超过4000次,字符串长度最大为50.

思路:

首先可以确定,当两个字符串的组成相同时(也就是有同样的字符组成,只是位置可能有所不同)一定有解。

考虑最坏情况,每个字符都要交换到最远的地方,总的操作数<50*50<4000,因此一定有解。

判断组成是否相同可以用multiset

 

 

codeforces edu #51 C. Vasya and Multisets (思维题)

题目链接

题意:有n个数,现在要分成2个集合,使得2个集合中,仅出现1次的数的个数相同,问是否有解,以及具体的分法。

思路:

一开始考虑出现多个的数的思路麻烦了,比如对于出现2次的某个数x,与其一个集合中分得一个,使得两个结合中,仅出现1次的数的个数各+1,还不如都放在同一个集合中,使得仅出现1次的数的个数不增加。

因此思路是这样的:

先考虑出现1次的数的个数,如果为偶数,那么均分,然后把其他出现多次的数全都放在第一个集合;

如果出现1次的数的个数为奇数,我们还是尽可能均分,然后不妨假设第一个集合中的只出现1次的数的个数比第二个集合中多1个。

我们现在需要让第二个集合中,仅出现一次的数增加一个。

什么样的数可以满足这个条件呢? 出现2次的数是不行的,因为这会使得两个集合中的数字各自+1

因此需要至少有一个出现3次或者以上的数。

具体见代码: