您正在查看: 软件开发 分类下的文章

项目展示 —— 课程表

课程表应该是学生党用的最多的功能了吧。
这次的项目是设计一款基于网页的课程表。
数据来源是正方教务系统的 Oracle 数据库的 Mirror,这里不详细介绍。
主要提供手机版服务,PC版为可选

最原始的设计是采用类表格的方法实现,手机端采用左右滑动切换周一~周五
电脑版效果如下:
QQ图片20140825194021.jpg

但手机版的设计却没那么简单,找不到较好的实现方式,不得已重新设计界面。

由于应用主要面向手机,所以重新设计的界面以手机为中心,电脑版再加优化。
根据自己使用手机的经验,手机上上下滑动远比左右滑动自然,于是考虑用其他展示方式替代表格显示。
手机上微博可以算是用得比较多的应用了,于是想是否可以将课程像微博一样一条一条展现出来。

经过不断优化和修正,最终效果如下:
(由于效果图太高,请到文章末尾查看)

其中课程的设计借鉴了 Android L 和 Google Now 的 Material Design。

电脑版将多个课程并排同行展示,这里直接用响应式的办法实现(手机端浏览器大多符合 HTML5 标准,这点不必担心),效果如下
无标题.pngQQ图片20140825193815.png

个人备忘:Nexus 4 Faux 内核编译

测试环境:Ubuntu x64
先安装软件:

sudo apt-get install bison build-essential curl flex git gnupg gperf libesd0-dev libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop openjdk-6-jdk openjdk-6-jre phablet-tools pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev

64位还需安装:

sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev

(好多包要装,还好digitalocean有mirror,应该是内网下载吧)

新建目录:

mkdir ~/android
cd ~/android

准备代码和编译工具:

git clone https://github.com/faux123/mako.git kernel
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8 toolchain

打上 CAF 补丁:

cd kernel/
git remote add cm https://github.com/CyanogenMod/android_kernel_google_msm.git
git fetch cm
git cherry-pick c53fb6d134fab3e3d7a022ba857d9cad4fcfa59a
git cherry-pick 07cbfb9a9cededdb5a283b56dded9c9ff69656a1
cd ..

配置参数:

export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=~/android/toolchain/bin/arm-linux-androideabi-
cd ~/android/kernel
make defconfig
make -j2

可以提取手机的 /proc/config.gz 解压得到编译配置,改名为 .config 放到源代码目录可使用之前的配置

HTML5 Notification API

与 WebkitNotification 的区别

过去,我们使用 window.webkitNotification 创建通知,但正如它的名字一样,这是个 Webkit 的专属接口,是在 HTML5 Notification 出来前的临时解决方案,在最新版 Chrome 中已经停用。

如何使用 HTML5 Notification API

根据 W3C 标准,创建一个 Notification 的正确方式是新建一个 Notification 对象,然后可以绑定这个对象的事件。不过在这之前,你需要用 Notification.requestPermission(callback) 方法请求创建通知的权限。

Notification 对象

创建一个 Notification 对象十分简单,只需要运行如下 JavaScript

var notification = new Notification(title, options)

其中 title 为通知的标题,options (可选) 为通知的参数,是一个 JavaScript 对象,对象可以包含如下属性:

dir: 显示顺序;可以使用 auto (自动)、ltr (从左到右)、trl (从右到左)
lang: 通知的语言;参见:RFC 5646: BCP 47 语言标识
body: 通知的正文
tag: 有点类似于 ID 的标识符
icon: 通知的图标

Notification 对象还有如下的静态属性:

Notification.permission
(只读) 用来查看当前网站是否有发送通知的权限

静态方法:

Notification.requestPermission
用于请求发送通知的权限,可以使用一个回调函数作为参数。在用户点击允许/拒绝时会触发回调函数

当你新建了 Notification 对象后,可以使用以下实例方法:

notificationObject.close()
关闭这条通知

notificationObject.addEventListener()
绑定事件监听器,这个不多说

notificationObject.removeEventListener()
跟上一个相反

Notification 对象后具有如下的事件:

notificationObject.onclick
当用户点击通知条时触发

notificationObject.onshow
当通知条显示后触发

notificationObject.onerror
当通知出现错误时触发(这个真没用过)

notificationObject.onclose
通知被关闭时触发

多用 MIN() MAX() 吧……

获取用户最后一次发帖的时间,可以用 MAX(timestamp) 做,也可以用 ORDER BY 做。

SELECT MAX(timestamp) FROM pre_forum_thread WHERE /* ... */

SELECT timestamp FROM pre_forum_thread WHERE /* ... */ ORDER BY timestamp LIMIT 0,1

结果使用 ORDER BY 的方法居然触发了 filesort QAQ~
好吧,以后坚决用 MAX() 和 MIN() 了……

解决 μTorrent 导致的磁盘占用 100% 问题

μtorrent 有个非常坑爹的问题,默认设置下,经常导致磁盘占用 100%……
任务管理器中提示 System 占用磁盘,甚至还害我重装了系统依然没办法解决。
最后使用监控软件才找到原来在不停读写 BT 下载目录文件……这才找到元凶……

μTorrent 默认情况下居然为了减少内存占用减少甚至关闭磁盘缓存……
导致出现了大量的磁盘 I/O 请求……尼玛这个年代还有人缺那几十几百M内存?都不够我开个 Chrome 的……
按下面配置修改后,就再也没有卡过 100% 了
QQ图片20140509223600.jpg

离开 WiFi 范围自动禁用 WiFi

学生党表示宿舍长期开着WiFi,出去上课的时候总是不记得关。
本着能省一点是一点的精神,希望离开WiFi范围的时候能自动关掉,于是自己动手写了个。
程序本身不占用任何资源,没有后台进程。自动注册一个网络状态监听器,当WiFi断开一段时间之后关闭WiFi。
值得注意的是,由于 Android 4.0 以上版本的限制,要注册监听器必须至少启动过一次程序,所以装好后需要手动点一下图标
启动后程序自动隐藏程序图标(因为你点进去也没用 →_→)
之后可能会考虑加个连接充电器的时候自动扫描WiFi,放在无线充电板上爽歪歪(笑
下载在这里:KK Auto Wifi.apk
PS:原创作品,请勿转载,谢谢

Discuz! 3.0 产品中的CSRF漏洞

漏洞利用:

[img]admin.php?frame=no&action=members&operation=clean&submit=1&uidarray=1&confirmed=yes[/img] (可删除UID1用户)


有一定 discuz 开发基础的人一定对 submitcheck() 这个函数不陌生吧

没错,这个就是 Discuz! 对 CSRF 攻击做的防御函数

这个函数会判断请求中 formhash 的值,避免伪造的访问

今天在编写某款插件的时候偶然将带有 FORMHASH 字样的代码(即“FORMHASH”字符串)扔进了 Chrome 的 console,结果意外打开了插件的提示框,代码本来是这样的:

/* 前略 */
if(submitcheck('submit', true)){
    http:// ........
} else {
    http:// .........
}

按理说 submitcheck 是会判断formhash的,而我给的formhash肯定是错误的

然后我又将 formhash 改为123456,结果依然过了formhash的判断

郁闷了,然后我就去看了 submitcheck 这货的实现方法

submitcheck -> helper_form::submitcheck

找到 source/class/helper/helper_form.php,节选部分代码:

public static function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {
        if(!getgpc($var)) {
            return FALSE;
        } else {
            global $_G;
            if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' /* 此处略去 */)) {
                if(checkperm('seccode')) {

你妹!!!!!!!

$allowget 就不管后面了???

formhash 拿去喂腾讯了???

无语,然后搜下,submitcheck($string, 1) 这种用法 discuz 自己也用……

剩下的自己YY吧

[展示] KK 离线下载

首先当然要给张预览图:

QQ截图20140108172728.png

原理:

后台跑Aria2下载器,开启XML-RPC服务,PHP连接上Aria2,调用相应json API获取任务列表输出

给XML-RPC设置了用户名密码防止被其他人调用

给BAE/SAE上的应用程序加速

先吐槽一句:BAE就是个渣!!!!!!!!!

下面还是以贴吧签到助手为例介绍一下BAE/SAE应用提速的技巧:

1.禁用内存缓存

对,你没有看错,的确是禁用内存缓存。因为内存缓存服务器与Web服务器不在同一台服务器上,有时候甚至比直接去MySQL数据库取还要慢,建议使用数据库来做缓存表

2.能用CDN就用吧

像jQuery,用各大网站提供的CDN速度都不错,比起放在BAE/SAE上要快很多。当然BAE是个特例,就算用他们的CDN依然慢的要死

3.合并请求

把CSS、JS都合并成一个文件,虽然看单个文件比较大,但是请求一个文件的时间要比两个文件的时间短很多

4.云 ≠ 高速

永远记住,SAE上的运算速度是VPS的1/10,BAE上的运算速度是VPS的1/1000000(BAE能用?)

[JavaScript] 搜索QQ群内妹纸

可以一键搜索Q群内女性成员

QQ截图20131106031926.png

由于搜索速度比较慢(需要逐一获取群内用户资料)
建议启动后切到后台去运行……

将下面的链接拖放到收藏夹即可用:

一键搜索妹纸

  1. 1
  2. 2
  3. 3