code just like a piece of shit.

评论系统修好了

typecho自带的评论过滤跟小墙冲突了 = =

现在已经修好了

在内网搭了个 WSUS 服务器

由于校园网连 Windows Update 实在太卡,于是打算自己搭一个 WSUS 服务器方便更新

  1. 先安装 Windows Server 2012 R2,这个就不多说了,使用 Dreamspark 的序列号直接激活正版无压力
  2. 点击 服务器管理器 -> 添加角色和功能,功能中勾选 无线 LAN 服务,确定重启
  3. 添加角色 Windows Server 更新服务,会提示勾选 IIS,别的设置也是基本默认就行
  4. 装好后点击右上角的 FLAG,选择执行部署后配置,然后等配置完成
  5. 打开 管理工具 -> Windows Server 更新服务,按照向导配置
  6. 由于本身连不上 Windows Update,配置的时候可以设置一个 HTTP 代理用于同步基本信息
  7. 过了 从 Microsoft 更新 中下载更新信息 这一步就可以关闭代理了,开着怪慢的

接下来就是漫..................长的同步和下载了

78G啊,我感受到微软的恶意了

关于签到助手的说明

首先这个项目应该算是正式起步了,之前开发 KK Payment 的时候所使用的 KK Framework 将被优化整合移植过来。
新的框架首先会在保证稳定性和速度的同时提供更多的面向对象的特性(有点被Java和C#洗脑了)
当然新的框架在新版的PHP和OPCache下能提供令人吃惊的性能
新的模板引擎能够大幅提升页面设计效率

说了这么多都是新的特性,具体的服务呢?
首先,签到助手目标是付费用户。免(shi)费(yong)用户当然是有各种限制的
其次,理论上说签到助手能提供对大部分签到网站的支持,具体需要逐步增加签到模板

签到助手后端语言将考虑使用 Java(用得比较多) OR Python/Go(这俩都不会,要学)

最后,第一轮测试将提供 Discuz! 论坛签到的支持,而不是以往提供的贴吧签到支持。

请不要再扒我的歌词插件了

RT……

项目展示 —— 课程表

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

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

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

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

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

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

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

[证据留存] 不要脸的广电恶意屏蔽第三方DNS服务

证据1:使用 Google Public DNS 无法解析域名

C:\Users\kookxiang>nslookup baidu.com 8.8.8.8
DNS request timed out.
    timeout was 2 seconds.
服务器:  UnKnown
Address:  8.8.8.8

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** 请求 UnKnown 超时

证据2:使用 114DNS 无法解析域名

C:\Users\kookxiang>nslookup baidu.com 114.114.114.114
DNS request timed out.
timeout was 2 seconds.
服务器:  UnKnown
Address:  114.114.114.114

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** 请求 UnKnown 超时

证据3:Google Public DNS 和 114DNS 均可 ping

C:\Users\kookxiang>ping 8.8.8.8

正在 Ping 8.8.8.8 具有 32 字节的数据:
来自 8.8.8.8 的回复: 字节=32 时间=8ms TTL=59
来自 8.8.8.8 的回复: 字节=32 时间=7ms TTL=59
来自 8.8.8.8 的回复: 字节=32 时间=7ms TTL=59
来自 8.8.8.8 的回复: 字节=32 时间=8ms TTL=59

8.8.8.8 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 7ms,最长 = 8ms,平均 = 7ms

C:\Users\kookxiang>ping 114.114.114.114

正在 Ping 114.114.114.114 具有 32 字节的数据:
来自 114.114.114.114 的回复: 字节=32 时间=6ms TTL=59
来自 114.114.114.114 的回复: 字节=32 时间=6ms TTL=59
来自 114.114.114.114 的回复: 字节=32 时间=8ms TTL=59
来自 114.114.114.114 的回复: 字节=32 时间=6ms TTL=59

114.114.114.114 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 6ms,最长 = 8ms,平均 = 6ms

证据4:Google Public DNS 和 114DNS 居然 TMD 在广电内网!!!

C:\Users\kookxiang>tracert 8.8.8.8

通过最多 30 个跃点跟踪
到 google-public-dns-a.google.com [8.8.8.8] 的路由:

  1    <1 毫秒   <1 毫秒    1 ms  192.168.0.1
  2     7 ms     7 ms     5 ms  172.16.3.4
  3     7 ms     5 ms     5 ms  10.73.2.9
  4     8 ms     8 ms     6 ms  10.10.194.49
  5    12 ms     7 ms     7 ms  10.10.190.129
  6     8 ms     5 ms     6 ms  google-public-dns-a.google.com [8.8.8.8]

跟踪完成。

C:\Users\kookxiang>tracert 114.114.114.114

通过最多 30 个跃点跟踪
到 public1.114dns.com [114.114.114.114] 的路由:

  1     1 ms    <1 毫秒    1 ms  192.168.0.1
  2     5 ms     5 ms     7 ms  172.16.3.4
  3     7 ms     5 ms     4 ms  10.73.2.9
  4    12 ms     7 ms     6 ms  10.10.194.49
  5    13 ms     8 ms     6 ms  10.10.190.97
  6     6 ms     6 ms     5 ms  public1.114dns.com [114.114.114.114]

跟踪完成。

猜想:
广电通过窃听用户的53(DNS)端口,将可疑的第三方 DNS 拉入黑名单,再将黑名单内的IP通过静态路由导到广电内网的一台服务器上,造成服务器正常的假象。比一般的 DNS 劫持恶心上万倍,要想用 DNS 服务,只能被他劫持。

为什么要设计程序?

这是篇废话,不推荐继续阅读

从最早熟悉的php,到上了大学后的C语言、Java(还有后来的Android开发),学会的编程语言越来越多…有时候经常会想到:要是有个xxx程序就好了,写起来也不难啊,改天自己做一个好了
类似这样的事情发生很多了,电脑里也有很多做了一半的工程…但最后还是废弃在那。可以说,中途放弃其实还是啥也没做,没有任何价值,也就是浪费生命。

所以有的时候,往往会问自己,为什么要写程序?写程序究竟有没有意义?究竟有没有未来?
其实我也不知道…应该说有的在我没有得到答案的时候就写出来了,比如贴吧签到助手。写的时候根本没管这些乱七八糟的事情,只是为了方便自己和朋友。
可是我慢慢发现,事情慢慢有点不对劲。越来越多打着不同招牌的助手冒出来了,甚至有的不知廉耻的样式都没改就开始打招牌…我开始问自己:我到底是为了什么开发的?
SafeGuard、Zend都相继失去了保护代码的作用,我越来越想不明白,为什么我还要维护下去?为了给某些人免费打工?
还有一个多月这个项目就发布一周年了,除了头一个月,可以说没有让我感到过开心…

好像说得有点远了…回到话题,我觉得,程序自然是为了把人从繁重的工作中解脱出来而存在的。所以,我开发程序应该是为了方便我而开发的。可以说这是我开发的初衷。所有开发项目首先要考虑的问题便是给我带来了什么好处,又有什么害处,我到底该不该做这个项目…

所以,我觉得我需要放弃一些项目,因为对于我来说,失去的远比得到的要多
对于以后的项目来说,我想我应该不会在发布出来了…我实在无法忍受自己的亲骨肉被拐跑时心痛的感觉。

一个月没有更新,但是我很开心,真的很开心

个人备忘: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() 了……

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. ...
  9. 11