网络寻租

Programmer, Gamer, Hacker

考虑摩托车

| Comments

现在我用的小电驴很好用, 是爱玛摩卡, 现在已经停产了, 长得这样:

image

它的好处是:

  • 非超标, 不需要上牌.
  • 可以载两个人, 后面的座位高度适合成人, 有靠背很安全.
  • 足够小, 可以上小型电梯, 城里面开起来非常顺畅.
  • 踏板上面可以放下很大的东西, 适合运货.

但是也有以下问题:

  • 速度最高30, 不够快.
  • 续航不行, 没法出城.
  • 轮子小通过性不好.
  • 没有左右转向灯, 速度表等实用安全配置.

解决办法有两个: 短途还是小电驴, 出城就靠汽车+折叠自行车. 或者买一个摩托车.

我考虑摩托车的方案. 摩托车使用上面相对电动车来说会更复杂一些, 毕竟是机械机构. 但是动力, 续航, 安全都比电动车好太多.

摩托车和汽车类似, 质量好的一般是合资日企, 比如本田. 所以我尽量还是在合资品牌里面选, 少折腾.

摩托车的样式主要有跨骑,弯梁和踏板. 区别在这里, 主要就是跨骑速度快续航高, 但是低速不好开, 运不了货. 踏板相对容易坏, 轮子小通过性差, 弯梁不容易坏.

所以首先我看弯梁. 但是看了本田, 雅马哈, 铃木, 他们的弯梁车都挺丑的, 去店里面看实物也很丑, 实在下不去手. 看了一圈, 国内的摩托车丑的居多, 类似小电驴, 也没有什么美观的型号. 稍微好看一些的只有跨骑了. 但是各大跨骑车都挺大的, 也不方便运货, 生活上不是很方便, 并且我也不需要开太快的车.

image

后面发现还有小的跨骑车, 比如本田 MSX125, 国内很多仿制的, 但是我还是信不过质量.

还有踏板, 本田的自由Today挺不错的, 但是我不太想要踏板车了, 和电驴区别不大.

image

选来选去, 最后发现还是现在的摩卡适合我的需求, 摩托车还是算了.

如何挑选背包

| Comments

以前买的一个米黄色电脑背包已经用了很久, 一直被老婆吐槽太丑, 于是花了一些时间研究了一下买什么背包比较好.

首先看我的实际需求. 我现在在家工作, 虽然不需要通勤, 但是还是会会骑小电驴出门透气换地方工作, 偶尔出去短途旅行一下. 所以一个可以装电脑, 一周内换洗衣物的背包还是需要的. 老婆发过来的一些潮牌包包看起来不错, 但是一个耐用好用低调的包更适合我的想法.

首先看看市场上有什么可以选择的. 我去看什么值得买的原创评测, Google搜索backpack, 了解到了一些知名的背包品牌: 一部分是主流户外运动用品品牌, 一部分是数码背包品牌. 好的背包价格也不便宜.

为了能够更了解产品, 我在Youtube上面搜索大家经常提到的背包型号, 看看评测, 慢慢对于自己理想中的背包有了概念了.

首先细化我的需求: 可以带15寸笔记本, 方便长时间背着, 可以携带短途旅行的东西, 耐用, 美观, 可以背在前面防小偷.

研究出来的方案: 中等体积大小(22L-30L), 简易背负(无背负不舒服, 复杂背负太大太重), 独立电脑仓位(保护更有力), 足够体积的主仓位(放衣物以及以后运输的杂物), 带有侧袋可以放水杯. 颜色我更偏好黑色, 看起来更”商务”一些, 不浮夸.

考虑了这些品牌: Osprey, Incase, Gregory, Arcteryx, Colehaan, Wenger, 根据我的需求, 筛选了这些型号:

Osprey pixel, Incase EO Travel, Gregory SKETCH 22L.

然后就等合适的打折出来, 就可以买了.

不过我新买的笔记本到货, 急用包, 同时也看到亚马逊上面有7折优惠, 上去搜索了一下, 本来可以考虑Gregory SKETCH 22, 但是剩下的几个颜色不好看. 偶然翻到之前看到过的Osprey Momentum 26L, 感觉还可以, 就下单买了, 总价524还算可以吧.

两天就到货了, 兴奋地研究了各种配置, 包的做工比我旧包好多了, 感觉很硬实.

image

这是上身效果.

image

image

背上去舒适度算一般, 天热背还是会闷, 还算满足需求吧.

GNS3介绍,安装和使用

| Comments

GNS3是一个虚拟网络的工具,用它可以学习如何配置局域网,以及在实际进行物理配置之前测试是否工作正常.

我为什么要研究这个工具呢? 因为现在我的家用网络有一些需求需要进行复杂的路由配置, 实际配置出现问题很浪费时间, 不如用一个虚拟工具来测试研究. 如果你对如何搭建局域网或者有类似建网需求, 可以考虑用这个工具.

文档在这里, 我就不重复写怎么安装了. 在安装之前, 我先讲一下原理, 知道了原理, 后面过程会顺利很多.

原理

GNS3的底层是Dynamips, 一个虚拟Cisco路由器的模拟器. GNS3同时它也支持其他的虚拟系统, 比如Vmware, Qemu, Virtualbox, docker等, 用这些虚拟化工具来模拟路由和主机.

Dynamips是基于Linux的, 所以在Windows和MacOS下面, 为了能够正常使用, 需要安装一个GNS的虚拟机(里面安装的是Ubuntu), 因为它里面需要跑虚拟化(虚拟路由设备或者主机), 所以会出现嵌套虚拟, 推荐使用Vmware来安装, 用VirtualBox性能会比较差. 如果你是Linux系统, 建议直接用GNS Server.

GNS Server是GNS的后端, 一个python写的管理系统, 它会根据前端的配置, 创建对应的虚拟化系统, 比如你创建了2个主机(VPCS), 一个路由(比如用Qemu虚拟的RouteOS), 它会创建两个VPCS进程, 用Dynamips虚拟化一个路由, 把他们连接起来.

实际执行的命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# qemu RouteOS
/usr/bin/qemu-system-x86_64 -name RouteOS-1 -m 128M -smp cpus=1 -enable-kvm -machine smm=off -boot order=c \
  -drive file=/home/halida/GNS3/projects/routeos_simple/project-files/qemu/f280f531-91cd-4290-a61b-98d3299a2bb7/hda_disk.qcow2,if=ide,index=0,media=disk \
  -serial telnet:127.0.0.1:5000,server,nowait \
  -monitor tcp:127.0.0.1:54263,server,nowait \
  -net none -device e1000,mac=00:8f:b6:2b:b7:00,netdev=gns3-0 \
  -netdev socket,id=gns3-0,udp=127.0.0.1:10002,localaddr=127.0.0.1:10001 \
  -device e1000,mac=00:8f:b6:2b:b7:01,netdev=gns3-1 \
  -netdev socket,id=gns3-1,udp=127.0.0.1:10003,localaddr=127.0.0.1:10000 \
  -device e1000,mac=00:8f:b6:2b:b7:02 \
  -device e1000,mac=00:8f:b6:2b:b7:03 \
  -nographic

# vpc
/usr/bin/vpcs -p 5001 -m 0 -i 1 -F -R -s 10002 -c 10001 -t 127.0.0.1 startup.vpc

参数里面会做几件事情: 创建虚拟的网口, 绑定在本地机器的特定端口上面, 然后各个进程会通过这些端口来进行通讯. 同时也会把管理端口用telnet暴露出来, 方便前端用Console命令连上去配置.

安装过程

因为GNS的工具链主要在Linux, 我倾向于用Linux来装这样的测试环境. 所以里面推荐的GNS VM我就没有去装了.

安装完毕之后, GNS是不自带路由器的镜像的, 它提供一些简单的虚拟设备, 比如VPCS, 它其实就是一个单独的进程, 模拟一个主机设备, 带有设置IP, Ping等简易网络工具. 你需要自己导入路由的设备.

如果你是要模拟Cisco的设备, 可以在这里下载, 我是用来测试RouteOS的环境的, 直接在官方网站下载ISO镜像, 本地用Qemu安装.

选择虚拟系统: 如果是Cisco的路由器, 没得说, 只能用Dynamips, Dynamips一定要设置Idle-PC, 减少CPU性能消耗. 如果是其他基于Linux的路由系统, 在Linux下面, 我觉得Qemu比VirtualBox和VMWare都好用, 它性能更好一些. 当然用Docker这种内核共用虚拟性能会更好, 不过我没有尝试.

GNS下安装RouteOS, 首先要去官方下载ISO镜像文件, 然后执行命令行:

1
2
3
4
# 创建镜像文件
/usr/local/bin/qemu-img create -f qcow2 routeros-6.15.img 200M
# 跑虚拟机, 安装系统
/usr/local/bin/qemu-system-i386 -m 512 -enable-kvm -boot d -cdrom mikrotik-6.15.iso routeros-6.15.img

安装好之后, 就可以用GNS导入这个镜像, 进行使用了. 官方下载的ISO, 可以免费使用一天, 用来测试问题不大.

模拟实验

我做了两个模拟实验, 用来学习GNS的使用.

第一个是简单的RouteOS连接两个主机, DHCP分配IP地址.

image

用Console连上RouteOS-1, 进行这样的配置:

1
2
3
4
5
6
7
8
9
10
# 创建一个bridge, 把端口都连接起来
/interface bridge add
/interface bridge port add interface=ether1 bridge=bridge1
/interface bridge port add interface=ether2 bridge=bridge1
# 创建 dhcp, 给大家分配IP地址
/ip address add address=192.168.10.1/24 network=192.168.10.0 interface=bridge1
/ip pool add name=dhcp-pool ranges=192.168.10.10-192.168.10.254
/ip dhcp add name=dhcp-main interface=bridge1 address-pool=dhcp-pool
/ip dhcp network add address=192.168.10.0/24 gateway=192.168.10.1 netmask=24
/ip dhcp enable 0

然后就可以进到两台机器的Console里面, 执行ip dhcp自动获取IP地址, 用ping去看是否可以连接到另外一台机器.

第二个是简单的多路由通讯方案:

image

三个路由分别管理一个网段, 然后每个网段都可以通过路由的设置, 联系到其他网段里面的机器.

这里只列出来RouteOS-1的配置, DHCP部分和上面重复, 就不写了:

1
2
3
4
5
6
# 设置连接到其他路由器端口的IP
/ip address add address=172.16.10.1/30 network=172.16.10.0 interface=ether1
/ip address add address=172.16.12.1/30 network=172.16.12.0 interface=ether2
# 增加路由, 对方网段从哪里走
/ip route add dst-address=192.168.20.0/24 gateway=172.16.10.2
/ip route add dst-address=192.168.30.0/24 gateway=172.16.12.2

在新笔记本上安装Kdeneon

| Comments

最近我2012年底买的rmbp电脑越来越不给力,于是打算换一台新的笔记本,操作系统选回Linux. 为什么要用Linux而不继续买苹果呢,因为看新的苹果笔记本没有什么大的改进,还有我慢慢不喜欢苹果的软件锁死策略了, Linux可选性更高也更适合开发工作.

新的笔记本我选择Precision 5520 4K屏幕版本.价格比较贵(2万多). 为什么选这个呢,因为是我的主打生产笔记本,期待能够长期使用就选商用版本, 屏幕好一些可以坚持比较久,也对自己眼睛好点.

具体笔记本长什么样

见图册.

笔记本到货之后检查外观,检查系统配置是否和自己买的一样,检查屏幕是否有坏点.

安装Linux

现在回到主题,笔记本拿回来还是要安装Linux的.我选择Kdeneon作为发行版. 因为我对debian系比较熟悉,同时也更喜欢KDE桌面.KDE官方网站推荐这个版本.

官方网站下载稳定版Kdeneon, 下载之后检查了一下checksum防止下载错误,然后用UNetbootin烧录到USB闪存上面准备安装.

第一个坑:无法进入Live系统.查了一下发现是开源的nouveau驱动不支持新版的Nvidia显卡驱动,需要在启动的时候关闭,设置方法: grub里面Linux那一行尾部加上 nomodeset,之后就可以进入Live系统了.

系统安装好之后也要改,修改文件/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT后面加上nouveau.modeset=0, 之后执行sudo update-grub.

系统安装好之后,可以自动识别一下显卡驱动,执行sudo ubuntu-drivers devices,然后根据提示,安装对应的驱动版本,比如:sudo apt install nvidia-375.

第二个坑:磁盘无法识别,系统安装过程中提示Ubi-partman failed with exit code 141,发现是因为硬盘选项SATA->RAID中,用到了Intel RST driver,现在开源系统还不能很好地处理,需要换成其他设置.

第三个坑:无法休眠,我已经习惯苹果笔记本的合起来休眠功能,但是系统装好之后,却发现只有Sleep,却没有Hibernate. 找了一下, 发现是需要关闭Secure boot,不然无法控制休眠.回到BIOS关闭之后,执行systemctl hibernate成功了.

但是在KDE下面还是没有办法使用Hiberrnate,我下载了KDE的电源控制UIPowerdevil,看到原理是ibus查询org.freedesktop.login1.Manager的CanHibernate,后端是logind.根据这篇文档,增加了logind允许使用Hibernate的配置就可以了.

第四个坑:中文输入法.系统安装好之后没有UI设置如何选输入法,以及什么中文输入法比较好,找来找去,还是用ibus-pinyin吧. 安装:sudo apt-get install ibus-qt4 ibus-gtk ibus-gtk3 ibus-pinyin,启动执行ibus-setup.

但是各个窗口都没有办法输入中文,怎么办?查了以下,设置了环境变量之后,窗口才会响应输入法,环境变量设置方法如下:

1
2
3
export XMODIFIERS="@im=ibus"
export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"

其实不用自己手动选择,用im-config,它会修改~/.xinputrc,增加run_im ibus,在进入桌面环境的时候设置这些环境变量. 但是终端里面的环境变量还是要手动加到自己的shell初始化脚本里面.

第五个坑:4K屏幕分辨率,因为屏幕分辨率很高,窗口都会很小,在KDE下,可以通过设置Display->Scale解决. 不过还是有很多非KDE的程序,比如Steam,TeamViewer没有办法改,他们没有用到Qt的基础架构就没有办法scale了. 我现在暂时没有找到简单的解决方案,就放着吧.

第六个坑:PPTP客户端,设置好了之后,可以连接,但是连接之后本地的DNS死活解析不到,实在找不到原因,莫非是因为本地安装的dnsmasq的问题?现在只能用kcptun加ss解决问题.

好吧弄了那么久,终于可以正常使用系统了.

常用软件

这些是我常用的工具:

  • 基础支持: build-essential openssh-server default-jre curl
  • 常用软件: tmux zsh tree etherwake
  • 开发相关: emacs git-core ack-grep mysql-server redis-server

然后一些手动安装的工具:

  • Chrome: 官方下载
  • Steam: 记得安装源里面的,官方下载的安装有问题
  • proxychains-ng: github下载编译好的可执行文件
  • ss: 源里面就有
  • Dropbox: 官方下载
  • OverDrive: Google Drive linux客户端,需要购买

开发环境相关软件:

  • Virtualbox: 官方下载就好
  • oh-my-zsh: zsh配置环境
  • rvm: ruby环境
  • prax: linux下类似pow的工具,可以输入域名:app.dev,自动启动和访问本地的ruby项目.

研究如何给本地机器绑定域名

| Comments

我家里有一些机器,这些机器上跑了一堆虚拟机,虚拟机都直接桥接网卡, 这样每台机器都可以暴露出来给局域网访问。为了访问方便, 每个机器最好用名称访问,而不是用IP地址。 例如:两个虚拟机IP: 192.168.1.11,192.168.1.12,我希望可以用vps-sql,vps-dev的方式访问。

首先设置路由器的DHCP服务器,把这些机器的IP地址固定, 然后直接改自己电脑的/etc/hosts:

1
2
192.168.1.11 vps-sql
192.168.1.12 vps-dev

但是所有需要这个列表的机器都要改一遍,有什么更好的办法呢?

我的路由器是RouteOS,可以修改默认推送的DNS设置,以及增加DNS cache。 加了DNS cache之后,就可以直接访问了。

但是又有一个问题:我的工作用机器需要翻墙,翻墙了之后,就会用翻墙服务器的DNS,本地的DNS就取不到了。 万幸的是可以手动修改DNS采用本地的,不过用了本地的DNS,会被国内的GFW投毒, 获取一些国外网站域名信息的时候,DNS数据包会被劫持掉, 那么只有在本地搭建一个加密通讯的的DNS服务器。 话说回来为什么这么重要的基础服务居然还是明文的数据包传输?

我看了一下有dnscrypt,在本地的一台机器A上面装好, 把路由器的DNS设置为这个机器A就好了。 不过这样的解决方案不是很稳定,如果本地机器A挂掉,那么局域网就没有DNS服务,大家都不能上网了。

那么还有一个办法:就是注册一个短域名,把这些机器都绑定成子域名。 虽然这样会把本地网络的信息暴露给了全世界,但是想了一下也没有什么风险。

找了半天,买了一个便宜的llj.clicks域名,配置起来,总算完美地解决了这个问题。

长时API调用设计方案

| Comments

App B提供一个计算服务,App A需要访问这个服务。可以有两种模式:Pull和Push,各有优缺点。

App A请求App B之后,B返回Job ID, Pull模式下,A定时获取一下Job执行状况,当Job完成之后,A获得结果。 Push模式下,B完成请求之后调用A的Callback,发送结果给A。

Pull模式下网络通讯消耗更多资源,并且不能第一时间返回结果。Push模式需要AB端都提供接口,复杂度更高,并且callback有可能丢失请求。

伪代码如下:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Pull模式

# App A
result = HTTP.post "B/api/works", {type: 'square', value: "12"}
result == {job_id: 12, status: "init", percent: 0}
sleep 3
result = HTTP.post "B/api/jobs/12"
result == {status: "running", percent: 30}
sleep 3
result = HTTP.post "B/api/jobs/12"
result == {status: "done", percent: 100, result: 144}

# Push模式

# App A
result = HTTP.post "B/api/works", {type: 'square', value: "12", callback: 'A/api/check_job/:job_id'}
result == {job_id: 12, status: "init", percent: 0}

on 'api/check_job' do
  handle_result(params)
end


# App B

on 'api/works' do
  job = Job.create(params)
  Worker.perform_async(job.id)
end

on 'api/jobs' do
  Job = Job.find(params[:job_id])
  Job.as_json
end

class Job < Model
  def perform
    case self.type
    when 'square'
      self.percent = 10
      self.status = :running
      self.save

      sleep 3
      self.percent = 30
      self.save

      sleep 3
      self.result = self.value ** 2
      self.status = :done
    end
    if self.callback
      HTTP.post self.callback, self.as_json
    end
  end
end

class Worker
  def perform(job_id)
    job = Job.find(job_id)
    job.perform
  end
end

Ruby没有做到编程语言应该有的优化

| Comments

Ruby语言很慢。是的,这是一个设计缺陷。

我们知道Ruby语言的执行方式是,首先编译成虚拟机字节码,然后丢给Ruby虚拟机执行。 其它类似这样做的语言也很多,比如C#,java,python,但是为什么Ruby比他们慢很多?

首先,我们看合理的这种编译到字节码的语言应该如何优化。比如java。 首先是语法解析(parse),把文本转换成抽象语法树(AST),然后经过编译和适当的优化,变成字节码。 然后丢给语言虚拟机,用JIT机制转换成机器代码。

这样一套做下来,代码最后会变成机器语言的代码,执行速度从理论上,比传统的编译到机器代码的语言更优(因为机器代码是动态生成的,可以根据运行状况改动)。

但是Ruby语言很多都没有做到。JIT这么难就不说了,语言的编译和优化,因为动态类型,很多优化也没有办法完成。最基本的AST缓存或者字节码缓存(python语言有做), Ruby也没有进行,可能是因为发现Ruby太动态了这方面优化不了吧。

同样的,内存上面的优化,Ruby也很难进行。这个算是所有动态语言的缺点。 静态语言的对象基本只要带属性,动态语言的对象还要带上方法表,函数和方法调用也要存名字,而不是直接引用地址,没有简单的办法优化。

虽然现在机器的性能很高,应用的瓶颈也往往不在CPU端和内存端,但是慢就是慢,本来应该有办法做好的地方做差了。

怎么弥补?首先要语言本身可以定义类型。但是这样Ruby就不是Ruby了。

Ruby需要一个静态类型验证系统

| Comments

越用Ruby,越觉得Ruby简陋。很多其它现代语言有的特性,Ruby都没有。其中一个就是静态类型验证系统。

Ruby语言里面,是不需要定义函数的参数,以及变量的类型的,这样带来的好处就是写程序更简便了,这个被大家称为是优点。 但是实际上,这是一个缺陷。为什么呢?

程序在执行的过程中,如果不知道一个变量的类型,只能动态去判断变量是什么,动态地查找处理变量的函数, 比如一个方法调用:a.run(b),就要去查找a的run方法,然后传入b参数。 这样造成每次函数调用,都会进行一次判断和查找,极大地降低程序执行速度。

另外一个问题就是,当传入的参数不正确(比如a没有run方法,或者run只接受一个参数),只有程序实际执行的时候,才会知道这点。 一方面要在函数和方法调用的时候来判断(更慢了),另外一方面本来能够静态识别出来的错误,留到了运行时。

更可怕的是,当传入的参数类型错误的时候,不能立刻就知道,而是要等到很久之后才会被发现, 这个时候你根本不知道这个参数是什么时候传进来的,Debug变得非常困难! 其它语言定义了类型,在编译的时候就可以发现这样的错误,但是动态类型语言,比如Ruby/Python就没有办法。

在实际进行Ruby编程的时候,我深刻地体会到了这几点。 尤其是项目变得很大的时候,执行速度不说,出现问题找Bug变得很困难, 程序可靠性没有办法通过编译阶段发现,而是只能留到执行时(testcase), 并且执行时也做不到其它静态语言级别的函数参数类型验证。

而在其它现代语言里面,类型定义不再向以前一样手动配置那么痛苦了。 比如在C#里面,我们可以定义函数参数的类型,以及所有变量的类型,也可以不定义(dynamic),做到和Ruby一样的效果。 但是还有更好的语法(var),程序语言自动给你做好类型定义,不用自己手写了,方便很多。

综上所述,静态类型验证系统是现代程序语言必备的一个功能,Ruby不应该缺少这样的功能。 Matz本人也说,下一阶段会进行这种系统的设计。 不过我觉得这么大的改动,只有在程序语言开始设计的时候才能做出,Ruby现在已经进入成熟阶段,再改就很难了。

如果不是Rails,我可能会考虑其它语言,但是谁让web开发框架里面,Rails生态圈最好最成熟呢。

Ansible介绍和服务器管理思考

| Comments

旧的服务器管理,基本上就是用ssh登录到服务器上面,进行一些操作。需要做的事情一般是:定期安全更新,新版本发布,新应用安装等。 这样有很多缺点:人工操作引发错误,服务器状态无法跟踪,人工操作繁琐耗时等。

我觉得好的服务器管理方式应该是这样的:

  • 能够定义服务器的功能,通过写程序或者配置的方式说明服务器到底是怎么样的
  • 通过这个定义,自动化地配置服务器
  • 可以手动或者自动修改定义,更新整体的架构
  • 整个过程不要引入太多的复杂度,更好地反映服务器管理的本质

以前我学习了一段时间的chef,整体架构偏复杂了。因为是server/agent架构,服务器上面要跑一个chef的监控程序, 这样对于大规模的服务器来说是性能更好,但是对于大多数小公司来说,没有agent的模式就足够用了。执行速度上也偏慢。

现在重新学习了解了ansible,觉得在复杂度和易用性上面平衡得很好。主要有几点:

  • 和host服务器的通讯采用ssh的方式,host不需要安装额外的软件,除了python-simplejson
  • module插件是传输一个python文件到host执行,参数命令行传入,简洁快速
  • 整体架构上面尽量减少了复杂度,概念上只有playbook – role – module,我觉得足够满足抽象了

用ansible这种服务器配置管理工具,我可以做到以下事情:

  • 设置翻墙/下载服务器,需要的时候可以快速创建
  • 定义公司的服务器架构,进行归一化配置,自动更新
  • 遇到性能瓶颈或者需要更新服务器的时候,快速创建应用服务器

以后小规模的服务器管理,就变得很简单了。

2016年度总结

| Comments

又到一年总结日。这一年各大城市房价暴涨,以前买不起房子的现在更买不起了。 国际形势变化快,欧洲沦陷,中东一团糟,美国缓慢增长, 中国没有现象中那么差了,甚至成为了相对更自由的国家。 当然这个只是表象,中国还在继续向左走,希望以后不要变得太差。

去年

2016年,我工作上面没有什么成果,慢慢做了一些小系统,工作的效率不是很高。 学习上,深入一些研究了Racket语言,但是并没有实际做一些项目。 因为有结余,开始研究理财,东看看西看看,大致了解了市面上的一些投资产品,也没有深入。 之后发现了水库论坛,开始了解房产的一些知识。

本年可以列出来的一些重要事情:

  • 过年给老婆的亲戚拜年,完成了任务。
  • 年初和老婆去日本旅游。可惜没看到樱花。
  • 年中终于搞定了装修,去年乐从买的沙发到货了,然后去杭州宜家买了剩下的家具。
  • 按照计划,老婆怀孕,明年生。
  • 考虑小孩出生要用车,研究了汽车,最后决定,还是滴滴打车方便。
  • 去杭州参加了一个旅游社区活动,去上海参加ruby聚会,去苏州上海考察了房价。
  • 买了自行车骑行。
  • 买了电脑

回顾

过去的一年生活节奏又放缓了,工作学习健康生活都没有提高效率,反而下降了。 去年的目标也没有完成,希望下一年从微观上做好。

下一年

  • 坚持运动。
  • 研究好理财,让财富可以积累(房产或者其它)。
  • 积累技术和业务设计:设计成熟网站,坚持打基础:弄通网络,linux系统,抽时间做业余项目。
  • 阅读太少,完成日常阅读。
  • 英语练好:能够无障碍和外国人交流。
  • 带小孩。

以上。