Browsed by
分类:Uncategorized

NEUOJ Tech Talk #1

NEUOJ Tech Talk #1

开始之前

First Slide , Wait till 18:30

欢迎大家来到NEUOJ Tech Talk技术交流会, 今天, 我们会将在开发东北大学学生在线测评系统(NEUOJ)中使用的种种技术, 以通俗易懂的方式,分享给热爱技术的你们, 那么在我们的Talk开始之前, 让我们首先感谢那些对我们OJ开发给出种种建议的各位同学, 并颁发我们的奖品

颁奖环节

我们有请吴老师, 为他们进行颁奖

感谢吴老师,我们的NEUOJ 持续提供给大家进行渗透测试, 安全测试的平台, 并且对成功找到并且利用我们OJ的漏洞的同学,颁发丰厚的奖品, 从32GU盘 到 2T移动硬盘, 视漏洞大小而定, 对为OJ提出宝贵建议, 报出非常有价值的bug的同学,我们会进行奖励  欢迎大家踊跃参与

那么现在, 就让我们开始吧~

[Slide 2]

Tech Talk Starts

首先, 我们来了解一下,NEUOJ到底是什么

我们会先介绍 什么是Online Judge , 然后介绍 为什么我们要开发NEUOJ, NEUOJ的特点是什么, 然后会给大家展示NEUOJ的开发史

[Slide 3]

什么是OJ呢, OJ是一个可以在线编译提交的代码, 并且自动对代码的运行结果进行判断, 并且返回给用户判断之后的结果这样一个系统, O 代表Online, J代表 Judge。 我们下面来展示一下,什么是在线编译器。 [切换图片]大家可以看到,这是一个在线编译网站 codepad 的界面, 我们写了一个Hello world …, 然后选择我们的编程语言,C语言, 大家可以看到,这里支持C/C++/Haskell/PHP等多种编程语言的在线编译运行 [对这个图片进行解释], 然后当我们点击提交之后,[切换图片] 就会看到这个界面: 我们可以看到,这里已经输出了我们程序的运行结果。 这就是Online Compiler, 而Online Compiler 的功能的基础上, 再加上自动测评(Judge)的功能, 就是我们的Online Judge.[图片展示] [简单介绍]

[Slide 4]

现在流行的Online Judge 平台有北京大学的POJ, 杭州电子科技大学的HDUOJ, BestCoder, 以及国外知名的Leetcode, Codeforces, 还有Topcoder,下面,我们来看看NEUOJ是什么

我们的NEUOJ使用的是当今最流行的Web框架 Laravel, Laravel框架具有极高的可扩展性,丰富的插件系统,以及很好的安全性。同時, 我们的测评后端具有高度的扩展性,可以支持各种方式的测评,目前我们只支持了最基本的测评, 之后,我们会考虑增加更有趣的功能,如人机对弈测评机制等测评方式,之后,我们会详细介绍我们是如何实现的高度扩展性的测评系统 . 我们的NEUOJ不同于codeforces是为了举行各种比赛而建立的OJ,NEUOJ的服务是提供给广大学生,我们的天梯训练training系统提供给大家一个循序渐进提升自己代码能力的路线,用于让我校的各个专业的对编程有兴趣的同学提高自己的编程能力, 也给老师们进行计算机相应教学,提供一个测评编程能力,算法能力的平台。同时也为那些想要通过技术甄选成员的组织,以及想要带学生做项目的老师,提供一个测评能力的平台, 可以通过OJ提供的排行榜ranklist, 以及大家的代码统计信息,选出能力出色的同学加入

[Slide 5]

下面我们来一起看一下NEUOJ的开发历史:

2015-11-25 在我们开完第一次OJ开发会议之后,进行了第一次的代码提交,截止目前, 我们OJ已经有348个提交, 20000+行代码 ,近100个公开Issue,[一张张图片展示] [并进行解释]

我们的OJ目前已经支持的主要功能有,题目管理,竞赛系统,天梯训练系统,预计2.0版本开发完毕,要支持的功能有:[切图]

DEMO 下面我们请一位同学上台体验一下,我们的OJ的管理员后台,实现添加一道题目,并且添加一个比赛

[Slide 6]

那么对于这样的一个NEUOJ,我们是如何构建的呢, 下面我们会从,如何对代码进行管理,我们使用的Web框架,以及NEUOJ的核心,测评端, 以及NEUOJ的界面设计,前端技术几个方面进行介绍

[Slide 7]

首先,让我们来介绍NEUOJ的代码管理系统~ git

对于348commits 6 — 8 developers 合作的一个项目, 我们是如何实现多人协作开发, 即多人同时修改同一份代码的?

答案就是 GIT

相信在座的各位同学应该有日常使用git的, 那么什么是git呢? 谁能来回答一下?

那么下面让我们来了解一下,git到底是什么

我们设想这样一个情景  [这里举例 git的版本管理]

下面我们请NEUOJ后端开发组的洋葱同学, 结合刚刚我们说明的情形, 为大家演示一下git的使用

[Slide 8]

 

结合图片讲MVC

介绍Eloquent ORM

[Slide 9]

结合图片介绍Judgehost

简单介绍RESTfulAPI

简单介绍如何保护我们的运行环境

[Slide 10]

下面请NEUOJ的前端负责人 su123456 同学介绍一下, OJ前端开发所用到的技术

 

一个项目,最重要的并不是编写代码进行开发, 而是对项目进行维护,管理,保证项目的健壮性, 可用性,以及优化项目的性能, 接下来就来了解一下,我们是如何保证NEUOJ的质量的

我们将介绍如何提升OJ的性能, 以及如何自动化的测试代码的质量, 以及保证我们的服务器的安全性三个方面来介绍

[Slide 11]

[Slide 12]

[Slide 13]

安全DEMO 暴力破解密码

在这次Talk的最后, 我想要介绍一下, 这两个词语 Opensource 以及 Geek [jieshao]

最后,感谢大家参与这次技术交流会, 也希望我们今天所讲的能给大家一定的帮助,同时欢迎更多的同学研究技术, 学习技术, 也欢迎对OJ开发感兴趣的同学加入我们,同时,欢迎大家加入我们的NEUOJ Geek 群,大家一起分享技术,交流技术。NEUOJ Tech Talk #1就到这里了, 谢谢大家~

 

Draft

Draft

最近真的压力山大, 好多事情在一起需要解决,而且重要程度都是同样重要, 没有办法取舍任何一项任务

不过I am VOID

Just Keep VOID

函数调用 foobar 实验

函数调用 foobar 实验

本文记录对 C 与汇编的联系, C的函数调用在汇编下的实现, 下面是实验用的C语言源码

 

lightdm 配置

lightdm 配置

卸掉了gdm 换成了轻量级的lightdm,  配置很简单(不过我脑残的输错了背景图片的地址)

  1. sudo pacman -S lightdm lightdm-gtk-greeter
  2. sudo vim /etc/lightdm/lightdm-gtk-greeter.conf
  3. 在conf中将[greeter]下面的那个background 注释去掉  并且添加上自己的背景图片的地址,注意 lightdm 这个用户是没有访问我的home的权限的, 要给图片放到 /usr/share/pixmaps/里 ,并且给/usr/share/pixmaps/ 添加 x 权限, 该文件夹下面的文件添加 r权限

     
  4. 然后就可以用了~ 不过我发现我电脑上的锁屏键不好用了,于是给锁屏重新配置了一个快捷键, 在gnome settings 里 的keyboard 配置的 shortcut 命令为 dm-tool lock
  5. 效果图 (至今不知道该如何截取这个屏幕 , 除了使用虚拟机 , 所以凑合看吧各位QAQ
setcap wine 遇到的问题解决

setcap wine 遇到的问题解决

之后为了让普通用户也能通过wine访问到网络接口,需要给wine的相关程序(wine-preloader 和 wineserver wine) 一些特权

 

参考  man capabilities 和 setcap

  •  首先需要给CAP_NET_RAW 权限 这个要给到 wine-preloader 上,不过在设置完这个权限之后,执行 wine XXX.exe 会报错

wine: error while loading shared libraries: libwine.so.1: cannot open shared object file: No such file or directory

这是因为特权模式的程序运行的时候是不会检测到相对路径的lib库的, 具体参考文章如下:http://stackoverflow.com/q/6493846/296473  解决方法在文中已有了 就不赘述了

  •  上述问题解决后,运行wine 会提示  Internal errors- Invalid parameters  , 而且winedbg不可以attach到进程, 这个问题的解决方法是给wineserver(不是wine-preloader)CAP_SYS_PTRACE权限

 

 

[Laravel] laravel目录下执行 php composer.phar install遇到的各种问题的解决

[Laravel] laravel目录下执行 php composer.phar install遇到的各种问题的解决

由于我们在国内需要做的一些其他设置:

  • 大家都知道,国内有一些奇异的魔力, 导致composer的官方源packagist.org不能使用或者使用起来不顺手,下载速度特别慢之类的问题. 幸运的是国内的一些好心的巨巨们还是提供了一个供国人使用的packagist镜像 : packagist.cn , 想要使用这个镜像的话,需要在你的composer.json文件最下面加入这样一段(诶,你问最下面是指整个文件的最下面么? =  = 少年你先去看看json的格式再来问问题吧Qrz,)

    然后 执行 php composer.phar install 使用的镜像就是国内的镜像咯~~

PHP Fatal error:  Class ‘Phar’ not found in %Yourpath%

  • 遇到这个问题 , 说明你的php配置中没有打开对phar文件的支持, 而如果你用的是xampp里内置的php的话(比如我用的就是xampp的php),那么说明 你的path里没有加入xampp的php的执行路径, 注意这个路径一定要放在/usr/bin/php的前面 ,放在系统自带的php的前面,不然的话一会儿还会遇到其他的坑,我下面也会说明, 不过现在只要记住将xampp的php的执行路径放在path里的所有系统自带的php的执行路径的最前面就好.
  • 如果你用的是系统自带的php的话, 那么就用php –ini 看一下配置文件的位置, 并且将配置文件中 extension=phar.so启用(去掉前面的注释即可)

[RuntimeException]:Mcrypt PHP extension required.

  • 嘛嘛,这就是我前面说的那个问题咯~ 如果你是用的xampp里的php,一定要把xampp中php的路径放在所有php执行路径的最前面哦~ 不然的话就会出现这种问题了呢, 这个问题是由于你用/opt/lampp/bin/php composer.phar install 后 他去$PATH里找第一个PHP的$PATH结果找到了系统自带的php的path,而恰好你又没有给系统自带的php配置mcrypt module, 所以就GG了哦~
  • 如果你用的是系统自带的php的话,那么很显然你应该启用libmcrypt了哦~ , 具体怎么做查查就知道了

不能执行 php composer self-update 提示https链接不支持blabla

  • 你需要给xampp的php(或者系统自带的php)配置一个cacert.pem 证书文件  下载地址在这里哦~ , 下载完毕之后, 把这个文件放在你喜欢的目录里,然后在相应的php的ini内加入 这些配置

    然后就可以用了哦~~~

我在使用composer的时候遇到的问题就这些, 欢迎大家补充哦~

CSAPP Linking 学习总结

CSAPP Linking 学习总结

1.一个C语言程序是如何被编译成为可执行程序的

  • 首先 通过C preprocessor 将C语言代码中包括的头文件都写入代码 生产 main.i文件
  • 然后main.i的代码经过编译器 编译为汇编代码 main.s
  • 然后main.s 的代码再经过汇编语言编译器 翻译为机器码的obj(Relocatable Object Files)文件main.o
  • 这时候编译器的任务已经完成了 ,下一步是由链接器,将main.o,以及main.o依赖的所有obj文件 链接成为一个可执行文件, 生成了 a.out文件(静态链接)

2.什么是静态链接(由于很多词语涉及专业术语,专业术语用英语描述)

  • 链接的过程分为两个子过程: Symbol Resoultion 和 Relocation. 下面概括一下两个过程:

2.1 Symbol Resolution  将每个定义好的(Relocatable Object File 中的)符号分配唯一的一个名称 , 举个例子说明一下, 如果有两个C语言文件 需要被链接成一个可执行的文件, 并且在a.c里有一个全局变量 声明 int counter, 在另一个文件b.c里也有同样的一个声明, 这时将两个a.o b.o文件链接为一个可执行文件的时候,就会给两个文件的counter分配不同的名字, 保证每个符号都有唯一的一个名字与之对应

2.2 Relocation 将每个Relocatable Object File 链接到的地址(如函数调用时的地址) 修正为正确的值. 同样举例来说明,在编译如下程序的时候

由于编译器只是将每个C文件编译为相应的Relocatable Object File, 因而找不到在另一个文件,比如 vecAdd.c 里定义的函数 Add_vec的详细实现, 这时候 编译器会给这个函数一个假的入口地址 ,留在以后交给连接器处理, 如果连接器在其他的Relocatable Object File里找到了 Add_vec的定义的话 ,就会在Relocation这一步将这个函数的地址修改为正确的入口地址, 如果没有找到的话,就会报link error. 这就是Relocation的简单介绍.

3.Object Files 的种类:

ObjectFile 有三种 1. Relocatable Object File 2. Executable object file 3. Shared Object File , 其中第三个是与动态链接有关的一种Object File . 第二个就是我们俗知的可执行文件 , 另外根据文件格式不同 可以将ObjectFile分为 COFF, PE ,ELF, ELF是linux 上常见的Object File 格式.

4.Relocatable Object Files 详细说明

不论是文件 还是Object 还是程序 在计算机里存储都是以01形式存储的,都可以看作是文件 ,只不过由于规划的格式不同,解析的方式不同 ,才使得他们有的成为了文件有的成为了程序, Relocatable Object File 就可以看成有着特殊结构文件, 这个文件提供给了链接器在将Objects链接为可执行程序的需要的全部信息.

下面画出一个图来表示一下 Relocatable Object Files 的结构

2016.5.9 下文更新, 关于ELF文件结构可以参考这个文章

ELF 文件格式初步探索

[HDU 5178 ,BC#31 A] Pairs 二分优化时间复杂度

[HDU 5178 ,BC#31 A] Pairs 二分优化时间复杂度

题目中数据个数比较多,10^5个数据,时间复杂度n^2就会超时,因此不能用n^2的算法,因此采用二分的方式

先对数进行排序,进行一轮扫描,每一次扫描的时候找到最后一个与当前数的差的绝对值小于等于k的数(也就是说下一个数据和当前数据的的差的绝对值大于k) 这时,说明从当前数到找到的数这个范围内的所有数都可以任意组成满足条件的pair,不过要注意去掉重复的对。

代码如下