当前位置

技术

技术

testlink PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/html/testlink/lib/functions/tlIssueTracke

今天在 CentOS 上装一个测试用例管理统计工具 testlink-1.9.5,安装完之后第一次登录在 Firefox 下除了 My Settings 和 Logout 这两个链接能看到,下面全是白的,到 IE 里登录,还多出了 500 的错误提示。

之前在 Windows 上安装同样版本的没有这个问题。

去 /var/log/httpd/error_log 里看,报了一个错:
[error] [client 192.168.XXX.XXX] PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/html/testlink/lib/functions/tlIssueTracker.class.php on line 555, referer: http://192.168.XXX.XXX/testlink/lib/general/mainPage.php

搜了一下,解决方法如下:

vi /var/www/html/testlink/lib/functions/tlIssueTracker.class.php
555 gg
把 $dummy = $impl::checkEnv(); 改成 $dummy = $impl->checkEnv();

具体原因请点击 http://stackoverflow.com/questions/1966010/what-does-this-mean-parse-error-syntax-error-unexpected-t-paamayim-nekudotay

说一句憋了很久的话:stackoverflow 真是一个神奇的网站啊!

Topic: 

开启真机的View Server引入HierarchyViewer/By写monkeyrunner自动化测试脚本

其实相关文章网上也有不少了,不过在真机上开启View Server的中文文章好像只有一篇,前段时间按照这篇文章的内容,并结合英文源文去hack我的Nexus S(4.1.2)也走了一点弯路。现在总结一下我的步骤(其实有相当一部分拷贝了这篇,衷心感谢原文作者)。并写点在开启View Server之后monkeyrunner的脚本。

先交待一下背景,monkeyrunner作为自动化测试Android系统工具在某些情况下还是比Robotium易用一些,不过monkeryrunner判断测试结果是否正确的方法是把实际测试中的截屏与预先截好的正确的屏跟做比对!这个办法不够灵活。假如返回结果会显示在一个文本框中,我从文本框里取出字符串能直接跟预期的字符串比较,这样就省事多了。

Android SDK自带一个工具叫做monitor,它里面的Hierarchy Viewer可以看到app的UI结构、控件属性等等。monkeyrunner有一个类By,通过By可以在代码中根据控件ID定位到该控件从而写更有针对性代码(比如点击按钮、比如获取文本框中的字符串)。

可是出于安全考虑,Hierarchy Viewer只能连接Android开发版手机或是模拟器。只有当设备或模拟器上启动一个叫做View Server的服务,Hierarchy Viewer才能与其进行socket通信,才能看到app的“View”。而绝大多数商业手机是无法开启View Server的,所以Hierarchy Viewer也就无法连接到普通的商业手机。而By又依赖于Hierarchy Viewer,所以如果想在普通的商业手机上通过控件ID去做一些操作,连接模拟器运行通过的脚本连接真机运行是会抛错的。

不过小米手机是个例外,通过执行如下命令可以轻易开启它的View Server:
adb shell service call window 1 i32 4939
然后通过执行如下命令判断是否开启View Server:
adb shell service call window 3
若返回值是:Result: Parcel(00000000 00000001 '........') 说明View Server处于开启状态
若返回值是:Result: Parcel(00000000 00000000 '........') 说明View Server处于关闭状态
如果想关闭View Server执行如下命令:
adb shell service call window 2 i32 4939

除了小米手机之外,别的手机能不能开启View Server?经过一番调查和实践,其实只要是root,并且装有busybox的手机,通过修改手机/system/framework中的某个文件,就能够开启View Server。

下面就是我总结的开启View Server的步骤(提醒:如果照我的步骤导致你的手机变砖,本人概不负责):

1.准备工作

a.解锁手机,刷入第三方Recovery。这一步不是开启View Server必须要做的。但是万一手机通过正常方式启动不了了,可以通过第三方Recovery里的restore功能恢复手机系统,当然前提是在修改系统文件前先通过backup功能做一个备份。

b.root手机。root的作用是获取对手机系统文件的读写权限,这样你就可以修改那个不允许打开View Server的系统文件了。

c.在手机中安装BusyBox应用。我们在给自己生成的odex文件签名时会用到它。

d.用第三方Recovery备份手机系统。这一步不是必须步骤。

e.在D盘下创建hack文件夹,下载baksmali-1.4.2.jarsmali-1.4.2.jarzip.exedexopt-wrapper这些后面要用到的工具并保存在D:\hack下面。

2.开始hack (再次提醒:请确保把下面每个步骤所有文字全部仔细看完后再开始操作)

a.将手机通过USB连接PC,确保adb服务运行正常。

b.备份手机上/system/framework/中的文件至PC。备份的时候请确保PC上保存备份文件的文件夹结构与手机中的/system/framework相同,比如先在D盘上创建hack\system\framework的文件夹结构,然后运行
adb pull /system/framework D:\hack\system\framework

c.进入adb shell,输出BOOTCLASSPATH:
echo $BOOTCLASSPATH
然后将输出的路径先暂时存起来。我的是(每个机器的$BOOTCLASSPATH都不一定一样):
/system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar

d.在命令行窗口中进入D:\hack,然后运行baksmali反编译\system\framework下的services.odex文件:
java -jar baksmali-1.4.2.jar –x -a <api level> –c <local bootclasspath> system\framework\services.odex
参数解释:https://code.google.com/p/smali/wiki/DeodexInstructions
想特别说明的是“-a”后跟的数字,表示你系统的API Level(与你的系统版本有关)。系统版本和API Level的对照关系如下:

这一步在我的机器(version 4.1.2)上的命令是:
java -jar baksmali-1.4.2.jar -x -a 16 -c system\framework\core.jar:system\framework\core-junit.jar:system\framework\bouncycastle.jar:system\framework\ext.jar:system\framework\framework.jar:system\framework\android.policy.jar:system\framework\services.jar:system\framework\apache-xml.jar system\framework\services.odex
此步成功的话,在D:\hack下,会有个out文件夹生成。
注意,-c后面跟的是本地备份的jar包路径,把上一步暂存的路径中system前面的“/”去掉,把其它的“/”换成“\”。
这里顺便解释一下dex文件、odex文件和smali文件:

  • dex文件:dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java的字节码而是Dalvik字节码,16进制机器指令。
  • odex文件:将dex文件依据具体机型而优化,形成的optimized dex文件,提高软件运行速度,减少软件运行时对RAM的占用。
  • smali文件:将dex文件变为可读易懂的代码形式,反编译出文件的一般格式。

e.用Eclipse打开out\com\android\server\wm\WindowManagerService.smali文件查找.method private isSystemSecure()Z这个函数,在这段代码的倒数7,8行“:goto_21”和“return v0”之间加入“const/4 v0, 0x0”一行。
.method private isSystemSecure()Z函数最后几行变为:
if-eqz v0, :cond_22

const/4 v0, 0x1

:goto_21
const/4 v0, 0x0
return v0

:cond_22
const/4 v0, 0x0

goto :goto_21
.end method

f.现在运行smali,重新编译:
java -jar smali-1.4.2.jar -o classes.dex out
这时候,应该在D:\hack文件夹中出现了classes.dex文件

g.用zip工具把生成的classes.dex打成jar包
zip.exe services_hacked.jar classes.dex

h.进入adb shell,输入su然后回车,获得ROOT权限

i.接着输入mount | grep /system查看哪个分区挂载了/system,例如我的是:
/dev/block/platform/s3c-sdhci.0/by-name/system /system ext4 ro,relatime,barrier=1,data=ordered 0 0

j.接着输入以下命令重新挂载/system,并更改/system权限(请将“/dev/block/platform/s3c-sdhci.0/by-name/system”替换成你的/system挂载分区):
mount -o remount /dev/block/platform/s3c-sdhci.0/by-name/system /system
这一步的作用是为了后面的p步能够将/system/framework里的services.odex替换掉。

k.再次输入mount | grep /system 确认/system已经改成可写的了(以前是“ro”,现在是“rw”)

l.将services_hacked.jar和dexopt-wrapper复制到手机的/data/local/tmp文件夹中
adb push D:\hack\services_hacked.jar /data/local/tmp
adb push D:\hack\dexopt-wrapper /data/local/tmp

m.进入adb shell,输入su后,将dexopt-wrapper的权限改为777
chmod 777 /data/local/tmp/dexopt-wrapper

n.cd到/data/local/tmp文件夹下,运行:
./dexopt-wrapper ./services_hacked.jar ./services_hacked.odex <c步暂存的bootclasspath,但要排除掉“:/system/framework/services.jar”>
这一步在我的机器上的命令是:
./dexopt-wrapper ./services_hacked.jar ./services_hacked.odex /system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar
这样,便在/data/local/tmp文件夹中生成了services_hacked.odex这个文件

o.给我们自己生成的services_hacked.odex签名:
busybox dd if=/system/framework/services.odex of=/data/local/tmp/services_hacked.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
参数解释:

  • if - input file
  • of - output file
  • bs - block size (1 byte)
  • count - number of blocks
  • skip - input file offset
  • seek - output file offset
  • conv=notrunc - don’t truncate the output file.

p.将/system/framework里的services.odex替换成我们自己制作的services_hacked.odex
dd if=/data/local/tmp/services_hacked.odex of=/system/framework/services.odex
稍过一会,手机就会自动重启

q.成功重启后,用以下命令开启View Server:
adb shell service call window 1 i32 4939

r.用以下命令查看View Server是否开启:
adb shell service call window 3
返回的值若是Result: Parcel(00000000 00000001 '........'),那么你就成功开启View Server了!

3.灾难恢复

如果你不幸在上一节p步手机重启后进不了HOME,一直处在bootloop状态,不要用拔电池的方式重启手机。这个时候你已经可以使用adb了,在命令行窗口里执行:
adb push D:\hack\system\framework\services.odex /system/framework/services.odex
就可以把之前备份的services.odex再拷回去,这样手机就能进入HOME了。

如果你十分不小心重启了手机,这时候你会发现既进不了HOME也使用不了adb,那就只能进入第三方的Recovery,用之前的备份去恢复手机系统了。

下面的是如何利用HierarchyViewer和By这两个类去灵活完成monkeyrunner的脚本(monkeyrunner的其它基本代码在这里不赘述)。

先假设一个场景,有一个app,打开后有一个按钮,点击这个按钮后,正常情况下会在下面的文本框里返回“ok”。我们需要用代码实现点击这个按钮,然后取得文本框中的返回值与预期结果“ok”做比对。

我们通过前面介绍的Hierarchy Viewer看到app里按钮的ID是“id/button”,文本框的ID是“id/output”。

为了通过控件ID操作手机,我们需要在代码开头import这两个类:
from com.android.monkeyrunner.easy import By
from com.android.chimpchat.hierarchyviewer import HierarchyViewer

然后用下面的代码获得按钮对象:
hierarchyViewer = device.getHierarchyViewer()
viewNodeButton = hierarchyViewer.findViewById("id/button")

用下面的代码获得按钮的中心坐标:
pointButton = HierarchyViewer.getAbsoluteCenterOfView(viewNodeButton)

这个时候pointButton.x是按钮的中心点横坐标,pointButton.y是按钮的中心点纵坐标,可是有了这两个坐标,我们还不能直接用device.touch(x, y, "DOWN_AND_UP")的方式去点这个按钮,因为这个坐标是以开发设计app时手机的屏幕分辨率为基准的,所以我们还需要换算一下才知道在目前的测试手机上按钮的中心坐标是什么。

先通过Hierarchy Viewer查到设计时的屏幕分辨率(比方说是320和533),并在代码中定义:
originalResolutionWidth = 320
originalResolutionHeight = 533

再通过MonkeyDevice的API获得目前的测试手机的屏幕分辨率:
actualResolutionWidth = int(device.getProperty("display.width"))
actualResolutionHeight = int(device.getProperty("display.height"))

然后用下面代码得到目的手机分辨率与开发设计时的分辨率的比值:
xRatio = float(actualResolutionWidth) / originalResolutionWidth
yRatio = float(actualResolutionHeight) / originalResolutionHeight

有了xRatio和yRatio,我们用下面的代码轻而易举就能点到正确的坐标上了:
device.touch(int(pointRegister.x * xRatio), int(pointRegister.y * yRatio), "DOWN_AND_UP")

按钮点下后,我们需要用下面代码获取文本框里的返回值:
viewNodeOutput = hierarchyViewer.findViewById("id/output")
output = viewNodeOutput.namedProperties.get("text:mText").value

这样我们就能用output与预期的“ok”做比对了:
if output == "ok":
    print "success"
else:
    print "fail"

最后加一句关于unittest的,如果想按照python的unittest框架写测试用例,会用到
self.assertEquals(expectedString, actualString)
这样的语句,如果是中文操作系统,跑的时候有可能会出现LookupError: unknown encoding gbk这样的错误,请参考Android 自动化测试学习笔记里面提供的方法解决。

更新20130912:
如果要点击Menu里的Label,会发现所有的id名都一样。这个时候怎么办?也许可以用device.press('KEYCODE_DPAD_UP/DOWN/LEFT/RIGHT')的方法来导航到你需要点击的Label,不过我没有试过。
第三方的包AndroidViewClient,可以通过Label上的Text定位到你想点击的Label。
1.把二进制的jar下载下来并放到sdk\tools\lib下
2.在py文件里from com.dtmilano.android.viewclient import ViewClient
3.然后device, serialno = ViewClient.connectToDeviceOrExit(),启动一个activity,用viewclient = ViewClient(device, serialno)和viewclient.dump()可以拿到所有的控件,然后通过Text就能找到需要的控件了。具体请参考http://blog.csdn.net/jiguanghoverli/article/details/10189401https://github.com/dtmilano/AndroidViewClient/issues/22
如果在运行过程中看到Exception: adb="adb.exe" is not executable. Did you forget to set ANDROID_HOME in the environment?这种错误,把adb.exe放到C:\Windows\system32\下面。
另外,引入这个第三方包还有一个好处是,在测试某些app时不用考虑分辨率的问题了(目前我碰到的是如果点击某个app的menu里的label时不需要考虑分辨率,没有调查到底是因为menu的原因,还是不同的app的开发机制原因)。

更新20130913:
在Windows中文系统下,即使按正文中链接里的办法解决了LookupError: unknown encoding gbk这样的错误,但碰到真正的中文(如果不“解决”,就算assert的是英文,也会报上面的错误)还是会报错,如AssertionError: '\xe5\x9f\x8e\xe5\xb8\x82' != u'\u57ce\u5e02',这时需要把被比较的字符串encode("UTF-8")一下,具体请参考http://1.vb.blog.163.com/blog/static/104546220071113105047729/

Topic: 

RedHat Summit 2013目前可下载的pdf演示稿简单整理

PPT的题目列表在http://www.redhat.com/summit/2013/presentations/
但是pdf需要翻墙才能下载

感觉今年RedHat主推的是它的Storage Server,是基于GlusterFS的方案;还有一个就是它的OpenShift,开源PaaS方案,以及openshift.com这个PaaS公有云实例
另外一个感觉,赶紧从 RHEL5 升级到 RHEL 6 吧!

技术:

  1. 一般性介绍
    1. RedHat Storage Server Roadmap & Use Cases:http://rhsummit.files.wordpress.com/2013/06/saha_rhss_summit_roadmap_str...
    2. KVM Roadmap:http://rhsummit.files.wordpress.com/2013/06/sarathy_t_1040_kvm_hyperviso...
    3. Linux Container Roadmap:http://rhsummit.files.wordpress.com/2013/06/sarathy_w_0340_secure_linux_...
  2. 开发相关
    1. 软件打包分发,虽然developer toolset是RH自己的方案,但是也值得参考
      1. http://rhsummit.files.wordpress.com/2013/06/mmaslano_f_1100_bring_order_...
      2. http://rhsummit.files.wordpress.com/2013/06/newsome_t_1040_developer_too...
    2. 开发工具
      1. Eclipse下的C/C++开发:http://rhsummit.files.wordpress.com/2013/06/johnston_eclipseinrhel.pdf
  3. 配置和性能调优
    1. http://rhsummit.files.wordpress.com/2013/06/england_th_0450_rhs_perf_pra...
    2. http://rhsummit.files.wordpress.com/2013/06/portante_f_1100_red_hat_stor...
    3. 为数据库调优:http://rhsummit.files.wordpress.com/2013/06/rao_t_0340_tuning_rhel_for_d...

云计算相关商业、产品概念(全部都是关于PaaS、OpenShift、私有化混合云之类的,可以学习怎么做ppt):
http://rhsummit.files.wordpress.com/2013/06/che_w_0230_openhybridcloudis...
http://rhsummit.files.wordpress.com/2013/06/fernandes_t_1040_streamline_...
http://rhsummit.files.wordpress.com/2013/06/fricke_integrated_distribute...
http://rhsummit.files.wordpress.com/2013/06/haff_w_230_choose_your_own_p...
http://rhsummit.files.wordpress.com/2013/06/hicks_w_1040_openshiftovervi...
http://rhsummit.files.wordpress.com/2013/06/mmcgrath_t_450_openshift_dee...
http://rhsummit.files.wordpress.com/2013/06/noceda_t_0120_consumepaasint...

Topic: 

两个团队如何协同开发电子邮件系统?

从报导上看,最知名的例子可能是Coremail和163之间的关系。最近我也开始碰到这个问题了,武汉和北京之间怎么去协同?

按照上篇文章列出的1/2/3,计划是这样,
a. MTA 体系双方各自建设
b. 武汉负责反垃圾邮件引擎的支持,但对外发送方面,两边也是各用各自的方案
c. 每次持久数据结构大变动是一次Major版本升级,小变动算Minor升级。Major升级应该主要是由北京这边推动的
d. web access 双方各自发展
e. 标准协议北京主导
f. Mobile App,甚至 Desktop App,这个需要再积累积累

Regions and Availability Zones

今早内部写了一封邮件,里面用了这两天思考问题时用的两个词:Zone、IDC。晚上查了一下 Amazon,发现 AWS 里面,对应的概念是 Regions 和 Zones

联想到前不久王建硕的那篇被翻译成中文的blog里关于中国巨大市场导致国外互联网巨头面临严酷竞争的事情,中国因为其巨大的地域,互联互通(即使不考虑大家吐槽的运营商垄断问题)使得云计算这件事情变得格外有意思。

以前从来没有从 IaaS 服务提供商的角度去看待过搜狐机房建设,以及内部开发者如何使用该计算环境的问题。看了 AWS 的文档,觉得思路是应该变化一下了。

模仿 AWS,就应该这样描述网络环境:

  1. 建设有北京、济南、上海三个 Regions,Region 从计算的角度看应该是隔离的!!(这一点非常重要)
  2. 每个 Region 内建有若干个 Zones,Region 内部的 Zone 之间用低延迟的网络互连

最关键的第一点就是以前固守 BJ Region 的思路要转变过来,包括内部沟通用的一些名词也应该避免误导。当谈论所谓北京和上海的“内网”时,说的可不是 Region 内部 Zone 之间的“内网”,而是一条有较高质量保证的公网线路而已——All communications between regions is across the public Internet.

寻找帮助去搜索"mysql across aws regions"之类的关键词即可。感谢在 AWS 上探索的开发者们 :)

Topic: 

(13)Permission denied 或者 403 Forbidden

这两天接了个任务,调研 code review 工具。

前两天在 centos 上折腾 Review Board,rb-site 完成后,启动 httpd,error log 里报 [error] avahi_entry_group_add_service_strlst("localhost") failed: Invalid host name,这问题怎么着也没解决。最后换了 ubuntu,顺利异常,所有包都有二进制的,不像在 centos 里还编译了两个包。啥问题没遇到,就进入设置页面了。

今天继续在 centos 上试另一个 phabricator,安装很容易。访问页面报 403 You don't have permission to access / on this server,又搞了良久,chmod 了,chown 了,Allow from all 了,全都没有作用。关键字又按照 error log 里的错误(13)Permission denied: access to / denied 来搜,搜到一个 Fixing Apache (13)Permission denied: access to / 403 Forbidden,按照这个里面一步一步又过了一遍,除了倒数第二步 Make sure that the Directory Above has Execute Permission 没仔细看,倒数第一步也研究了一下,根据究竟什么是SElinux?发现这台 centos 应该不是 SELinux。回过头来仔细读了一下倒数第二步,这里面说 chmod 不能只改 /path/to/webroot/,应该连整个 /path 都改了才行。怀着死马当活马医的心情执行了一下。哈哈哈哈————

Topic: 

八股新闻通稿一篇

搜狐的无数基础服务和业务是基于开源软件构建的,没有开源软件,可以说不仅仅是搜狐,整个互联网行业都会丧失存在的基础。

从业务的层面,我们依赖于开源社区这个生态环境的繁荣发展;从技术的层面,我们希望工程师在开源社区里同高水平的同行相互学习,磨砺自身的能力;从文化的层面,我们推崇开源社区里以代码为中心,以真实需求为驱动,开放、平等、自由地进行交流合作的氛围。

为了鼓励工程师和开源社区有更深的合作.....

Topic: 

2013届校园招聘开发工程师JD

==前言:我的硬盘上专门有一个目录“JD”,可以说JD是我写得最严肃的文档之一,因为我总感觉我最期望读到这份文档的读者,一定是在用最挑剔和最怀疑的心态来对待它。凡是我看到网上写得好的JD,无不如获至宝将其复制粘贴..以及翻译到我的JD目录

以下职位仅仅是本次校招我手下的开发类岗位,欲了解更多搜狐校招信息,请访问 http://hr.sohu.com/

前端开发工程师/页面制作工程师(地点:北京、武汉)

  • 职位描述
    1. 负责将视觉设计师输出的设计完美制作成HTML/CSS,以及相应模板
    2. 和交互设计、产品经理、Web开发工程师紧密配合,使用JavaScript或者ActionScript完成浏览器端应用逻辑和交互效果
    3. 开发基于Chrome等浏览器的App(亦有称呼为扩展、插件)
    4. 探索基于HTML5、移动设备等新型终端上的JavaScript/HTML/CSS应用可能
  • 校招职位要求
    1. 熟练掌握前端开发的相关技术,JavaScript、CSS、HTML
    2. 熟练运用jQuery、backbone等前端框架
    3. 熟悉HTTP协议和规范
    4. 有良好的JS/CSS编码风格
    5. 熟悉常用的数据结构和算法
    6. 有软件交互、视觉设计方面经验者优先

App开发工程师(地点:武汉)

  • 职位描述
    1. 负责桌面以及移动设备的本地应用开发
    2. 和交互设计、产品经理、Web开发工程师紧密配合,将云端应用延伸到用户设备,提供最佳的设备使用体验和云服务体验
    3. 在桌面端包括Windows、Mac OSX、Linux等环境的开发
    4. 在移动终端包括iOS、Android、Windows Phone等环境的开发
  • 校招职位要求
    1. 熟练掌握C或C++开发语言,以及常用的数据结构和算法
    2. 至少熟悉上述一种本地应用开发所需的工具、类/库、开发环境
    3. 有网络Socket开发经验者优先
    4. 熟悉HTML/CSS/JavaScript使用者优先

Web开发工程师(地点:北京、武汉)

  • 职位描述
    1. 同产品经理、交互设计、前端开发紧密配合,负责实现Web端的用户业务逻辑,和相应的页面内容交互
    2. 同前端开发工程师、App开发工程师紧密配合,共同设计良好的服务访问接口,并实现
    3. 设计、实现和调优Web应用架构
    4. 为第三方开发者提供云端访问API/SDK,提升云服务价值;负责输出API文档和样例
  • 校招职位要求
    1. 至少熟悉Java、Python、PHP开发语言中的一种,以及相应Web开发的应用框架、类/库、开发环境
    2. 熟悉常用的数据结构和算法的原理
    3. 熟悉HTTP协议和规范
    4. 熟悉MySQL或者PostgreSQL数据库技术
    5. 熟悉HTML/CSS/JavaScript使用者优先
    6. 熟练应用Linux环境者优先

系统工程师(地点:北京、武汉)

  • 职位描述
    1. 设计并实现分布式、高可靠的系统服务
    2. 针对Java/Python/Node.js/PHP等语言虚拟机和执行环境的定制及优化工作
    3. 针对Linux操作系统、硬件特性、以及网络互联环境,进行相应的系统设计和调优
  • 校招职位要求
    1. 熟练掌握C或者C++开发语言
    2. 对常用的数据结构、算法的原理和适用范围有深入认识
    3. 熟悉Linux/Unix编程环境
    4. 至少掌握一门脚本编程语言(Python、Perl之类)
    5. 熟悉网络通信协议开发
    6. 有分布式开发经验者优先
    7. 有Linux内核开发经验者优先
Topic: 
订阅 RSS - 技术