Browsed by
月份:2015年11月

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权限

 

 

[被迫参加的hackathon] 在线编译系统开发小记

[被迫参加的hackathon] 在线编译系统开发小记

吐槽

因为某种原因我没有参加MSC举办的Hackathon, 不过我的部员们参加了 0.0 然后我本来想去蹭点Pizza之类的东西吃,结果(我感觉他们是给我诱拐过去了) 到了比赛现场之后告诉我, 这里封馆了 Orz 于是乎我就被迫开始写代码(连电脑都没有带只为了去蹭口pizza吃的我TAT[结果最后还没吃到pizza])

实现的是一个简单的在线编译系统 TOC (Toy Online Compiler) 支持多种语言, 下面简单说一下实现的思路和核心的代码

实现思路

简单分析一下这个系统,由两部分组成 ,代码提交模块和代码编译运行模块 ,前者负责将代码交给后者,后者编译运行完毕将结果返回给前者,然后前者将结果展示给用户.

具体实现方式是: 代码提交模块负责将代码文件保存到服务器, 然后通过socket将消息通知到代码编译模块,然后代码编译模块执行完毕的结果再通过通信的方式传递回来, 很显然实现代码提交模块实现难度很容易,主要的问题在后者的编译模块的通信和编译问题, 下面给出编译模块的核心代码

这段代码就是编译模块的核心逻辑, 我使用了一个队列来维护所有在队列内的通信, 队列最多有5个元素,   代码运行起来会持续检查队列是否为空,如果队列不为空,就会取出队列头的socket,处理socket传来的消息,编译相应的代码,然后产生结果通过封装好的socket_write SockWrite,将运行结果回传给代码提交模块,重复上述操作.

为了保证代码的可读性, 封装了一个编译类 actionClass 来进行编译和运行, 编译和运行的方式是通过exec调用系统命令,下面会具体说明

 

实现细节

  •  编译和运行的方式是使用exec调用系统指令, exec指令可以直接将执行结果作为返回值,不过他的结果只能返回stdout里的内容,stderr的内容不能返回, 因此我使用的方式是 将stderr的内容重定向到文件 cerr.txt 然后检测此文件是否为空, 如果不为空的话说明出错了
  • 不过在最初实现的时候出现了这样的问题, 当你提交一个编译错误的代码之后,再提交一个可以正常运行的代码,编译模块仍然会报编译错误, 而如果手动查看这个文件发现这个文件大小为0 , 通过打印filesize(“cerr.txt”)的返回值,发现了 filesize的返回值不为0 ,但是此时cerr.txt文件大小为0 (du -h cerr.txt )  查资料发现,  filesize 的结果会调用缓存的结果  “Note: The results of this function are cached. See clearstatcache() for more details.“[php.net 原文] . 因此在每次取得filesize之后, 都要使用clearstatcache()将之前的状态清除掉
  • 另外遇到的一个问题就是在停止掉后端编译模块之后, 再次启动这个模块会报错 Unable to bind , address already in use , 这个问题在php.net 的官网也有说明

If you want to reuse address and port, and get rid of error: unable to bind, address already in use, you have to use socket_setopt (check actual spelling for this function in you PHP verison) before calling bind:

设置上   SO_REUSEADDR

 

  • 另外代码运行时限是使用Linux中的timeout的功能实现的
  • 当程序执行结果为空的时候(不产生任何输出) 代码提交模块会一直在socket_read()处等待到来消息, 因此通过自己实现了封装好的SockRead和SockWrite 来避免这个问题

 

 

目前实现阶段

  • 支持PHP C++ C Python Ruby 的编译(解释)运行
  • 可以在Raspberry Pi上搭建整个系统

待解决问题

  • 编译时使用sandbox来保证安全性 , 暂定使用chroot来实现sandbox功能
  • 登录和注册没有完全实现
  • 将这个代码布置到拥有防火墙的CentOS服务器上, 两个模块之间不能互相通信(这个问题一直还没解决)

 

[Laravel] 配置phpstorm支持laravel语法补全

[Laravel] 配置phpstorm支持laravel语法补全

QAQ 不得不说,想使用我喜欢的vim来完美的做到larvel的智能补全太难了(以后自己试试能不能写出来插件吧QAQ*()

因此我回到了以前开发时用过的phpstorm, 给phpstorm配置laravel插件, 操作很简单, 不过要注意版本的兼容问题.

1. (其实没有顺序啦) 安装PhpStorm的Laravel Plugin

在phpstorm里连按两下Shift ,打开指令输入窗口,输入 Plugin,  选择 Install Plugin, 搜索laravel插件并且安装.

2.使用Composer 安装 laravel-ide-helper

这个laravel-ide-helper插件是我们要想让上面的插件实现补全的必备依赖, 如果不安装这个插件的话是没有办法使用laravel的补全的功能的, 而这个插件安装的版本要和自己的laravel版本配套

  • 使用的是 4.2.*版本的laravel 需要安装1.11.*的插件
  • 5.* 版本的安装2.*的插件

注意如果版本不匹配是不能安装成功的 , 会提示你缺少依赖

 

附上laravel-ide-helper插件的地址: Laravel-Ide-Helper

[Laravel] 使用artisan时遇到的问题 (更新中)

[Laravel] 使用artisan时遇到的问题 (更新中)

运行 php artisan migrate 的时候 报错(错误信息见下面) 的解决方法

报错信息如下

这是因为配置里面少了 一个参数 “migrations” 的值, 加上这个参数

之后问题就解决了 ~~~

 

执行db:seed 时,遇到问题(问题见下文)

主要错误信息:

参考这篇文章:http://laravel.com/docs/5.1/upgrade#upgrade-4.1.26

在User.php 中加入 :

再次运行php artisan db:seed 就可以了~

[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的时候遇到的问题就这些, 欢迎大家补充哦~