Feelyblog的发展

当前FeelyBlog的版本是:

Feelyblog 2.0 alpha 3 (2.0.3)

更新说明见页面最底部。

以下是今后的Feelyblog将会作出的更新:

(已完成但未部署)

暂无

(近期)

  • 添加“页面”系统。
  • 增强数据库模型基类的功能。支持数据表前缀。
  • 支持i18n
  • 评论系统从多说转移至disqus。

(远期)

  • 增加部署工具,可以通过浏览器或php脚本进行数据库初始化。
  • 开源,并建立使用文档。
  • 添加插件功能。
  • 内建评论系统。

Changelog:

Feelyblog 2.0 alpha 3 (2.0.3)
2015-11-30

* 添加HSTS支持。
* Route模块独立。

Feelyblog 2.0 alpha 2 (2.0.2)
2015-11-1

* 使用了PDO代替以前的mysqllib进行数据库连接,同时支持了多种数据库。
* 增加配置项信息,使配置内容完整有效。导航栏、页脚和友情链接的设置移动到了 config.php 中。
* 完成模板重构,增加了基本的主题系统。

Feelyblog 2.0 alpha 1 (2.0.1)
2015-10-20

* 完善Framework,使之可以运行基本功能。
* 完成移植,现在可以运行在普通的PHP服务器之中了,也可在PaaS云应用环境中托管运行。

Feelyblog 2.0 test (2.0.0)
2015-10-20

* Feelyblog 从 FeelyFramework中删去除博客组件之外的部分,移植为Feelyblog 2.0。

在生产环境中部署Django的静态文件。

今天遇到了在生产环境(Apache)中部署Django静态文件的问题。平常用./manage.py runserver习惯了。静态文件分布的到处都是,当我要把它们挪到Apache上时,我发现了一个问题:

static目录只能设一个

然后去看了看文档,果然Django的作者已经考虑到了这个问题。(既然是他们推荐的static文件分开放,自然就要给出解决方案才对啊。)

所以其实很容易:

在settings.py中加入

STATIC_ROOT = '/var/www/static'

其中/var/www/static是存放静态文件的目录,/var/www是Apache的Document root,同时在settings.py里配置STATIC_URL = '/static/'

注意要保证这个目录为空,因为接下来的操作会覆盖这个目录下的所有内容。

然后运行

python manage.py collectstatic

即可。

关于NW.js以及如何用HTML5来做一个桌面App

最近写标题好像越来越长了。。。。。。

这件事的起因是几天前的群里,有个人想转职成计数菌,于是找我做一个可以计数的工具。

嘛,我平常写计数器不少了(毕竟各种程序里面都需要各种神奇的计数器嘛),写带界面的还是第一回。。。。。。

然后看了看需求。觉得这东西应该用HTML5非常好写。

我想了想,那就用HTML5写好了

大家都知道,现在Hybrid App非常火,甚至也火到了传统的桌面上来了。网易云音乐的PC版就是一个用HTML和Webkit核心做的Hybrid应用。我用来写代码的Visual Studio Code也是基于Chromium的。

基于Chromium的本地应用,由于不是浏览器,于是没有浏览器的沙箱限制,通过一些精心设计的API,能做到和本地原生应用一样的事情。


为了方便做出这样的App,有一个工具非常的好用,它就是NW.js。原来的名字叫做node-webkit,顾名思义,就是把node.js和webkit打包在一起,再加上HTML5制作的主程序,完成一整套Hybrid的桌面应用的开发。不过自从node.js换成了io.js,webkit换成了Chromium,node-webkit可能觉得这个名字有点名不副实了,就改名成了NW.js

如果你电脑上已经有npm了,那么你只需要一行命令就能拥有NW.js

npm install nw -g

然后用 nw nwapp.nw 就可以打开nw的应用程序了。

而要做一个nw的应用程序也十分简单。只需要写一个json文件:

1
2
3
4
5
6
7
8
9
10
11
{
"main": "index.html",
"name": "App Name",
"version": "0.1.0",
"window": {
"icon": "img/icon.png",
"toolbar": false,
"width": 900,
"height": 550
}
}

把这个东西存成 package.json。然后在同一个目录里放一个index.html就可以了。

然后用shell打开这个目录,输入nw 。马上就能运行起来一个桌面应用程序,内容是你的index.html。

因为浏览器环境是你自己提供的Chromium,所以NW.js的开发要比传统WebApp开发要容易一些,因为不需要考虑浏览器之间的兼容性嘛。

所以只要Chromium上有的东西都可以拿来用,比如我就在这个程序里,用了很多ES6的新语法写JavaScript。

(不过糖吃太多感觉回不去了,下一个传统Web App估计我要上babel了。)


最后我做出了一个160KB左右的软件。然后和NW.js打包在一起。。。最后成品20M。。。。

嗯,看来NW.js还是更适合那些更大的软件。

NW.js在国内的教程资源不多,我基本上是靠啃英文的官方wiki和自己摸索。

好在使用NW.js和开发基于Chrome的Web App以及用io.js写网站本身没什么区别。

我最后写出来的东西参见:https://github.com/zyzsdy/Counter-Counter

下次更新会写写在这次用NW.js开发的时候碰到的坑。虽然还有这样那样的问题,以及还远远没有成熟,不过NW.js确实是今后开发桌面app又一个不错的选择。

如何在本地看到https的绿锁——建立自签名CA以及如何给自己发SSL证书

最近编写和调试了许多HTTPS的网站,可是本地测试的时候浏览器里的https上总是变成红色,然后打着一个巨大的斜线。那么如何在本地调试的过程中让本地HTTPS在浏览器里显示出绿锁呢?

我们需要一个自签名CA,然后用这个自签名CA给自己签证书。

嗯。。。。。。。。。。。。。。


在说怎么做之前,我们先来看一下服务器如何生成证书请求文件。

假设大家都已经装好了openssl。

首先建立一个RSA密钥:

openssl genrsa -out server.key 2048

然后生成证书请求文件:

openssl req -new -out server.req -key server.key -subj "/C=CN/ST=Shanghai/L=Pudong/O=Namido/CN=127.0.0.1"

其中subj的每一项都由/开头。CN的值就是希望申请可用的域名了。

当然,-subj可以省略,这样就会进入交互模式,按照提示输入内容即可。

这两步做完之后,当前目录里面应该已经生成了server.keyserver.req两个文件,其中.key就是我们的服务器私钥,.req是证书请求文件,如果是正常的申请步骤,下面就是把这个server.req文件拿给CA去签证书。


当然,我们今天是自己来做一个CA。

再来建立一个RSA密钥:

openssl genrsa -out ca.key 2048

这个RSA密钥用作CA的私钥,一会CA用这个私钥来签证书。

首先先给自己签名一个根证书。

openssl req -new -x509 -days 1000 -key ca.key -out ca.crt -sha256\
        -subj "/C=CN/ST=Shanghai/L=Pudong/O=Namido/CN=Namido CA"

注意此处subj的CN值,填的是CA的名字。

然后注意-sha256选项,必须加上这个选项才能使用sha256做证书加密。默认是用sha1加密的,而sha1现在已经不够安全了。

有了这个根证书以后,下面开始给前面我们生成的服务器证书请求文件签发证书。

openssl x509 -req -in server.req -out server.crt -CAkey ca.key -CA ca.crt -days 1000 -sha256\
        -CAcreateserial -CAserial server.serial

成功运行后,目录中会生成server.crt。这就是由我们刚才自签名的CA生成的证书了。

接下来把ca.crtserver.crtserver.key复制到HTTPS服务器上,并设置server.crt为服务器证书,server.key为服务器私钥文件。因为我们上级证书就是根证书了。所以把证书链文件直接设置成ca.crt。同时把ca.crt复制到本地。

双击下载下来的ca.crt,打开证书导入向导,将此证书加入“受信任的根证书颁发机构”即可。

做完了这么多,重启Web服务器,然后再输入https://127.0.0.1。终于看到萌萌的小绿锁了。

关于bash的自动完成

为了庆祝新博客落成,先来发篇技术类文章。

这篇文章是我9月17日写的。因为写了以后没地方发,所以极大的推动了现在这个博客Feelyblog 2.0的编码进度。


Bash中的Tab自动补全

今天在开发一个命令行工具,由于子命令很多,我又懒得记。平常自己是Tab党嘛,那么如何让自己的命令行工具支持Tab自动补全呢。

bash中有两个内置命令,completecompgen,前者用于给bash注册补全函数,后者用于从输入片段和列表中找出匹配的补全选项。

所以要做bash补全的话,只需要写一个补全函数,用complete命令指定,然后把这个脚本扔到/etc/bash_completion.d/下面就可以了。

compgen

在说这个脚本怎么写之前,我们先来说下compgen这个命令。

1
2
3
4
5
6
7
8
compgen -W "create clean delete drop" -- "d"
# 返回如下
#delete
#drop

compgen -W "-y --h -a" -- "--"
# 返回如下
#--h

所以compgen最基本的用法就是 compgen -W "候选词列表" -- "待补全词"

有种情况特别常用,就是需要补全的内容是文件。这种用法如下:

1
compgen -f -- "待补全词"

complete

这个命令就特别简单了,用法如下

1
complete -F 补全函数 待补全命令

比如说我写了一个bash函数名称为 _foo() ,我的命令行工具叫 foo1foo,都要用这个补全函数,于是我就可以这么定义:

1
complete -F _foo foo1 foo

补全函数

前面两个命令说完了接下来就轮到重点了。如何写这个补全函数。

其实这里是有一些系统预定义好的一些变量的:

  • COMP_WORDS 数组,存放当前命令行中输入的所有单词;
  • COMP_CWORD 整数,当前光标下输入的单词位于COMP_WORDS数组中的索引
  • COMPREPLY 数组,候选的补全结果
  • COMP_WORDBREAKS 字符串,表示单词之间的分隔符
  • COMP_LINE 字符串,表示当前的命令行输入

简单的说就是我们根据上下文和compgen计算出需要的补全结果,赋值给COMPREPLY数组,然后return 0就可以了。

下面是一个例子:

假设我的命令行工具是这样的:

foo {create|clean|delete|help|version} --参数名 参数值

create 的时候可用的参数: --name 标题 -c, --config 配置文件 -y, --assumeyes 忽略询问

clean,delete 的时候可用的参数: --name 标题

help,version 直接输出并退出,没有二级参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function _a() {
local cur prev subcommand # 定义一些内部变量
COMPREPLY=() # 清空保存返回结果的变量

cur="${COMP_WORDS[COMP_CWORD]}" # 当前位置的参数
prev="${COMP_WORDS[COMP_CWORD-1]}" # 上一个参数
subcommand="${COMP_WORDS[1]}" # 第一个参数

# 可用参数表
local opts opts_create opts_clean
opts="create clean delete help version" # 二级命令
opts_create="--name -c --config -y --assumeyes" # create的参数表
opts_clean="--name" # clean和delete的参数表

#下面先判断子参数
case ${prev} in
--config|-c)
COMPREPLY=($(compgen -f -- "${cur}"))
return 0
;;
--name|-y|--assumeyes)
return 0
;;
esac

#然后补全二级命令
if [ $COMP_CWORD = 1 ]; then
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
else
case ${subcommand} in
create)
COMPREPLY=($(compgen -W "${opts_create}" -- ${cur}))
;;
clean|delete)
COMPREPLY=($(compgen -W "${opts_clean}" -- ${cur}))
;;
help|version)
;;
esac
return 0
fi
}
complete -F _a foo

把上面这个文件保存成foo后存到/etc/bash_completion.d去就可以了。

当然一般的方法是链接过去。这样不需要你计算机里有多个这个脚本的副本。

当然如果这个工具更加复杂,也可以写出更加复杂的补全脚本来。

如果安装了git可以打开/etc/bash_completion.d/git文件,这是git的补全脚本,当然也相当复杂。

新博客终于落定了

漂泊了4个月。没有博客的日子。

原来放博客的PHP空间过期,我又不想在SAE上搭一个WordPress。在主机壳搭了一个WordPress可是略贵。刚好看到和主机壳身出同门的hostker这里各方面都能够让我接受,唯一一个需求是——需要用自己开发的PHP程序。

嘛,我是个开发者嘛,这点东西随便啦。而且我又不是没有开发过博客系统。

于是我就把弃了一年的FeelyBlog 2.0又翻了出来。

完全是自己写的PHP框架,然后在上面搭了一套博客环境。这就是FeelyBlog 2.0的构想。然而构想有了框架有了。我这个人嘛,有点拖延症。

于是一拖就是4个月,这4个月发生了许多许多事,然而我都无法一一记录下来。(因为我没有博客嘛)

我在知乎写了一篇又一篇的长回答,有时间了搬到博客里来。

开发了几个基于Java的SSH的新项目,开始尝试着iOS App开发。

学习了Grunt、puppet、jenkins,学会了makefile怎么写,学会了Linux上的程序开发。还顺便学了一些ruby和一堆python。

世界千变万化,我上次更新博客的时候还在流行的东西,如今已经没有人想起。


。。。。。。

嘛。。扯远了。。

于是上个月,我终于基于Feely Framework 2.0开发好了一套博客系统的原型。昨天(10月20日)终于忍下心来把这个原型移植到这个系统上。于是就有了这个博客。

现在看来hostker还不错

希望hostker能如我所愿,让我这个博客活的时间长一些。

biliroku bilibili生放送录制

从我开B站直播间开始就一直想做些辅助工具。

前几天看直播的时候突然想把直播内容录下来。于是研究了一下。

然后biliroku就诞生了哈哈。。。

由于B站是用rtmp发布的,我还查找了很多rtmp的资料,最后发现——B站原来是用http下载的。。。

http的flv的话,接收直播流就简单了。调用api获得下载地址以后,调一个webClient去DownloadFile到本地就可以了。

虽然这样保存下来的flv有些问题。毕竟没有总长度等信息,不能直接上传,不过用一些其他的工具再压制就不会有问题了。也算是可以正常使用。

还有一个原因是刚刚安装了VS2015,想体验一下新IDE,

所以这个工具就这么出来了。

主页:http://zyzsdy.com/biliroku

↑在这个地址可以下载。

自己还想到很多功能,但是都没(lan)有(de)加进去,如果我会做更新版本的话。就会加一些读取flv信息,然后计算到底录了多长时间的提示。

还有预约录制,这也是下个版本需要做的东西。

Hibernate4中buildSessionFactory过期的解决方案

今天JavaEE项目要写Hibernate。然而书上的版本是老版本。

我就写了cfg.buildSessionFactory();

结果无情的被IDE划上一道删除线。。。。。

于是我上网查询了一下,找到了以下的解决方案:

1
2
3
4
5
6
7
8
9
Configuration cfg = new Configuration(); 

cfg.configure();

ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();

SessionFactory sf = cfg.buildSessionFactory(sr);

Session session = sf.openSession();

虽然并没有什么卵用,因为我很快就换Spring来管理Hibernate了。

很久没有写博客了。今天找到些要记录的东西。。。。。于是先发一篇。。。

网站设计中要注意的细节

这篇文章是我对于知乎问题:http://www.zhihu.com/question/25535246 的回答。

当时好好整理了一下自己的思路,写的也比较长。转到这里来保存。


对于一个网站来说,最重要的自然是用户体验。从我看来,用户体验其实就是一对细节的集合。只有我们这些细节强迫症患者,才格外追求这个。

所谓用户体验:一句话就是——让用户用着舒服

如果让我想“让用户用着舒服”的第一点,就是“让用户感觉着舒服”。可是这一点就是常常被忽视的细节。下面我列举出一些让用户用着舒服的要素。很多是自己在开发中感受到的,可能并不完整。

UI设计维持同一风格。具体来说就是,网站的界面元素在整个网站中具有一致性。比如说“按钮”,这个非常重要的界面元素。登录界面的“登录”“注册”,发帖界面的“回帖”“发布”,还有“确认订单”。可以看出它们是具有相似的功能的——submit。那么它们在外观上就要保持一致。

UI一致可以让用户凭着自己的直觉找到所需的功能,减少用户的网站使用学习成本。

功能收放有度。我的意思是指在网站首页和网站的其他位置中,功能按钮的折叠和展示情况。有些不常用的按钮一般不需要展示,而是折叠到某个菜单中。而将常用的功能直接设为链接或按钮。这点在制作导航条的时候特别重要(因为导航条会出现在每一个页面上)。这个不仅与网页编程,而且与网页内容设计关系也很大。比如导航栏一般推荐放置3~4个一级导航,如果你有十多个分类,建议再分到几个更大的分类里。导航栏排十多个链接并不是很好看的。

不要让同一元素多次出现在页面上,尤其是这一元素很显眼的时候。比如某网站有很多栏目,首页是这些栏目内容的推荐,网页上充斥着大量的“查看更多>>”按钮,(每个栏目都有一个,边上有个排行榜又来一个。一个网页上十二三个大按钮还都长得一样,看多了就感觉恶心了。)而且按钮元素还非常大。给人感觉特别不好。

网站要简洁,把你复杂的功能隐藏起来,等用户需要的时候再出来。而不是平铺在页面上,不管用不用都在那。这才是设计。

确定页面层叠顺序。(写到这里我发现这点确实容易被忽略。于是单独出一条来写)如果你的网页需要多个层,上面的层有可能会覆盖到下面,这时候要特别小心设置z-index值。不要造成遮挡的问题。比如我就见过某网站弹出对话框,一层透明图片层把按钮盖住了,于是完全无法操作对话框按钮。好吧,这是比较大的bug,还有一些小细节,比如某最近改版了的弹幕视频网站,它的“返回顶部”按钮盖在了评论区域迷你播放器的上面。于是视频部分被遮挡。果壳以前也出现过类似问题。当编辑器过长的时候,比如我这样的一篇长回答。编辑器的顶部工具栏会被固定在页面顶部。这是个非常好的照顾用户的设计。然而果壳当时出了个bug,他们忘记了上面的导航栏,于是编辑器工具栏盖在了导航栏的上面。

精心布置广告位和推荐位。网站的用户总是不喜欢广告的,但是毕竟广告是网站的收入主要来源。现在网页广告屏蔽软件也比较多,如果广告太难看/影响操作,就难逃被用户屏蔽了。广告位/推荐位放置最重要的是显眼。比显眼更重要的是不能影响用户的使用。没有人喜欢右下角弹出广告。

广告最好占据页面的一个固定的位置,不要放在浮动层,千万不要弹窗。广告显示的时候不要影响用户的操作,比如以前的网易、腾讯(网易腾讯这么大,我就黑一黑吧,不说某网站了)广告,会把整个网页的header部分向下压,而且有个动画。更郁闷的是,动画是在载入后才播放的。于是就会出现——我正要点击某个链接,广告出来了,广告的位置占据了我原来鼠标的位置,我点到广告了。这种广告会遭致用户反感,不是大网站或流氓网站千万不要这么干,会把自己搞死的。

网页的title标签和网站的语义化。HTML的title属性是最容易被人忽略的属性之一,然而它非!常!有!用!title的作用非常简单,就是在鼠标停留在上方一小会之后弹出一个工具提示。有的时候为了UI的设计,有些文字的按钮就用一个图形代替了。当你的图形设计比较抽象的时候——用户怎么知道你那个图标代表什么意思。这个时候title的作用就出现了。title还有一个作用是处理…元素。所谓…元素是指元素内容过长,以至于显示了“…”来表示这后面还有更多的东西。这种元素一定要加上title标签表示全部的内容。这样可以在用户鼠标悬停在“…”上一小会后,显示出全部的内容。

图片的alt属性也同理。总是我是推荐图片一定要有alt属性。以及其他的一些语义网需要注意的地方。比如用系列标签来写标题,用标签包裹住文章内容,用来表示网站底部,在标签中写Email地址等。而不是一味的用div,div,div。。虽然div很重要(这里提一句,如果你的网站还在满篇用table,tr,td,而不是div,你最好去重新找一个前端),但是用各种语义网元素可以帮助其他的程序阅读你的网页,并知道它们是干什么的。这样方便在移动平台等地方更好的显示你的网页,也方便搜索引擎对你网页的内容进行抓取。

减少不必要跳转。有的时候你的网站可能需要处理一些信息而没有显示的网页,有些网站会用一个跳转页来解决。比如登录的时候,会先跳到一个空白页来设置登录状态,修改数据库等操作,然后再将用户定位到登录完成页。不过跳转页的最大缺点就是会增加等待时间。而且容易导致操作失败(用户在这里刷新)。某外卖网站的支付功能在支付成功的时候,从到银行支付成功页点回到商户网站,会跳到一个支付完成页,然后跳到支付正在处理页,然后又是一个支付成功页,最后跳到订单成功页。我看着我的浏览器跳来跳去都觉得好难受啊。

后台可以用curl收发某些消息,也可以在最初的跳转页带上更多的参数,直接让结果页中的sql语句处理全部内容。

背景、边框和底纹。有的时候这些背景,边框和底纹会直接的对用户造成使用上的影响。首先弹出对话框一定要有非透明背景。边框和底纹可以为用户标识操作区域。哪些区域是推荐修改的,哪些是无关紧要的之类的东西。如果提供给用户选择的是几个大区域,那么用不同的边框来标识出用户的选择也是很重要的。

在保证UI设计风格的基础上,不要为了达到某一视觉效果来修改网页。有些网页为了达到某些UI上的要求,比如是间距的特殊要求来用一些空元素。实际上这些空元素对于HTML来说,就是垃圾代码。这种情况下尽量用CSS达到某些要求,如果实在达不到,不应该强求。我一直是认为UI设计不应该要求前端设计100%还原。垃圾代码不仅影响网页运行,还可能导致一些奇怪的bug。

给用户明确的反馈。当你在做一个操作的时候,可能背后的javascript要执行很长的时间。这个时候你必须明确告诉用户你正在处理一些东西。最常用的方法是将鼠标光标切换成wait模式,还有在网页上显示一个小圈圈的动态图。如果你用Ajax登录,那么在点击登录按钮之后应该显示一个“登录中”的提示。如果你的表单验证出错,你应该用红色指示出错误的那一项,并告知错误原因。 有些网站会让那个框闪一闪,甚至直接把输入焦点重定位过去(这在你的表单很长时非常管用)。用ajax载入的东西,默认文本应该设置为“正在载入”,而不是用一个空div。总之就是让用户知道这张网页正在做什么,这样虽然不能减少用户等待时间,但是可以给用户一个心理安慰,告诉它们:我正在忙着处理你的数据。而不要让你的网站表现的像是失去响应一样。

合并css和javascript来保证不用每次载入。一个网站通常都采用的相同的UI,那么你每张网页的CSS可能非常相似,当然也会有一些不同的地方。这个时候你应该合并它们,即使有一些内容在当前页面上用不到。一个网页更应该避免载入多个css。现在的浏览器都可以自动缓存文件,有些服务器也支持发送HTTP 304 Not Modified状态,告诉浏览器使用它缓存中的信息。如果整个网站使用相同的css和javascript文件,那么它们都只需要在主页载入的时候载入一次。在网站中的其他页面间切换的时候,浏览器会在缓存中取出css和javascript而不是重新请求服务器。这样可以节省服务器带宽,也可以让网站载入速度更快。

务必不要忘了支持键盘操作和触摸操作。键盘永远是交互的最重要的接口之一,在你的网站中请不要忘了键盘的使用。最常见的是支持回车提交表单,比如登录的时候,大多数人更习惯输入完账号密码后按回车来登录,可惜的是,网页并不会自动帮你做这件事,你需要自己去处理回车事件。移动互联网发展迅速,你的网页可能大多数人都是在手机上看的。如果你的网页是响应式设计,你很可能需要处理一些触摸事件来让这个页面在手机上更好用。

明确的后退链接。如果你的网页内容比较多,那么用户可能会深陷到一个很深的目录结构里,比如子栏目的子栏目,当他们想回来的时候并不容易。提供一个后退到高级目录的链接(注意不是浏览器的后退链接,因为用户可能从子栏目的一个文章跳到另一个文章。)就可以有效的提高用户体验。如果允许,提供一个面包屑导航栏明显更好。如果你的网站有导航条,那么确保有一个“首页”链接。方便用户在网站各个栏目间跳转可以让用户更舒服。

永远不要相信来自浏览器的任何消息。你的用户可能在表单里乱打。或者胡乱修改你地址栏上的参数。就算是你用javascript检查过了,或者post提交表单,这个世界上仍然有Web-Sniffer等类似的工具可以让用户把信息提交到服务器。所以服务器一定要对用户输入和网址参数再过滤一次。
但是这并不代表你可以不在网页上用javascript验证表单,对表单采用javascript验证可以让用户不必提交就知道自己发生了什么错误,这也是一种良好的用户体验。

网址要好看。网站不同栏目的区分是URL的不同,URL可以区分目录,传递参数。建议编写URL路由来统一目录和参数。举个栗子,这个题目的URL是http://www.zhihu.com/quesiton/25535246。这个URL就很漂亮。如果这个URL是这样:http://www.zhihu.com/quesiton.cgi?quesid=25535246。这一种UID就没有上面的好看了。更不用说有些网站的URL是这样的:http://www.zhihu.com/question.cgi?quesid=25535246&userid=03913583&lastquesid=13931538&jump=Cjdfapfjf3n2rqraeSFA8f2f283ewjjfsfj==。。。。。。在URL上尽量用斜线分隔,让你的参数看起来像目录一样,减少不必要的参数传递,让它们都到session或是cookie里去。网址好看便于用户分享你的链接,用户也更愿意去收藏你的网站。

Happy 2015

看了看这个博客上一篇居然是2014年9月份发的。大三我就没有写过博客嘛。

2015年已经过了快一半了。我也算刚刚重新弄好自己的博客,可以更舒服的写一段时间了。当然,似乎不能一直舒服下去。

我居然弄丢了我的域名。

于是这个博客只能忍痛转到zyzsdy.com域名上来。放弃了原来namido.net已经存在的google和百度流量。真是。。。。。。

不过我这个博客本身就是给自己看的,我倒不在乎流量有多少,比如你看,这里连评论都没有嘛。

2014的下半年没写博客,所以我来写写我做的事情。包括:

  • 开始学习Windows API编程和DirectX和GDI的开发。
  • 加了个LL相关的群,然后认识了妹空酱,然后被他拖进了Project Aphrodite的开发中。
  • 接下来由于上课需要学了Swing。
  • 因为找寻各种方法买了LL5th的物贩通贩,于是就用那个虚拟信用卡注册了AWS。虽然AWS速度比较慢,但是我本来就是冲着学习和试用去的。
  • 然后我又申请了Azure的试用。Azure真的是太贵了。不过在试用期的一个月里,我是真心感受到了,只要学会使用,Windows Server原来这么好用。Azure服务器性能挺强的,为了不浪费性能,就开了MC服务器。并没有想和谁一起玩,只是在群里传播,一个月下来居然有5个人经常在里面。
  • 于是我又注册了阿里云,并把MC服务器放置在了阿里云上。
  • 一下子我就从没有见过VPS的人变成了对VPS十分熟悉的人了,哈哈。

最近感觉身边的LLer越来越多了。而且还都是欧洲人,不是欧洲人的是壕。简直不能做朋友啊。

不过虽然这么说,看到LL越来越受欢迎其实还挺开心的。毕竟是自己喜欢的东西。

虽然这个Happy2015的帖子应该在2015年1月1日发。不过当天我的博客还是处于一个不能上的状态。

这几天也是我突然闲的没事成功转移域名后才让这个博客复活的。

于是,2015年也要加油了。