网络寻租

Programmer, Gamer, Hacker

Ubuntu搭建wordpress

| Comments

虽然ubuntu里面已经有了wordpress的安装包,不过它好像是和apache整合起来的, 我的ubuntu服务器上面主要跑的是nginx,这里整理一下安装的步骤吧。

架构

比较简单,nginx接收到访问wordpress的请求,交给php-cgi进程渲染结果,然后返回。 跑的进程有:nginx, php-cgi, mysql。

安装软件

首先是安装必须的软件:

sudo aptitude install nginx mysql-server mysql-client unzip php5-cgi php5-mysql

安装的时候会提示你输入一下mysql的root密码。

设置mysql

mysql默认不是utf8的,我们需要修改一下:

sudo vi /etc/mysql/my.cnf

加上:

[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

然后重启mysql:

sudo service mysql restart

给wordpress准备一个数据库:

mysql -u root -p

进入命令行后, 我们需要:

1
2
3
4
5
6
# 创建一个数据库
create database wordpress;
# 建立对应的mysql的用户
create user wordpress identified by '密码';
# 设置权限
grant all privileges on wordpress.* to wordpress;

准备php进程

我们单独跑一个php-cgi服务:

sudo vi /etc/init.d/php-fastcgi

内容:

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
#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=15
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
      echo -n "Starting PHP FastCGI: "
      start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}
stop() {
      echo -n "Stopping PHP FastCGI: "
      killall -q -w -u $USER $PHP_CGI
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
      start
  ;;
    stop)
      stop
  ;;
    restart)
      stop
      start
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL

把这个服务跑起来:

1
2
3
sudo chmod u+x /etc/init.d/php-fastcgi
sudo update-rc.d php-fastcgi defaults
sudo service php-fastcgi start

设置nginx

我们增加一个nginx配置文件:

sudo vi /etc/nginx/sites-available/your-domain.com

内容(需要修改对应的参数):

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
server{
        listen 80;
        server_name your-domain.com;

        location / {
          root /home/halida/wordpress;
          index index.php index.html index.htm;

          # this serves static files that exist without running other rewrite tests
          if (-f $request_filename) {
              expires 30d;
              break;
          }

          # this sends all non-existing file or directory requests to index.php
          if (!-e $request_filename) {
              rewrite ^(.+)$ /index.php?q=$1 last;
          }
        }

        location ~ \.php$ {
            root /home/halida/wordpress;

            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME /home/halida/wordpress$fastcgi_script_name;
            include         fastcgi_params;
        }
}

设置使用这个配置文件:

sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled

设置wordpress

我们直接从官方网站上面下载wordpress:

wget http://wordpress.org/latest.zip
unzip latest.zip
cp wp-config-sample.php wp-config.php

修改wp-config.php,填写上我们前面设置的mysql数据库信息。

wordpress就这样安装好了。然后访问你的域名位置,就可以使用了。

引用材料:

如何从外网访问内网主机

| Comments

很多时候,我们需要在外面访问公司,或者家里面的电脑,但是我们一般情况下这些电脑没有办法直接暴露到外部网络中,那么我们应该怎么做呢?我们需要一个外面的VPS,或者另外一台暴露到公网的主机作为跳板。

假设:

  • A主机($A_IP):我们内网需要被访问的主机。
  • B主机($B_IP):有一个公网IP的主机,可以是购买的VPS。
  • C主机($C_IP):需要访问A主机的电脑,比如我们随身的笔记本或者手机。

首先我们需要把A主机的ssh链接到B主机上面:

autossh -M 2132 $B_IP -N -R 6333:localhost:22

我们用autossh来保证A主机的ssh一直保持连接。这个命令把A主机的ssh端口绑定到B主机的6333端口上面。

然后我们需要把B主机的6333端口暴露到公网,工具采用的是万能的端口接口工具socat:

socat TCP-LISTEN:6335,fork TCP:localhost:6333

这样在公网的C主机就可以通过B主机的6335端口访问到A主机了:

ssh $B_IP -p 6335

关于宗教信仰

| Comments

每个有基本好奇心的人,都会在人生的某个时候,考虑人生观世界观这种问题, 这个时候,他会去思考,去探索世界上其他人的解决方案,这个时候,他会正视宗教, 正视信仰,正视神是否存在。

每个人可能有不同的思考方式,有不同的探索过程,乃至不同的结论。 结论本身可能不是那么重要,探索过程,乃至个人对这些问题的明确, 有可能是最重要的。

我与宗教信仰

最早望向宗教信仰,在我记忆中,可能需要回溯到初中高中,那个时候的晚上, 我在写家庭作业的同时,未免无聊,我会开启收音机,收听不知道是来自哪个角落的频道。 有的时候,我会收到一个宗教频道,在每天晚上,有时会放一些宗教的歌曲, 有时会朗读一本天路历程的书。 那个时候,我感受到宗教对心灵的抚慰,我也有尝试“和神沟通”,但是一直以来, 并没有什么超自然的造物来回应我。

经过了大学阶段,工作阶段,我逐渐接触了世界上面其它的宗教,佛教,伊斯兰教, 知道了新耶稣的教派竟然有如此之多,也感受了不少的教堂活动。 一直以来,我对于他们的理解都是感受层面的,模模糊糊始终没有彻底明白它们做的是什么, 神是否存在?是否人有灵?是否有死后的世界?我不确定有,但是也没有确定没有。

直到最近,我跟踪方舟子的文章之后,发现他早期写了大量批判宗教的文章, 阅读了这些文章, 我才脱离了这层层的迷雾,从更高层的地方看到了全貌。 原先我以为,含有某种我不了解的神秘事务的宗教,包括基督教,包括伊斯兰教,甚至包括佛教, 背后的神秘其实不存在。圣经中我无法理解从而感到玄秘的内容,来源于迷信,谬误,宣传目的的修改, 并没有更高层次的含义;佛教中深不可测的智慧,很多也只是故弄玄虚。

有的时候,从一个方向上面了解事物,你看到的是混沌复杂,搞不清状况; 但是换了一个角度,换了一个方向,你会发现事情一下就明朗起来,复杂的东西变得简单, 无法理解的东西变得可以理解,玄妙的东西看起来其实就那么回事。

为什么我不相信神?

是否有神这个问题,如果我们纯粹以哲学思考的角度来看,可能没有什么结论。 但是如果我们把它当做一个科学问题来思考,我们可以很容易地得到结论:神并不存在。

从近代开始,当人们认识到理性,不再预设神存在,而是认真地去寻找神存在的证据。 但是直到现在,我们还是没有办法找到任何证据,能够支持一个拥有无上威能的智慧的存在。 有人会说神不在干预人世,但是根据奥卡姆剃刀,这些的神存在与否都没有意义。

人是不容易接受现实的,但是当正视了现实的时候,人才能获得成长。 当正视神不存在这个现实了之后,我们可以发现,我们能够开始理解宗教了。

宗教的意义

明确了神不存在,那么我们可以把宗教当做是人的造物来理解。 宗教故事并不代表更高存在给人类的授意,而是迷信,神话,小说的混合, 宗教组织存在必然满足经济政治规律,宗教活动满足人们的一些社会精神文化需要。

神不存在,宗教是人的造物,这样是解释宗教的最好的理论了。

结论

经过了这些学习和思考,我可以说我是一个理性无神论者了。 我可以和信仰宗教的人交流,知道他或者她是什么类型的信仰者, 我可以和任何人来进行宗教的讨论,并且提出我的观点和针对这些观点的推理, 最重要的是,我对自己和这个世界的理解更为深入了。

FAQ

还有一些我觉得值得提一下的东西,整理成FAQ。

不信神是一个结论,重要的是理性和批判性思考,如果这个世界真有神的话, 思考的结论就是信神的存在。但是遵不遵从这个神的道,又是另外一回事了。

不信神和宗教不影响欣赏宗教造物,圣诞节我会去教堂,以及有兴趣的时候也会参与礼拜活动。

不信神并不代表没有信仰,每个人心目中都有一个“天堂”的定义和一个“地狱”的定义。 远离地狱,走向天堂是信仰的主要组成部分。

万物有灵其实也是错的。椅子并不会有情绪。当然你可以定义一个情绪的概念出来。

为了融入社区而接受宗教信仰这个事情比较恶心。

佛教其实也没有那么玄乎,不要把它想得太复杂。人总是需要有一个地方拜一拜。

进程监控遇到的麻烦事

| Comments

此为技术死磕贴,非技术人士请跳过。

明天回家,为了能够让我在家里面连到公司的网络,以及让公司留下来的人能够使用到翻墙服务,我需要把几个脚本监控起来。 这样不管这些脚本跑挂了,还是机器重启了,还是网络断掉又重新连起来了,这些进程都能够在状况恢复的时候立刻起来。

需要跑的脚本其实很简单,ssh翻墙,以及ssh链接到服务器上面一个端口用作外网访问内网。都用一行脚本搞定:

1
2
autossh -M 2121 -D 10.78.78.105:7070 linjunhalida.com -N -p 2201  -zZ OOO
autossh -M 2132 linjunhalida.com -N -p 2200 -zZ OOO -R 6333:localhost:22

为了能够让ssh自动重连,我采用了autossh。 因为我的ssh是打过混淆包头补丁的, 加了一个参数(-zZ),autossh我也修改了一下源码支持这个参数。

我的服务器是ubuntu,我还需要用一个工具来监控autossh,需要能够机器启动的时候执行它,以及它挂掉的时候自动起来。

然后请教了各个网站的友邻,这里列一下大家给出来的办法:

  • /etc/rc.local
  • monit
  • crontab
  • supervisor
  • /etc/init.d
  • anacron

最后我考量到学习成本,还是采用了god加/etc/init.d启动脚本的解决方案。

god脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
god_path = File.expand_path(File.dirname(__FILE__))

God.watch do |w|
  w.name = "gfw"
  w.uid = 'halida'

  w.dir = "/home/halida/workspace/sources/autossh"
  w.env = {"AUTOSSH_PATH" => "/home/halida/Dropbox/sync/bin/ssh"}
  w.start = "./autossh -M 2121 -D 10.78.78.105:7070 linjunhalida.com -N -p 2201  -zZ OOO"
  w.log = File.join god_path, "log/gfw.log"
  w.keepalive
end

God.watch do |w|
  w.name = "bypass"
  w.uid = 'halida'

  w.dir = "/home/halida/workspace/sources/autossh"
  w.env = {"AUTOSSH_PATH" => "/home/halida/Dropbox/sync/bin/ssh"}
  w.start = "./autossh -M 2132 linjunhalida.com -N -p 2200 -zZ OOO -R 6333:localhost:22"
  w.log = File.join god_path, "log/bypass.log"
  w.keepalive
end

当前用户跑起来没有问题,但是god本身是需要设置成service跑起来的。 还好我找到了别人分享的把god当做service的办法, 丢到/etc/init.d里面的脚本如下(拷贝自这里):

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
64
65
66
67
68
69
70
71
72
73
74
#!/bin/bash

### BEGIN INIT INFO
# Provides:             god
# Required-Start:       $all
# Required-Stop:        $all
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    God
### END INIT INFO

NAME=god
DESC=god
GOD_BIN=/usr/local/bin/god
UHOME=/home/halida
GOD_CONFIG=$UHOME/workspace/god/god.rb
GOD_LOG=$UHOME/workspace/god/log/god.log
GOD_PID=/var/run/god.pid

set -e

# Make sure the binary and the config file are present before proceeding
if ! test -x $GOD_BIN; then
  echo "Config file not found at ${GOD_BIN}"
  exit 0
fi

# Create this file and put in a variable called GOD_CONFIG, pointing to
# your God configuration file
if ! test -f $GOD_CONFIG; then
  echo "Config file not found at ${GOD_CONFIG}"
  exit 0
fi

RETVAL=0


case "$1" in
  start)
    echo -n "Starting $DESC: "
    $GOD_BIN -c $GOD_CONFIG -l $GOD_LOG -P $GOD_PID
    RETVAL=$?
    echo "$NAME."
    ;;
  stop)
    echo -n "Stopping $DESC: "
    $GOD_BIN quit
    RETVAL=$?
    echo "$NAME."
    ;;
  terminate)
    echo -n "Stopping $DESC and all tasks: "
    $GOD_BIN terminate
    RETVAL=$?
    echo "$NAME."
    ;;
  restart)
    echo -n "Restarting $DESC: "
    $GOD_BIN quit
    $GOD_BIN -c $GOD_CONFIG -l $GOD_LOG -P $GOD_PID
    RETVAL=$?
    echo "$NAME."
    ;;
  status)
    $GOD_BIN status
    RETVAL=$?
    ;;
  *)
    echo "Usage: god {start|stop|terminate|restart|status}"
    exit 1
    ;;
esac

exit $RETVAL

然后设置启动执行这个服务:

sudo update-rc.d god default

跑god的时候遇到了问题,这个时候我浪费了非常多的时间。问题在于我的god是采用rvm以及非root用户安装的。环境不对。各种报错。

然后我各种尝试,还打算丢掉god,采用其他的方式来跑脚本,但是都可耻地失败了。

最后第二天我想到了办法,系统安装god:

sudo gem install god

重启之后验证成功。

结论

最后我的解决方案就是:god as a service,监控autossh。log都丢掉god目录下面。

总结一下经验:

  • 请教友邻可以获得很多的帮助,前提是问题描述清楚。
  • 遇到难题不要死磕,休息一下,睡一觉或者放一段时间,就会有结果。
  • 死磕了之后要总结,下次就能少死磕一点。

以上。

从零开始学编程

| Comments

image

很多人想学习如何编程,我这里整理一下资料,被问到的时候可以直接丢这个地址。 这里是一个学习过程简介,目标是针对想正正经经把编程学好的人, 其他学习动力学习方向什么的不讨论。

步骤整理:

  • 掌握学习和编程的环境linux。
  • 学会一门简单的语言python。
  • 用python开始做点小东西。

首先我们编程的开发和生成环境一般是在linux下面,不懂什么是linux没有关系, 看几本书:12

新手可以先不把自己的操作系统干掉,用虚拟机软件安装linux。这里推荐Virutalbox。 使用教程在这里

适应和环境以及看完这几本书以后,就可以开始学习写代码了:

我这里推荐python,它是一门很简单易学的语言,并且用途也非常广。 这里推荐一本书, 以及官方教程

到这里,你已经会使用一门语言了,但是语言本身不能实现具体的东西,看你的兴趣,是想写一个图形化工具,还是做一个小网站?

如果想写图形化工具的话,你可以用一个图形化的库Tk,这里是书籍, 或者写一个网站,这里是一个教程

上面是整体的过程,如果在中间遇到问题应该如何解决呢?

  • 首先是查对应东西的文档。一般来说,技术都有官方网站,官方文档,以及官方教程。一般来说,里面都会清楚所有步骤,以及常见问题的解法。
  • 然后是google。你遇到的问题大多数其他人都遇到了。用英文把自己遇到的问题描述清楚。
  • 再然后是请教社区。所有技术领域,都会有对应的技术社区,用你google的技术找到这个技术的官方网站以及官方社区,然后用英语把自己的问题描述清楚。
  • 如果是编程领域的问题,比如一个程序出现问题不知道怎么解决,你也可以去技术问答社区Stackoverflow里面询问。

到这里你基本上算是会编程了,不过离能够掌握还差很远,你需要懂得计算机基础,算法,软件工程,以及很多其他的东西。。 不过这又是另外一个教程里面的事情了。

最后总结一下学会编程的要点:学会google,加入社区,多想多练。 编程这门技术是所有人都能够掌握的,你需要的是信心和努力,当然还有一定程度的英文阅读能力。

github最近DNS被污染的事情经过以及解法

| Comments

缘由

最近发生了Github被封锁的现象,无论是网站,还是命令行的客户端,都没有办法访问到Github, 事情的起因是有人写了自动去12306网站刷票的插件,这个插件的脚本托管在了github的网站上面, 而插件的作者被喝茶,其他加了刷票插件的浏览器都被上头发通知取缔掉了这个行为, 进而上头发了命令封锁掉了Github。

根据我们国家防火墙的行为特征,我预期到只要满足一定条件的网站一定会被封锁:

  • 用户能够自由发布内容的网站,这个内容可以是中文,可以是各种敏感信息。
  • 这个网站大到了一定规模。

Github原本只是放源码,但是之后它们又多出来可以发布内容的功能,满足了我的预期条件,我认为它们被封只是时间问题。 原本我以为会是因为一些发布在Github上面的博客,哪成想竟然会是这样的原因。 预期一件事情一定会发生,但是却预期不到发生时候的诱因,这应该是混沌科学领域的知识和智慧吧。

封锁策略

在shlug里面,Jiajun Wang介绍了封锁的方法(全文转载):

简单地说,由于 DNS 一般使用 UDP协议, 只要在某个节点发现你查询某某网站,然后造一个假的回应包并在真正的包返回之前给你就行了, 然后假的包里面只要把实际的IP改成另外一个IP就行。

给你看个 wireshark 抓包应该清晰易懂。运行的命令是:

dig @8.8.8.8 twitter.com

可以看到实际上有两个返回,第一个返回的 ip 是 59.24.3.173 第二个返回了 3 个 ip。(这个是对的) 这个就是 dns 污染。

解法

Github被封锁后,极大地影响到我们程序员的日常工作,包括Github上面放的开源版本库的访问,oh-my-zsh的更新,更严重的是homebrew的使用。 全局翻墙算是一个解决方案,但是依赖很多,也有不方便的地方。 这里我建议采用的是:dnscrypt,让DNS都走安全的加密通道,以及采用opendns作为dns服务提供商。 使用方法也很简单,下载对应的客户端,安装即可。

结论

Github被封,对于程序员整体来说是损害,但对于能够打破这个封锁的程序员来说却也是利好:又可以在竞争中筛掉一批竞争者了。 政府可以随意限制我们的权利,对于中国人整体上面是非常严重的伤害,现代中国还在像以前一样闭关锁国,为了维持一个非正义政权的统治。 我对中国的未来不是很看好。

Obfuscated-openssh介绍

| Comments

缘由

我一直采用的翻墙方法是这样的,我在linode上面买了一台vps,然后这台vps上面跑了pptp,openvpn,然后我连接VPN翻墙。

十八大来临的时候,pptp,openvpn都不太好用了,我只好采用ssh SOCK5的方式来翻墙。

但是前几天,GFW好像又升级了,识别到我的ssh的主要用途是翻墙,然后把我的ssh端口给封掉了。这下就麻烦了。我在网络上面搜索,发现切换端口后,还会把整个服务器给封掉。

他们封锁的逻辑是这样的:识别到ssh的协议,然后对协议的流量进行机器识别的分析,当发现疑似采用ssh翻墙的时候,就下黑手。

我考虑了各种解决方案,最后还是选择了采用 obfuscated-openssh

介绍

虽然ssh的内容本身是加密传输的,但是ssh协议本身带有明显的包头特征,因此,DPI可以分析得出采用的协议是ssh,然后就可以根据流量状况来判断到底是做什么类型的操作,从而以此为依据搞鬼。

那么反制措施就很简单,把包头混淆掉就可以了。 obfuscated-openssh就是做这样的事情的。在它Github项目主页上面的介绍如下:

首先发送含有一个神秘magic key的数据包,magic key前面是一定数量的随机数作为seed,后面也跟着一个长度,然后是这个长度数量的随机数,如下图:

[     16 byte random seed           ][  magic  ][ plength ][ .. plength bytes of random padding ... ]
|___________________________________||______________________________________________________________|
                |                                                   |
            Plaintext                                Encrypted with key derived from seed 

这样保证第三方在不知道magic key的前提下,完全分析不出有用的数据从哪里开始,从而不知道协议是什么。

获取了random seed之后,加上一个只有服务器和客户端知道的密码,来生成解密后续内容的钥匙,然后服务器和客户端就可以继续通讯了,对于中间的窃听者而言,是不能获知协议类型的。

安装和使用

在ubuntu机器上面编译的方法:

1
2
3
4
5
6
7
8
# 下载
git clone git://github.com/brl/obfuscated-openssh.git
# 移动到目录下面
cd obfuscated-openssh
# 准备编译环境
sudo apt-get build-dep openssh
# 编译
./configure; make

服务器端需要做的配置,首先修改sshd_config,里面几个重要参数:

  • ObfuscatedPort 设置成需要服务的端口
  • ObfuscateKeyword 只有服务器和客户端知道的密码

一个具体的示例:

1
2
3
4
5
6
7
8
9
10
11
12
ObfuscatedPort 2200
ObfuscateKeyword xxx

Port 2201
Protocol 2

HostKey /home/crawler/sources/obfuscated-openssh/ssh_host_rsa_key

RSAAuthentication yes
PubkeyAuthentication yes

Subsystem       sftp    /usr/libexec/sftp-server

因为不要和系统的sshd冲突,需要生成一个新的rsa_key,安装和执行的代码如下:

1
2
3
4
5
6
7
# 生成秘钥:
ssh-keygen    # ssh_host_rsa_key
# 创建/var/temp
sudo mkdir /var/temp
sudo mkdir /var/empty
# sudo执行服务sshd:
sudo `pwd`/sshd -f ./sshd_config

然后客户端也是需要编译的,执行的方式:

1
2
# 执行ssh tunnel
./ssh -D 7070 your-username@yourserver.com  -N -p 2200 -zZ xxx

安装脚本

为了方便使用,我整理了安装脚本:

服务器端:

1
2
sudo su
wget --no-check-certificate https://github.com/halida/install_script/raw/master/obsh_server.sh -O - | bash

客户端:

1
2
sudo su
wget --no-check-certificate https://github.com/halida/install_script/raw/master/obsh_client.sh -O - | bash

最后

虽然包混淆能够让别人不知道我们采用的是ssh,但是流量分析还是可以做的,这样还是有很大可能性被发现是在翻墙,从而把服务器干掉。 还有就是如果以后采用了白名单制度,那么再怎么弄都没有办法了,因为只有特定外网才能访问。不过这种状况不太可能发生。 这样矛与盾的斗争还会一直进行下去,直到中国人获得自由的那一天到来。

2012总结与2013计划

| Comments

自从有了文字,人能够脱离大脑记忆的束缚,记录下更多内容,保留更多经验,能够积累,演进,不再重复过去的错误。 保留文字记忆的文明,才能获得发展的机会,历史可鉴。文字是人类文明大厦的奠基石这一说不为过。

作为个人,处在这急速变化的时代,去年的事情模糊淡忘,几年就仿佛隔代一般,回顾影像记录,带给我们的是许多惊奇。 若不在记忆可辨的时候留下文字痕迹,若干年后回想过去,要么仿佛身处黑洞一般无从触摸,要么记忆被蒙上一层光晕,得到的是美化或者丑化的怪物。 忘记历史就意味着背叛,对个人也是一样。

2012年总结与回顾

去年看起来有些特殊,玛雅人历法的终结,数个独裁政府的倒掉,名人的逝去,业界风起云涌。 但是从更长期的眼光来看,可能中国领导换届才会在历史上留下最深刻的一笔。 国家大事如同窗外狂风暴雨,激烈而无从可控。让我们回到窗内的个人琐事吧。

今年我是我离开原先公司,全职加入GuruDigger的第一个年度。 也是我从偏远的嘉定,来到市区的第一个年度。 在这一年里,因为地点变更,生活更为丰富多彩了起来。 地理上面的方便性,以及弥补小团队开发引发的社交退化,我长期参加Hacking Thursday的活动。 然后去得多的是shanghai on rails周二的聚会。 2012年对于上海来说,也是一个技术大会非常多的年份, 我主要参加的是:hujs大会,python大会,黑客马拉松活动等等。

除去和我技术本职相关的活动以外,我也积极拓展其他的领域, 比如统计学聚会,视角读书会,TED大会,星期天读书会,社会学读书会,GDC China。 除了大会,我还去了一些定期的活动,比如星期天下午的人民公园英语角,星期六下午红房子星巴克的沙发客聚会。 然后还有一说的就是年底上海马拉松也跑了6公里健身跑。 旅游上面,因为各种机会,我去了南京,以及和上海大学的学弟学妹去了崇明骑行。

参与这些活动,无法说清楚短期的收益是什么,长期潜移默化的改变也无迹可循, 而我觉得最大的感触就是,积极参与,而不是被动接收,才是能够带来更大感受。

回到本职工作上面来。这一年我做的事情没有大的变化,主要还是Rails和前端。 感觉技术上面没有阶段性的成绩,无非是ruby和js以及调整html/css变得更熟练了一些。 对计算机领域的理解并没有增进,对如何设计本身更是没有心得。值得检讨。

找对象方面,极大地扩展了人际圈,可以说是认识了很多的人吧。 但是没有任何实质上面的进展。大多数的人也只是一面之缘,没有任何后续活动了。

总体上面来讲,这一年的我和过去一年的我有区别,有长进, 但是内化的核心性格特征改变不大,依旧内向顽固疯狂懦弱(正反意思理解皆可),但是多了一些的觉悟和控制。 行为方式,做事方式上面有了调整,但是还是没有大的变化, 如果没有借助外力或者内省加以变化的话,我的未来是可以预测的悲惨。

2013年计划与目标

在这个变化的时代里面,目标可能顺势而变,但是方向是一定要定下来的。 失去了方向,人生会变得随波逐流,失去意义。 主要目标是,我希望成为一个顶尖的开发者,开发出能够改变世界的program。 还有一个并驾齐驱的目标就是感受和领略各个领域的智慧和美丽。 这个目标看似简单,但是可能比前一个目标还需要付出更多:爬得更高,走得更远才能看到更美的风景。

然后现实的部分,就是成家立业。找个能够一起进行人生旅途的对象,从事一份能够支撑上海生活水平的工作。 这算是近期几年必须完成的目标吧。 我考虑到中国现在的环境,以及我现在从事的互联网行业本质上也算是服务业的部分, 觉得自己还是走向全球市场比较好,毕竟外国人愿意出钱,更靠谱,市场也更健康。 而找对象上面,需要进行更多实质性的操作,时间对我是不利的。

目标需要细化到执行层面,不然只是空头支票。虽然我们知道,一年定下来的目标,最后做到的往往很少, 但是计划总是要做的。没有执行到位的计划比完全没有计划要好。那么具体到2013年需要完成的事情:

  • 技术上面构建核心竞争力。成为一个靠谱的网站开发工程师。考虑到前端变化率大以及领域局限的问题,我还是着重巩固后端以及设计上面的能力。 具体到实务上面就是:多做多练多看多思考多总结。能做的事情就是增加番茄时间上面的投入,以及做事情的时候多思考。现在可以做的事情太多了, 从手头上面的事情开始做是明确优先级的解法。每个月都要练习设计和制作一个网站。
  • 英语能够达到口语交流和日常交互写作顺畅的程度。具体做的事情就是:找交互性质的教材,然后背诵和练习,要求每周都和外国人对话一次。对话之前先想好要说什么。
  • 保证健康。继续坚持每周跑步的习惯,加上缺失的力量训练的部分。开始做俯卧撑和仰卧起坐。时间安排是在番茄时间的间隔。
  • 找对象进入实质阶段。寻找好目标,做好执行计划。不保证成功,但是要保证做到位。
  • 重新开始坚持钢琴。时间安排在失去集中力的时候。

期望的结果就是,到了2013年的年底,在网站开发上面我能够游刃有余,有拿得出手的网站作品来体现自己的专业能力。 外语流利到能够进入外企工作。身体健康,上身有曲线。找到一个聊得来的对象。钢琴能够弹简单的作品以达到装逼的目的。 这个属于可计划的部分,非可计划的部分就是变成更好的人。这个需要遇到事情,思考,决断,冲破枷锁。养成新的好习惯。

TEDxFDU 2012年11月 活动总结

| Comments

上周日,我去参加了TEDxFDU的活动,我原先参加过一次,感觉气氛不错,所以这次我也报名了。

地点是在江湾体育场的创智天地,我到了现场的时候,发现是用到了7号楼的大会议室,看到有那么多人参加,不由觉得很遗憾。这次的形式是大会性质的,我更希望是讨论和交流性质,因为如果要看好的讲演,网络上面有很多,但是好的讨论比较难获得。并且我周末过来,也有恢复社交能力的期望在。

不过除了这个遗憾以外,这个活动还是非常好的。讲者的内容和演讲素质都不错,参加非常值得。这里稍微整理一些我觉得有意思的讲者和内容。

新闻学的兰启昌。讲了一些我也非常认同的重点。事实不等于真相。记者的专业主义,在于三个独立。独立于资本独立于权力独立于民粹。我觉得现在民粹盛行,是值得警惕的地方。我觉得如果一句话你听起来感觉很舒服很解气,那么你应该提高警惕心,因为这句话往往是为了迎合你创造出来了,可能离真相很远。

社会学的沈老师。讲了一些关于社会性别的内容。比如文化强加给人的限制。男生应该是怎么样的,女生应该是怎么样的。社会对女性的压力(现在大家慢慢认识到了这一点,并且有了反思),有说社会对男性的压力更大。因为普遍观念上,只有成功的男性才受欢迎。这点我觉得是需要着重提出来的地方。

艺术设计的卞雅文。提醒了我,关于艺术的要点在于用心去体验,用心去生活。然后就是我觉得大学生就可以变得很成熟很有气质,让我觉得非常有压力。

艺术教育的龚金平老师。他主要提出来的是志在必得,不如顺势而为,指出是现代性早期的自信,因为现在其实是一个后现代的社会,重点是在人与人之间发生,而人是复杂的,不能期待能够获得一个既定的结果。如果目标既定,要么是满足了目标后的空虚,要么是实现不了目标的沮丧。我觉得这个也是一个非常重要的经验。

生命技术的丁琦亮。只有18岁,就进入了主流的科学领域。不知道是怎么能够在这个年龄就能进入到这个层次的。有提到科学人员的社会责任。我觉得中国现在普通群众的科学素养非常低,科学领域人士应该有必要出来传播科学理念。

最后是广告学的庾里翔。算是压轴的吧。分享了一些他有感触的摄影艺术家和作品,以及他的探索过程。对我来说有一定冲击,因为又是一个比我高领域的年轻人。

总结

这次活动的内容对我来说都不是新的,但是讲者演讲的能力非常不错,一定事先准备了很久。然后里面很多非常优秀的年轻人,他们有目标,有想法,有能力,当然也有资源。世界会在他们的工作下会变得更好。比较之下让我感到很有压力,希望我能够调整到和他们一样的状态。

GDC China 2012

| Comments

这个周末是GDC China 2012会议的时间,本来我想去参加,但是一看票价上千块,不由望而却步。 不过18号有开放部分的展台,我就过来看看了。地点是在陆家嘴的上海会议中心。我下午2点多的时候过来。直接上到5楼的独立游戏展台。

这里面是很多参展的独立游戏,我基本上试玩了一圈,和他们交流了很久。 具体游戏的列表在 这里

独立游戏试玩

首先一款位图类型的游戏UNCLE GO,感觉很一般,游戏方式倒是挺多种多样的。没有留图。

不过回来之后看了一下视频,作为只有一个开发者的游戏来说,还是挺有意思的一个小品游戏。

然后是一个韩国人做的的回合策略游戏Army and Strategy,开发团队5个人。我玩了很久,提了很多的问题和很多的改进意见。

游戏还是大地图,区块进攻防御,回合制的。特色是各种扑克牌类型的人,以及特殊的战斗模式。 战斗的话在各个将军之间进行。每个将军可以带几个兵。我推荐他们去看看dominions3,一款超级复杂的骨灰级别游戏。

然后是一个新加坡学生团体的游戏Blockhead。特性是移动方块,改变重力,我和他们的程序聊了一下关于游戏实现的一些问题。

我问了一下游戏引擎是怎么实现的。他主要介绍的部分是在游戏主循环里面,游戏逻辑,碰撞检测的部分。 还有就是3D渲染如何进行。基本上还是我了解的传三角形矩阵给GPU。 这个游戏的游戏性还可以,不过感觉画面效果太粗糙了,需要打磨。

然后是一个典型的独立游戏团队,一个程序,一个美工。

他们做的飞刀这款游戏不错,的确是职业级别的游戏。不过我还是觉得没有特别突出的地方,比较中规中矩。

在看这个游戏的过程中,有遇到椰岛游戏的devvi,看了他拿出来一个索尼新出来的强力四核主机,里面一款游戏,改变重力方向,大场景沙盒,效果还是很不错的,可惜没有留图。

和屌丝伞兵的逆袭的人扯了一下游戏性的问题。他们说这个游戏是免费放出来玩的。我看了一下,还是走游戏内商店的方式。感觉美工设计比较差,游戏性的话一般。反正我是死的比较快的。。

后面发现有大牌在。 Dustforce。介绍的人是从美国飞过来的,主要做的是音效。他全程指导我玩这款游戏,可惜我上手比较慢。

这款游戏是hardcore方向的,需要非常强力的操作能力。游戏内有排名,一些玩家玩的真的很辛苦。关于游戏本身,其中有说道角色动画很多,美工画了三千多帧。 给我展示了一些牛逼玩家打通关的视频。

然后是一款学生作品,来自四川美术学院的魔豆校园,里面采用了大块的手绘场景,效果非常好。不过游戏引擎采用的是现成的。 但是手绘背景这点就足够吸引眼球了。不过其他的不期待了。后来也有听到关于四川美术学院的名声,看起来是个好学校。

三楼厂商展厅

这个时候已经很晚了,我最后又去了三楼的展台,他们大多已经走了,还留下少数的几家。

发现比较好的一个是动作捕捉系统。询问了一下技术细节。他们是通过惯性陀螺仪来判断移动,通过算法来处理数据。

工作人员和我说,算法的难度主要是在快速移动的时候判断距离。现在的精度是能够做到毫米级别的。 我问了一下价格,是在二十万到七十万左右。我问具体成本,他说是软件成本。我问硬件成本,他说老板才知道。我看估计也是在万级别的吧。

这个是真人美女演示。

然后是另外一家做声音效果软件的。我试听了一下,没有感觉到效果。工作人员说主要还是针对开发者来用,测试声音效果,类似于debuger之类的工具。

独立游戏party

晚上去独立游戏party。地点在Arcade酒吧,空间比较小,人很多。

试玩了最近出来的那个比较酷的概念性质游戏,就是模拟hack进一个系统,恢复破碎的文件的,感觉很伤害眼睛。

然后我和 失忆的大陆 聊了聊,他是一个老游戏程序员了。聊的东西很多,记不太清楚了,列一些重要的吧。

他说游戏(主要还是网游)分前端和后端,前端和后端的思考方式不一样,都关注性能和稳定,前端性能高于稳定,跑的顺最重要。后端稳定高于性能,性能不足可以堆机器。

他说游戏有几个基础的方向,UI,渲染,网络,AI,逻辑,这算是基础的部分,然后只能够有精力深入其中的一个。只是AI的部分就有上万种的算法。

他说看工作方式就知道是老手还是新手。新手基本上都是不断地敲代码调试,老手就是会停下来想一段时间,然后再做。

有说到程序员的发展问题。 程序员提高水平靠踩的坑多,踩过了才知道会有问题。 他说5年的程序员和8年的程序员有很大的区别,不只是3年。 经验多了,设计出来的架构就有很大的区别。

还有说道,如何提升这个过程。他说基本还是靠多接触和用心。 都是三年的程序员,用心与不用心差别就非常的明显。

还有就是说游戏现在技术上面都比较成熟了,程序员基本上只要实现东西就好,主要的还是在创意上面。

一直聊到10点,他走了我也走了,我出去路上遇到围脖飘飘, 我们聊到了手机游戏的前景。他说根据现在android手机的普及率,明年手机游戏会有大的爆发。准备入局。有说按照韩国游戏的模式来做。 在地铁站入口我们聊了一会,看时间差不多了我和他告别后跑回了住的地方。

总结

今天白天我和好几个国家的人扯了外语,感觉自己的外语水平提升了很多。聊了很多关于游戏的东西,还是很high的。可惜没有机会进去里面听游戏业者的演讲。 晚上的party主要是遇到了几个人聊了很多东西,略有所得。今天一天的信息量还是很大的啊。