-
Notifications
You must be signed in to change notification settings - Fork 11
/
davidblog(5).sql
564 lines (515 loc) · 207 KB
/
davidblog(5).sql
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
-- phpMyAdmin SQL Dump
-- version 3.2.0
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2010 年 03 月 05 日 15:12
-- 服务器版本: 5.1.35
-- PHP 版本: 5.2.10
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- 数据库: `davidblog`
--
-- --------------------------------------------------------
--
-- 表的结构 `admins`
--
CREATE TABLE IF NOT EXISTS `admins` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 转存表中的数据 `admins`
--
INSERT INTO `admins` (`id`, `username`, `password`) VALUES
(1, 'davidx', 'aa47f8215c6f30a0dcdb2a36a9f4168e');
-- --------------------------------------------------------
--
-- 表的结构 `archives`
--
CREATE TABLE IF NOT EXISTS `archives` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`entryNum` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
--
-- 转存表中的数据 `archives`
--
-- --------------------------------------------------------
--
-- 表的结构 `categories`
--
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`slug` varchar(75) NOT NULL,
`entryNum` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
--
-- 转存表中的数据 `categories`
--
INSERT INTO `categories` (`id`, `name`, `slug`, `entryNum`) VALUES
(1, '未分类', 'uncategoried', 1),
(2, 'Python', 'python', 7),
(3, 'PHP', 'php', 1),
(4, 'Linux', 'linux', 2),
(5, 'Vim', 'vim', 1),
(6, '数据库', 'database', 1),
(7, '服务器配置', 'server-config', 3);
-- --------------------------------------------------------
--
-- 表的结构 `comments`
--
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`entryId` int(11) NOT NULL,
`username` varchar(50) NOT NULL,
`email` varchar(75) NOT NULL,
`url` varchar(255) NOT NULL,
`comment` text NOT NULL,
`createdTime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `entryId` (`entryId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=219 ;
--
-- 转存表中的数据 `comments`
--
INSERT INTO `comments` (`id`, `entryId`, `username`, `email`, `url`, `comment`, `createdTime`) VALUES
(1, 6, 'bug', 'xxx@163.com', '', '基本和php的语法相同,只是这里没有大括号,全部由’:''来代替,结束的时候使用end.\r\n\r\n-----------\r\n这其实是php内置支持的语法', '2009-12-14 11:26:12'),
(2, 6, 'David Shieh', 'mykingheaven@gmail.com', '', '我也是后来才知道的~以前一直以为php支持{}的block呢', '2009-12-14 13:08:01'),
(3, 7, 'linux007', 'cnshzj007@139.com', 'http://cnshzj007.gicp.net', '有关inittab文件的修改,我是第一次看到,因为如果不修改好像也能成功引导到gdm吧。只要在deamon中加放gdm就成了。', '2009-03-28 18:22:51'),
(4, 7, 'linux007', 'cnshzj007@139.com', 'http://cnshzj007.gicp.net', 'inittab中的gdm,和rc.conf的gdm是冲突的,当你进行ctrl-alt-f1时。', '2009-03-28 19:00:02'),
(5, 7, 'kingheaven', 'mykingheaven@gmail.com', 'http://', '如果不修改inittab,只在rc.conf里加入gdm的话,当然可以引导到gdm了,但是如果机器出了问题,我可以只修改grub里的kernel行,在后面加个1,就能直接引导到纯命令行了,非常的方便', '2009-03-28 23:05:04'),
(6, 8, 'imxxb', 'xcxxb@163.com', 'http://www.imxxb.com/', '那幾個主題我原來只裝了第一個,\n現在把其它也裝上了 ^_^', '2009-03-28 22:19:55'),
(7, 8, 'kingheaven', 'mykingheaven@gmail.com', 'http://', '我觉得这是安装emerald外,最好看的主题了,我现在用的是Foresight,绿色的主题.', '2009-03-28 23:03:03'),
(8, 12, '人谷子', 'iamxxb@gmail.com', 'http://www.imxxb.com/', '你可以试下gpick,更强大哦', '2009-04-03 09:36:09'),
(9, 12, 'kingheaven', 'mykingheaven@gmail.com', 'http://', '好啊~谢谢\n晚上尝试下!', '2009-04-07 10:49:18'),
(10, 12, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '我一直都在gimp着。。。', '2009-05-17 23:16:31'),
(11, 14, 'sxlnok', 'sxlnok@163.com', '', '我用的WIN环境 phpnow套件\n\n项目是创建了 无法创建model\n\nE:usrhtdocsyiiframework>yiic.bat shell E:usrhtdocsyiiindex.php\n命令创建提示:\nInternal server error\n\ninclude failed to open stream: no such file or directory\n\nan internal error occurred while the web server was processing your request\nplease contact the webmaster to report this proble', '2009-06-26 10:59:19'),
(12, 14, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '不知道你有没有修改main.php呢?\n\n修改main.php, 配置数据库信息\n\n数据库端创建所需要的所有表', '2009-06-26 11:07:26'),
(13, 14, 'sxlnok', 'sxlnok@163.com', '', '按上面的步骤全做了\n\nPDO开展是开启的', '2009-06-26 11:22:13'),
(14, 14, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '我仔细看了下~你的命令也不对吧\n\nyiic.bat shell就可以了, 不用加任何参数', '2009-06-26 13:53:18'),
(15, 14, 'sxlnok', 'sxlnok@163.com', '', '直接 yiic.bat shell 不行啊\n\n不知道什么问题', '2009-06-26 14:48:42'),
(16, 14, 'sxlnok', 'sxlnok@163.com', '', '提示 php.exe 应用程序错误', '2009-06-26 14:53:16'),
(17, 14, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '你自己装AMP环境吧, 别用集成版的了.', '2009-06-26 17:33:59'),
(18, 15, 'yuhan', 'coregogo@gmail.com', '', '代码添加了,输入时还是老提示:\n\n“Please fix the following input errors:\n\n验证码 cannot be blank.\nThe verification code is incorrect. ”\n\n请问什么原因呢?', '2009-08-23 13:06:49'),
(19, 15, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '原因是没有将验证码这个字段加入到model里的safeAttributes()方法里.\n这也是我的疏忽, 没有将它写出来.', '2009-08-24 09:55:27'),
(20, 15, 'windman', 'wjh8018@163.com', '', '灰太狼,safeAttributes() 代码没有呢,不补一下啊,看得迷糊,一直把别名那方法当这个了呢', '2009-08-28 19:03:51'),
(21, 15, 'windman', 'wjh8018@163.com', '', '你忙,我补上吧,从你的源码里面找出来的 public function safeAttributes() {\n return array(\n ''username,password,password_confirm,verifyCode'',\n );\n }', '2009-08-28 19:05:42'),
(22, 15, 'windman', 'wjh8018@163.com', '', '呃,要修改下,\npublic function safeAttributes() {\n return array(\n ''username,password,passwordConfirm,email,verifyCode'',\n );\n }', '2009-08-28 19:10:52'),
(23, 15, 'DD', '173241376@qq.com', 'http://173241376@qq.zone', 'Ϊʲô', '2009-11-12 08:52:21'),
(24, 15, 'xinwei', 'huxw@hite.com.cn', '', '总是显示:Please fix the following input errors:Password Confirm cannot be blank,\r\n但是我是在重复密码的位置上输入的,为什么老有这个错误?', '2009-12-22 10:40:34'),
(25, 15, 'David Shieh', 'mykingheaven@gmail.com', '', '密码确认有问题, 就是passwordConfirm字段, 你看一下它有没有在safeAttributes()里.', '2009-12-22 10:56:58'),
(26, 15, 'xinwei', 'huxw@hite.com.cn', '', '就是这个问题啦,看来safeAttributes()真的很重要,比较容易忽略。感觉这份教材比官方的教材容易懂,坚持看下去。就是数据库用的是MYSQL,而不是SQLITE,yiic shell命令执行MODEL的时候总是莫名其妙出错退出,最后用SQLITE就好了,不知其他人是否也这样?', '2009-12-22 11:19:06'),
(27, 15, 'David Shieh', 'mykingheaven@gmail.com', '', '说来惭愧, 我都没有坚持写下去了.\r\nYii确实好用, 如果你想深入学下去的, 加这个群吧, 就说灰太狼大王介绍来的, 群号:80196965\r\n再有什么不会的, 直接给我写邮件就行了.', '2009-12-22 11:31:04'),
(28, 15, 'xinwei', 'huxw@hite.com.cn', '', '哎,群也加不进去,大王的邮件地址也找不到,这块沼泽的确泥泞……', '2009-12-24 10:20:58'),
(29, 15, 'David Shieh', 'mykingheaven@gmail.com', '', '上次不是把群号发给你了吗?\r\n我的邮件地址是mykingheaven(AT)gmail.com', '2009-12-24 10:25:26'),
(30, 16, 'bantana', 'bantana@gmail.com', '', '不错的yii入门案例,貌似没有放mysql.schema出来啊!', '2009-07-01 21:05:05'),
(31, 17, 'Tiger.M', 'ENIGMA1223@163.COM', '', '文章里面的图片都没有办法正常显示,还请博主,检查一下,给个建议:给文章加个tag,这样找一类的文章不会很痛苦了。呵呵。。。。', '2009-10-13 10:08:37'),
(32, 17, 'David Shieh', 'mykingheaven@gmail.com', '', '嗯~由于迁移的时候没有拷贝里面的图片和一些代码文件, 所以现在貌似是个问题了...', '2009-10-14 00:10:33'),
(33, 17, '春福', 'yuyonggui550329@163.com', '', '下载使用一下,看看好不好!', '2009-11-10 09:39:42'),
(34, 17, 'David Shieh', 'mykingheaven@gmail.com', '', '唉~都是迁移博客的时候~图片和一些文件都丢失了~', '2009-11-10 09:41:26'),
(35, 19, 'Email是真的', 'my@yunshan.org', '', 'CategoryController好像有问题', '2009-05-04 02:17:00'),
(36, 19, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '是有问题~多谢仁兄的提醒~', '2009-05-04 10:26:50'),
(37, 20, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '用Yii开发网站快不快。。。', '2009-05-17 23:08:54'),
(38, 20, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '还是比较快的~', '2009-05-17 23:33:53'),
(39, 21, 'kukat', 'kukathe@gmail.com', 'http://www.upblog.net', '我觉得在没有完成分类管理功能之前应该在sql加上个默认的分类吧\n另外你的编辑器是不是把tab用4个空格填充了?yii使用的是tab,建议你也用tab吧\nprotected/controllers/CategoryController.php 行54少了")"\nprotected/views/article/_article.php 行7$article->getUrl()应改为array($article->getUrl())', '2009-05-14 11:30:12'),
(40, 21, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '感谢你的建议~我已经把错误都改了~bug修复版也放出来了~', '2009-05-17 01:28:21'),
(41, 23, 'scscsc', 'cshan@gmail.com', '', '刚刚开始学,还没入门,发现你的blog是最好的教程\n但是对于初学者而言最重要的是基本的过程,而不是复杂的功能和代码,所以非常期待你的教程,非常感谢', '2009-05-18 07:02:17'),
(42, 23, 'jiemeniu', 'sc6112@yahoo.com.cn', '', '对啊,教程现在只出到2,后面应该还有吧~~ 期待ing', '2009-05-21 17:21:28'),
(43, 24, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '学了Ruby,看看这个Python,在gtk的用法上都差不多。。。', '2009-05-19 14:10:32'),
(44, 26, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '看看python的代码还真是很艺术。。。', '2009-05-19 11:14:27'),
(45, 27, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', 'GTK就是这样,布局很好很灵活,文章写的真不错!', '2009-05-23 10:13:13'),
(46, 27, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '谢谢ABitNo老兄的支持啊~', '2009-05-23 10:55:21'),
(47, 27, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '<a href="#comment-384" rel="nofollow">@kingheaven</a>\n哈哈,会多多向你学习的。。。', '2009-05-25 09:30:37'),
(48, 29, 'bluker', 'bluker@126.com', '', '有图方有真相。靠\n 必填都没提示的啊', '2009-06-16 09:23:35'),
(49, 29, '葡萄皮', 'putaopipi@foxmail.com', 'http://www.putaopi.info', '直接:\nyaourt Cairo-Dock\n\n呵呵。没用过,装上试试。', '2009-06-17 17:55:20'),
(50, 29, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '感谢葡萄皮, 已经成功安装Cairo-Dock了!', '2009-06-17 20:01:37'),
(51, 29, 'ZheX', 'zhex81@gmail.com', 'http://www.zhex.net', '桌面挺漂亮的哦,特别这个女优:p', '2009-06-17 23:21:57'),
(52, 29, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '程序员心情愉快, 才能写出优秀的代码啊!', '2009-06-19 14:00:04'),
(53, 29, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '现在我这两个东西都没用。。。\n喜欢那个桌面', '2009-06-25 01:14:37'),
(54, 30, '想入非非', 'yangfan0601@gmail.com', '', '事实上我用了这么久就没有出现过终端蜂鸣的现象?', '2009-06-16 21:23:37'),
(55, 30, 'keke', 'zhengkefeng15@gmail.com', 'http://www.imkeke.net', '有时候还是很有用的,不过我用screen的时候一般以视觉代替了。', '2009-06-17 12:54:08'),
(56, 31, 'keke', 'zhengkefeng15@gmail.com', 'http://www.imkeke.net', '非常好的工具,所有最新的最cool的软件都可以安装了。', '2009-06-17 12:57:36'),
(57, 31, '葡萄皮', 'putaopipi@foxmail.com', 'http://www.putaopi.info', '呵呵,刚刚从debian转到arch一个月,用的很爽。\n\n现在几乎每天都用yaourt,简单,方便,最重要的是,软件涵盖太丰富了。', '2009-06-17 17:51:05'),
(58, 31, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '我竟然从来不用这个。。。\n最强大的是ABS', '2009-06-17 22:19:41'),
(59, 32, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '我还在apache,自己没有服务器,现在这些东西也就不管了。。。\n还有个light什么。。。\n\n你这个主题我曾经用过', '2009-06-17 22:18:01'),
(60, 32, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '我自己都见到过~汗啊~不想自己写主题~没艺术细胞...\n\nApache做为开发服务器还可以~运营的话~性能是个很大的问题~国内的很多门户网站都转nginx了.', '2009-06-17 22:35:09'),
(61, 32, '呆呆虫', 'shensuping@hotmail.com', '', '呆呆虫来搅基了,哇哈哈!~~', '2009-07-14 16:27:16'),
(62, 33, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '我的不是这样的。。。我的只要改一下xorg.conf就行了。。。', '2009-06-17 22:15:19'),
(63, 33, 'keke', 'zhengkefeng15@gmail.com', 'http://www.imkeke.net', '好像期启动hal就可以了的。。。', '2009-06-17 22:18:37'),
(64, 33, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '启动hal不行。。。', '2009-06-17 22:20:10'),
(65, 33, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '我自己试过了~安装上面2个软件后~把hal加到启动项里就行了~\nlinuxsir的人都推荐删除xorg.conf的...', '2009-06-17 22:33:32'),
(66, 34, 'bluker', 'bluker@126.com', '', '太苛求了', '2009-06-18 09:13:47'),
(67, 34, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '做优秀的PHPer是这样的, 因为PHP提供的东西有限, 想要做的好, 自身的能力就显得更加重要了.', '2009-06-18 11:38:35'),
(68, 34, 'sim', 'ggg@gmail.com', 'http://sim', '会这些能拿多少米.在深圳这个水平的人如果能拿10K就不错了', '2009-06-18 19:29:03'),
(69, 34, 'kingheaven', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '剩下的就看个人能力了, 就算都会, 也有能力高低...\n而且事实上, 工资也不完全是跟能力挂钩的...', '2009-06-19 13:54:02'),
(70, 35, 'keke', 'zhengkefeng15@gmail.com', 'http://www.imkeke.net', '图的质量太差了!fcitx的颜色定制还是很强的!还有个gui的配置软件。', '2009-06-19 21:12:16'),
(71, 35, '想入非非', 'yangfan0601@gmail.com', '', '非常不错的配色,比我以前的一个好多了', '2009-06-20 21:44:11'),
(72, 35, 'bluker', 'bluker@126.com', '', '是不是真的停止开发了', '2009-06-22 10:46:49'),
(73, 35, 'npnufn', 'omegao@yeah.net', '', '不错的暗色调啊\n我用的是搜狗的配色,浅色的', '2009-06-23 13:53:26'),
(74, 35, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', 'ibus默认的就很好看', '2009-06-25 01:02:46'),
(75, 37, '想入非非', 'poplarch@gmail.com', 'https://twitter.com/poplarch', '--depclean ;-)', '2009-11-11 21:35:52'),
(76, 37, 'David Shieh', 'mykingheaven@gmail.com', '', 'yes~you are right! Thanks', '2009-11-12 09:31:18'),
(77, 38, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '这个跟java很像\n\n另外发现你blog一个问题,就是在Anti-spam里面输入完成后,我按TAB,竟然直接跳到了页面的最上部,这样用着真不自在', '2009-06-26 17:55:52'),
(78, 38, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '我自己也发现了。。。。但是目前没有找到好的插件替代它。。。。', '2009-06-26 22:23:23'),
(79, 40, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '这个不错,等我哪天不这么懒了,我就来试试gentoo', '2009-07-10 17:49:26'),
(80, 40, 'kangzj', 'kangzj@mail.bnu.edu.cn', 'http://kangzj.net.ru', 'Gentoo没有试过,太高级了,等我linux提高了再玩这个吧,哈哈\n申请个链接啊,http://kangzj.net.ru\n你的链接我已经做好了,呵呵', '2009-07-11 11:06:41'),
(81, 40, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '好啊, 欢迎你加入Gentoo的大家庭, 共同提高linux水平.\n\nP.S.交换已经做好.', '2009-07-11 22:53:58'),
(82, 40, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', '这个写的很好,建议博主跟linuxtoy似的写个gentoo的安装指南。把你的博文整理pdf下载。近期我有可能也要迈入gentoo行列lo', '2009-07-12 19:29:06'),
(83, 40, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', '交换一下链接吧,你的已经做好了,arch to gentoo', '2009-07-12 19:32:03'),
(84, 40, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '留下您的博客地址吧', '2009-07-12 19:58:02'),
(85, 40, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', 'young001.blogbus.com', '2009-07-12 22:08:27'),
(86, 40, '葡萄皮', 'kollo44@qq.com', 'http://www.putaopi.info', '换的快啊,上次来看到你在说arch,这次看到的是gentoo。\n我这种懒人,已经折腾不动gentoo了,曾经折腾过两次,发现不能在一天以内搞定系统,也就作罢。\n\n可以交换个链接吗?你的链接我已经在我的站上挂了一个多月了。呵呵。', '2009-07-16 14:24:44'),
(87, 40, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '生命不息~折腾不止!\n\n感谢您的支持~把您的博客地址留下吧~我加进来.', '2009-07-16 16:27:50'),
(88, 40, 'xx', 'iamxxb@gmail.com', 'http://www.imxxb.com/', '你blog访问速度好快,跟飞一样。', '2009-07-30 13:11:12'),
(89, 40, 'risent', 'shengqi542@gmail.com', 'http://risent.net/blog', '折腾了好几天刚刚安装好Gentoo,才看到这篇好文阿', '2009-08-17 21:00:18'),
(90, 41, '呆呆虫', 'shensuping@hotmail.com', '', '大王!可否php-fpm启动php?', '2009-07-15 11:53:48'),
(91, 41, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '貌似php-fpm是公认为最好的守护php-cgi进程的程序呢.', '2009-07-15 12:32:06'),
(92, 41, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', '花这个两天时间,我弄声音花了近一天,都快崩溃。。。', '2009-07-15 23:11:04'),
(93, 41, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '以后你会发现你花的时间还是值得滴!~', '2009-07-16 17:52:34'),
(94, 41, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '我发现自己有点喜欢php了', '2009-07-16 18:26:21'),
(95, 41, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '苦海无涯~回头是岸!\n\n赶紧皈依我佛吧!!!', '2009-07-16 19:23:24'),
(96, 41, 'transtone', 'zm3345@gmail.com', '', '/usr/bin/php-cgi 你的 php有这个文件吗?spawn-cgi,也没有这个包吧。\n参照本文的设置并没有成功,继续折腾……', '2009-07-30 00:41:19'),
(97, 41, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '你没有/usr/bin/php-cgi的原因是你安装php的时候, 没有给cgi这个USE标签, 参考我的USE标签(问博文的开始处), 重新安装PHP就有了\n\nspawn-fcgi我忘记了, 你用emerge -s spawn试试, 看看有没有.', '2009-07-30 09:36:46'),
(98, 41, 'transtone', 'zm3345@gmail.com', '', '$ qlist php |grep -i php-cgi\n/usr/share/php-select/php-cgi.sh\n/usr/lib64/php5/bin/php-cgi\n\neix spawn\n[I] www-servers/spawn-fcgi\n Available versions: (~)1.6.1-r1 (~)1.6.2 {ipv6}\n\n搜索nginx+fcgi的资料来到这里,感觉你的文章中似乎有些和实际不符的地方,所以冒昧回复。\n网上的资料和博主文中说的都差不多,但我一开始怎么测试都起不来。没想到重启(系统,非服务)一次又怎么都ok了,很是奇怪。\n\nps,spawn-fcig是可以 /etc/init.d/spawn-fcig.whterveruwant start 启动的,当然,需要稍稍配置一下。', '2009-07-30 11:25:45'),
(99, 41, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '不用在意这些, 欢迎您来讨论遇到的问题!\n\n加上cgi这个USE标签装安装php的时候, 会自动装上php-cgi, 使用fastcgi标签装nginx的时候, 会自动装fastcgi的支持.\n\n我启动的spawn-fcgi的方式是用的命令行, 将这条命令放到启动项里, 呵呵', '2009-07-30 13:13:36'),
(100, 41, 'transtone', 'zm3345@gmail.com', 'http://rent', '既然不介意,那我就直说了。\n首先,用USE="cgi" 会装上php-cgi是事实,但我上面我已经贴出其具体路径了,并不是你文中的路径,请查实。\n其次,我特别提出来是 spawn-fcgi,而非 spawn-cgi ,但楼上的回复还是写成了spawn-cgi。\n如果楼主只是给自己留点记录,可能并不会在意这些小问题。但如果是有新手碰巧搜索到此文章,而照此依葫芦画瓢的话,岂不是会误导人家?\n不好意思,可能是我太较真了,抱歉。', '2009-08-02 08:28:20'),
(101, 41, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '非常感谢您的回复, 我仔细看了, 确实是我的笔误\n1.具体的PHP-CGI的路径我会核实的\n2.确实应该是spawn-fcgi不是spawn-cgi, 根本没有spawn-cgi这个东西, 是我打错了.\n\n是我一时太疏忽了, 给您带来了这么大的困惑, 实在是不应该, 我立马纠正.\n\n再次感谢您的纠正!', '2009-08-03 13:34:53'),
(102, 41, '獨立的圓', 'iamxxb@gmail.com', 'http://www.imxxb.com/', 'php好像沒有ming這個USE哦!', '2009-12-10 22:08:42'),
(103, 42, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', '没用这个,看不懂', '2009-07-16 13:01:27'),
(104, 42, 'kangzj', 'kangzj@mail.bnu.edu.cn', 'http://kangzj.net', '没有看懂……\n\n我网站更换域名了:http://kangzj.net,麻烦更新下哈,辛苦', '2009-07-16 17:15:57'),
(105, 42, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '好的, 现在就更新.', '2009-07-16 17:50:59'),
(106, 42, '东至', 'pl@forastro.com', '', '知道你想说什么,但是确实没看懂', '2009-07-31 12:10:52'),
(107, 42, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '不知道你有没有去试用我上面写的代码, 相信用了以后, 你会发现我在说什么的.', '2009-07-31 14:42:22'),
(108, 42, 'HicroKee', 'hicrokee@gmail.com', 'http://www.hicrokee.com', '不就是python的装饰函数么~\n\n这种设计方法实在有点搞笑。\ndjango里可以通过signals实际,类似事件驱动。\n其他一些框架如FleaPHP的则是重载pre_save或类似函数实现~', '2009-08-24 20:19:07'),
(109, 43, '东至', 'pl@forastro.com', 'http://zhaoyaodong.cn', '好东西!', '2009-08-01 16:13:05'),
(110, 43, 'kangzj', 'kangzj@msn.cn', 'http://kangzj.net', '太方便了,哈哈,谢谢david', '2009-08-01 16:43:22'),
(111, 43, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', 'php忙飘过', '2009-08-01 19:52:27'),
(112, 43, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '这些东西用RoR也是相当简单,代码看起来也是很漂亮\n不过现在看着PHP也不错的', '2009-08-04 12:03:38'),
(113, 45, 'kangzj', 'kangzj@mail.bnu.edu.cn', 'http://kangzj.net', '一边学一边顶', '2009-09-01 14:36:10'),
(114, 46, 'HicroKee', 'hicrokee@gmail.com', 'http://www.hicrokee.com', '没特殊必要就JSON啦,XML太折腾人~', '2009-09-02 16:05:32'),
(115, 46, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', 'php的json要求数据必须要utf-8编码的, 可是我的数据有西欧字符, 必须是iso-8859-1, 所以才不得不用xml的.', '2009-09-03 16:50:19'),
(116, 47, 'kangzj', 'kangzj@mail.bnu.edu.cn', 'http://kangzj.net', '真不错,先收藏了', '2009-09-03 18:32:32'),
(117, 47, 'darkredz', 'darkredz@gmail.com', 'http://doophp.com/', 'Good!', '2009-09-03 21:25:58'),
(118, 47, 'filinse', '136323069@qq.com', '', '很不错,这正是我想要的那种,不过这个下载链接已经失效了,麻烦博主能不能发给我一份呢?\r\nmail:136323069@qq.com', '2009-12-14 15:19:24'),
(119, 47, 'David Shieh', 'mykingheaven@gmail.com', '', '真是不好意思, 博客迁移后下载地址都失效了~我回去找一下发给你', '2009-12-14 15:23:16'),
(120, 47, '然然', '271647590@qq.com', '', '我也想要一个,能发一个给我吗?非常感谢!271647590@qq.com', '2009-12-19 14:47:19'),
(121, 48, 'imxxb', 'iamxxb@gmail.com', 'http://www.imxxb.com', 'cool !', '2009-09-14 22:45:56'),
(122, 48, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', 'thanks~man!', '2009-09-14 22:49:58'),
(123, 48, 'imxxb', 'iamxxb@gmail.com', 'http://www.imxxb.com', '你还可以用pcmanfm管理你的壁纸和桌面图标,就不需要feh了。\nps,第4条最后有错别字', '2009-09-14 22:52:00'),
(124, 48, 'kingheaven (灰太狼大王)', 'mykingheaven@gmail.com', 'http://davidshieh.cn/', '太激动了~居然打错字了...', '2009-09-14 22:54:25'),
(125, 48, 'HicroKee', 'hicrokee@gmail.com', 'http://www.hicrokee.com', 'openbox和pcmanfm就不发表评论,功能对我来说太少。\nfbpanel还不错,tint2没试过。\ngnome-terminal的确是垃圾,随便一个terminal都能换掉它~', '2009-09-14 23:00:01'),
(126, 48, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '好久不见了啊\n我还没有订制过Linux,只是装个Ubuntu玩~', '2009-09-15 00:40:55'),
(127, 48, 'kurrunk', 'kurrunk4@gmail.com', 'http://kurrunk.com', '专家别见笑,问一下:\nfbpanel在左边有一个“开始”菜单,tint2没有,那应该怎么运行程序?dmenu?', '2009-09-15 09:44:57'),
(128, 48, '灰太狼大王', 'mykingheaven@gmail.com', '', 'openbox有右键菜单的,程序都放这里', '2009-09-15 12:25:02'),
(129, 48, 'risent', 'shengqi542@gmail.com', 'http://risent.net/blog', '好有爱的桌面,等那天审美疲劳了,我也用这个', '2009-09-15 20:58:41'),
(130, 48, 'young001', 'young001@live.cn', 'http://young001.blogbus.com', 'OPENBOX还是不错的,换了之后比gnome快', '2009-09-17 13:29:02'),
(131, 48, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', 'so large ...the resolution of the picture', '2009-09-20 19:47:26'),
(132, 49, 'filinse', '136323069@qq.com', '', '链接失效了。。。', '2009-12-14 15:23:56'),
(133, 49, 'David Shieh', 'mykingheaven@gmail.com', '', '迁移博客时弄丢了...我晚上回去找找~到时给你email!', '2009-12-14 15:36:16'),
(134, 50, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '工作了,爽啊,我还要二年...', '2009-09-23 09:31:38'),
(135, 50, 'bluker', 'bluker@126.com', '', '顶你', '2009-09-23 10:47:40'),
(136, 50, 'bluker', 'bluker@126.com', '', '这个留言太差了,换一个', '2009-09-23 10:48:00'),
(137, 50, 'HicroKee', 'hicrokee@gmail.com', 'http://www.hicrokee.com', '我发现我是最上级了?!!!\r\n我通过了David Shieh程序员鉴定六级了?!', '2009-10-11 18:38:31'),
(138, 51, 'kukat', 'kukathe@gmail.com', '', '没事吓折腾啥', '2009-10-09 14:34:42'),
(139, 51, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '我呀~~', '2009-10-09 21:25:45'),
(140, 51, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '这个主题真难看,简单是简单,就是太粗糙了', '2009-10-09 23:30:13'),
(141, 51, 'David Shieh', 'mykingheaven@gmail.com', '', '所有说我不好的人啊~我祝你们的手机都掉厕所里啊~阿门!', '2009-10-09 23:46:36'),
(142, 51, '獨立的圓', 'iamxxb@gamil.com', 'http://www.imxxb.com/', '哈哈,我倒是覺得不錯,線條簡潔而有質感,我喜歡。', '2009-10-10 19:03:52'),
(143, 51, '獨立的圓', 'iamxxb@gamil.com', 'http://www.imxxb.com/', '訪客頭像怎麼搞的?openID?', '2009-10-10 19:04:34'),
(144, 51, 'HicroKee', 'hicrokee@gmail.com', 'http://www.hicrokee.com', '觉得还不错,喜欢简单的主题。\r\n你怎么去迁移这玩意了?\r\n同学,加友链', '2009-10-11 18:36:05'),
(145, 51, 'David Shieh', 'mykingheaven@gmail.com', '', '不是我要迁移的~是浪点逼我迁移的~他们的主机快倒闭了..', '2009-10-12 17:15:44'),
(146, 51, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '上回来还没有换主题呢\r\n这个真黑,适合晚上用', '2009-10-14 02:04:15'),
(147, 51, 'David Shieh', 'mykingheaven@gmail.com', '', '这个适合任何时候用~哈哈', '2009-10-14 11:23:30'),
(148, 51, 'jaycn', 'gysj05@126.com', 'http://www.jaycn.org', '适合任何时候用~哈哈', '2009-10-20 08:42:23'),
(149, 52, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '收藏了\r\n我在nginx+php fastcgi', '2009-10-14 02:03:02'),
(150, 52, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '现在这个主题也不错啊。。。', '2009-10-15 16:19:32'),
(151, 52, 'David Shieh', 'mykingheaven@gmail.com', '', '是呀~黑黑的!', '2009-10-16 15:51:37'),
(152, 52, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', 'flup应该怎么安装啊,能写详细些吗?', '2009-11-10 17:33:34'),
(153, 52, 'David Shieh', 'mykingheaven@gmail.com', '', '我用的是gentoo, 是通过portage安装的flup, 如果你用的是别的linux的话, 可以看看源里有没有flup, 如果没有的话, 尝试下从源码安装flup吧. 源码安装可以参考这篇文章, http://canofy.javaeye.com/blog/353749, 我看了下, 应该就是传统的python setup.py install就可以了, 你试下吧', '2009-11-11 10:52:05'),
(154, 53, 'kurrunk', 'kurrunk4@gmail.com', 'http://kurrunk.com', '更晕了,刚还看到有人说alsa比oss先进……你GOOGLE一下“PulseAudio,ESD和ALSA,OSS的关系“', '2009-10-23 10:58:46'),
(155, 53, 'David Shieh', 'mykingheaven@gmail.com', '', '不是吧~alsa有声卡独占的问题~即2个程序不能同时使用声卡, OSS就没这个问题.', '2009-10-24 22:25:05'),
(156, 53, 'Yang Zhe', 'yangzhe1990@gmail.com', 'http://yangzhe1990.wordpress.com', '。。。。。。。。。真的是么?\r\n别告诉我“试过,就是的”。', '2009-11-26 13:27:59'),
(157, 53, 'David Shieh', 'mykingheaven@gmail.com', '', '以前是这样的, 但是现在没有这个问题了, alsa没有声卡独占的问题了.\n\n不过有个问题很奇怪, 我的朋友也是用Gentoo的, 装上alsa后, 声卡还是有独占的问题, 不知道为什么了.\n我自己用是没有这个问题的.', '2009-11-26 14:49:38'),
(158, 54, 'Robin', 'gl.deng@gmail.com', 'http://rlog.cn', '呵呵,一点小忙,不算什么。\r\n很实用的工具呀,推荐大家使用 :)', '2009-10-24 22:42:21'),
(159, 54, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '做的很不错,简洁实用', '2009-10-25 14:22:47'),
(160, 55, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', 'rails的route相当强大', '2009-10-29 14:15:26'),
(161, 58, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '是啊,我一天十几个小时都在网上\r\n就是太不健康了', '2009-11-08 15:32:45'),
(162, 59, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '我也很多事啊。。。空间我也在找啊找。。。', '2009-11-10 07:39:26'),
(163, 59, '松手?瞬间', '280760823@qq.com', 'http://www.chinacmmp.org/', '遇到烦心事。不要去想太多就OK啦。', '2009-11-20 15:41:03'),
(164, 60, 'bluker', 'bluker@126.com', '', '好黑阿', '2009-11-12 10:51:31'),
(165, 60, '卢松松', 'reed@vip.qq.com', 'http://www.lusongsong.com/', '你闲置是做什么的啊', '2009-11-12 10:59:12'),
(166, 60, 'David Shieh', 'mykingheaven@gmail.com', '', '闲置?啥意思?', '2009-11-12 11:24:12'),
(167, 60, '天缘博客', 'lovoner@gmail.com', 'http://www.metsky.com', '这是玩的吧,整的这么复杂?如果博主不同意我的观点,希望告诉我一声,我要好好研究一下。', '2009-11-14 13:07:59'),
(168, 60, 'David Shieh', 'mykingheaven@gmail.com', '', '是这样的, 如果希望自己的程序方便管理的话, 分门别类是必须的了~如果只是希望运行一个程序, 完全可以把所有的东西都放在一个文件里, 但是当这个文件超过上千行的时候, 相信你自己看起来都头疼了吧', '2009-11-14 16:59:04'),
(169, 60, 'zengleo', 'zengleo@163.com', '', '最近也在关注web.py 嘿嘿~', '2009-11-22 16:08:11'),
(170, 60, 'David Shieh', 'mykingheaven@gmail.com', '', '欢迎一起讨论!', '2009-11-24 13:00:38'),
(171, 61, '獨立的圓', 'iamxxb@gmail.com', 'http://www.imxxb.com/', '折騰的代價:)', '2009-11-19 00:59:18'),
(172, 61, 'David Shieh', 'mykingheaven@gmail.com', '', '有些疲倦和纠结', '2009-11-19 10:23:33'),
(173, 61, 'xifs', 'imxifs@gmail.com', 'http://blog.imxifs.cn', '为了不折腾,最终没有转向Gentoo', '2009-11-21 10:17:00'),
(174, 61, 'David Shieh', 'mykingheaven@gmail.com', '', '折腾才能提高自己的技术...', '2009-11-21 23:48:36'),
(175, 61, 'MeaCulpa', 'infernoxu@gmail.com', 'http://maximameaculpa.com/', '嘿嘿, 推荐你留着Sabayon的Overlay, 毕竟那有好多软件,还有一个备用的kernel-source, 手头有个sabayon live应急也不是坏事', '2009-11-24 10:15:34'),
(176, 61, 'MeaCulpa', 'infernoxu@gmail.com', 'http://maximameaculpa.com/', '我每天在老婆洗澡的十分钟内完成配置,升级,解决block等一切问题。\r\nGentoo可以是一个很慵懒的系统...', '2009-11-24 10:16:54'),
(177, 61, 'David Shieh', 'mykingheaven@gmail.com', '', '哈哈, 知道了\nsabayon里面有dropbox呢, 这是我要的,\nSabayon live我已经刻成DVD了, x86的和amd64的各一张', '2009-11-24 10:59:35'),
(178, 61, 'dogstar', 'dogstar0219@gmail.com', '', 'arch 和gentoo能够结合就最好了.可以选择自己build,也可以使用现成的.', '2009-12-12 15:13:20'),
(179, 61, 'Ken Wu', 'ken.wug@gmail.com', 'http://kenwublog.com', '不错,顶我最爱的gentoo', '2009-12-17 00:28:54'),
(180, 63, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '那我可以把我wordpress上高亮插件停用了,吼吼\r\n支持!!', '2009-11-27 00:43:10'),
(181, 63, 'David Shieh', 'mykingheaven@gmail.com', '', '哈哈~没问题的啊!\r\n欢迎使用大卫粘贴', '2009-11-27 00:46:27'),
(182, 63, '东至', 'i@imdong.net', 'http://imdong.net', '恭喜,很实用的东西。就是网址有点难记啊。', '2009-11-27 16:17:21'),
(183, 63, 'David Shieh', 'mykingheaven@gmail.com', '', '我申请的域名应该狠好记啊,大卫粘贴 -> david-paste, 字字对应。。。', '2009-11-27 17:06:17'),
(184, 0, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '我就用过默认的输入法', '2009-11-27 13:38:01'),
(185, 0, 'David Shieh', 'mykingheaven@gmail.com', '', '你说的是scim吧', '2009-11-27 14:21:25'),
(186, 0, 'kukat', 'kukathe@gmail.com', '', '狗屁,我的ibus+chrome+wave必死,换firefox就行', '2009-11-30 14:47:23'),
(187, 0, 'David Shieh', 'mykingheaven@gmail.com', '', '事实证明, chrome跟wave水火不容, 但是ff又很慢, 让人很是为难.\r\n其实都换回fcitx了, iBus不好用...', '2009-11-30 17:14:33'),
(188, 0, 'Druggo', 'druggo@gmail.com', 'http://blog.druggo.net', '确实啊,fcitx在wave里双字输入都重复。。。不管它,反正wave没屁用。', '2009-12-08 13:16:40'),
(189, 0, '獨立的圓', 'iamxxb@gmail.com', 'http://www.imxxb.com/', '測試頭像', '2009-12-10 00:56:42'),
(190, 70, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '你啊,真够急的,我的代码又被我重新写了一下。。。我发现我有代码洁癖。。。', '2009-12-12 15:36:25'),
(191, 70, 'David Shieh', 'mykingheaven@gmail.com', '', '是骡子是马, 拉出来遛遛, 哈哈!', '2009-12-13 21:02:07'),
(192, 71, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '领先你个大头。。。', '2009-12-15 21:06:12'),
(193, 71, 'David Shieh', 'mykingheaven@gmail.com', '', '......\r\n你快点把博客部署上吧, 然后买个域名去!', '2009-12-15 21:08:14'),
(194, 72, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '沙发,哇哈哈~~', '2009-12-17 01:50:27'),
(195, 72, '老狼', 'mackjieson@gmail.com', 'http://www.laolang.cn', '我的连接没做。。。。', '2009-12-20 16:28:58'),
(196, 72, 'David Shieh', 'mykingheaven@gmail.com', '', '现在就加, sorry', '2009-12-20 21:46:21'),
(197, 73, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '明年我也要部署上去', '2009-12-24 10:34:46'),
(198, 73, 'David Shieh', 'mykingheaven@gmail.com', '', '明年...\r\n你说一月份吗...\r\n\r\n而且这是部署python程序的, 你部署ROR的话, 不需要flup, 其它的应该都一样了', '2009-12-24 10:57:40'),
(199, 73, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '那个fcgi为什么不用unix socket而用tcp的,似乎用unix socket要好点', '2009-12-25 14:50:14'),
(200, 73, 'David Shieh', 'mykingheaven@gmail.com', '', '没有试过socket的, 不知道好不好, 你可以试试, 然后告诉我结果.', '2009-12-25 16:55:27'),
(201, 74, 'bluker', 'bluker@126.com', 'http://你要的太多了', '顶', '2009-12-29 09:04:22'),
(202, 74, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '哈哈,你就懒吧你就', '2009-12-29 09:24:37'),
(203, 74, 'David Shieh', 'mykingheaven@gmail.com', '', '懒也比你的写的快, 等我把那个问题解决了, 就把blog切换过去.', '2009-12-29 09:36:56'),
(204, 74, 'happy九拍', 'zhuangmin@gmail.com', 'http://jiupai.net', '这本书出第四版啦。', '2009-12-29 16:34:34'),
(205, 74, 'David Shieh', 'mykingheaven@gmail.com', '', '我知道, 不过一般来说, 第三版就够了, 嘿嘿.\n第四版也没有中文版啊', '2009-12-29 16:40:34'),
(206, 75, 'kangzj', 'kangzjnet@gmail.com', 'http://kangzj.net', '深拷贝浅拷贝的区别', '2009-12-29 16:05:15'),
(207, 75, 'David Shieh', 'mykingheaven@gmail.com', '', '区别就是, 浅copy只考虑第一层的引用, 深copy是递归的考虑所有的引用', '2009-12-29 16:34:31'),
(208, 76, 'Ken', 'qichangxing@gmail.com', 'http://blog.hi0791.com', '哇,帅,还有验证码哦,呵呵', '2010-02-09 10:56:00'),
(209, 76, 'ABitNo', 'wolfplanet@gmail.com', 'http://abitno.linpie.com', '用html就会变了?', '2010-02-23 21:05:00'),
(210, 78, 'winterTTr', 'winterTTr@somemail.somecom', '', '我一般都是在~目录下find一下 :-)', '2010-02-24 08:49:00'),
(211, 78, '辥辥辥', 'im@xxb.me', 'http://www.xxb.me', '既然向標準靠近,趕緊用utf8吧!', '2010-02-24 14:00:00'),
(212, 78, 'davidx', 'mykingheaven@gmail.com', '', '这个确实是, 目前一直是gb, 让人有点小不爽', '2010-02-24 22:41:00'),
(213, 78, '辥辥辥', 'im@xxb.me', 'http://www.xxb.me', '如果能記下評論者信息就好了。我討厭重複輸入。', '2010-02-24 23:01:00'),
(214, 78, 'davidx', 'mykingheaven@gmail.com', 'http://davidx.me/', '偏不~不然你更懒了!', '2010-02-24 23:02:00'),
(215, 80, '柠檬园主', 'support@3rgb.com', 'http://3rgb.com', '你右边的category链接有问题,404了。', '2010-02-28 11:21:00'),
(216, 80, 'davidx', 'mykingheaven@gmail.com', 'http://davidx.me/', '谢谢提醒~', '2010-02-28 19:11:00'),
(217, 81, 'hicrokee', 'hicrokee@gmail.com', 'http://blog.hicrokee.com', '个人建议这种实用的翻译资料另外建个WIKI放上去 ', '2010-03-05 10:10:36'),
(218, 81, 'davidx', 'mykingheaven@gmail.com', 'http://davidx.me/', '以后会考虑的 目前还没有翻译好 先放在这里', '2010-03-05 11:58:27');
-- --------------------------------------------------------
--
-- 表的结构 `entries`
--
CREATE TABLE IF NOT EXISTS `entries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` longtext NOT NULL,
`categoryId` int(11) NOT NULL DEFAULT '1',
`createdTime` datetime NOT NULL,
`modifiedTime` datetime NOT NULL,
`viewNum` int(11) NOT NULL DEFAULT '0',
`commentNum` int(11) NOT NULL DEFAULT '0',
`slug` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=82 ;
--
-- 转存表中的数据 `entries`
--
INSERT INTO `entries` (`id`, `title`, `content`, `categoryId`, `createdTime`, `modifiedTime`, `viewNum`, `commentNum`, `slug`) VALUES
(1, '使用jQuery创建可拖拽排序列表', '项目中需要用到拖拽排序,于是去研究了jQuery的UI,发现它提供了一种非常简单的方式来实现可视化排序.\n首先是html代码:\n<pre lang="html">\n<ul id="test">\n <li>first</li>\n <li>second</li>\n <li>third</li>\n</ul>\n<input id="test-button" type="button">\n<input id="show" type="text">\n</pre>\n然后在script中导入jQuery,ui.core和ui.sortable3个包:\n<pre lang="html">\n<script type="text/javascript" src="jquery.js"></script>\n<script type="text/javascript" src="ui.core.js"></script>\n<script type="text/javascript" src="ui.sortable.js"></script>\n</pre>\n对应的javascript脚本为:\n<pre lang="javascript">\n$(document).ready(function(){\n $(''#test'').sortable({\n items:''li''\n });\n $(''#test-button'').click(function(){\n $(''#show'').attr(''value'',$(''#test'').sortable(''toArray''));\n });\n});\n</pre>\n对上述代码的解释:\n要排序的东西放在ul里,用sortable()来使列表可排序,items指出要排序的元素,使用sortable(''toArray'')来获得当前的排序结果.', 1, '2009-03-19 09:42:57', '2009-03-19 09:42:57', 15, 0, 'test'),
(2, '打造顺手的Vim环境', 'Vim超强的定制性为我们提供了很多便利,它众多的插件更是加速了我们的开发速度,下面就列出了笔者常用的几个插件:\r\n\r\n1.Nerd Tree -- 将目录和文件以树的形式显示在编辑器的左侧\r\n2.Taglist -- 快速定位程序的变量,函数和类,方便查找和修改\r\n3.Nerd Commenter -- 快速对代码进行注释,方便调试\r\n4.SnippetsEmu -- 提供TextMate般的快速代码片段录入\r\n<!--more-->\r\n下载地址为:\r\n1.<a href="http://www.vim.org/scripts/script.php?script_id=1658">NerdTree</a>\r\n2.<a href="http://www.vim.org/scripts/script.php?script_id=273">Taglist</a>\r\n3.<a href="http://www.vim.org/scripts/script.php?script_id=1218">Nerd Commenter</a>\r\n4.<a href="http://www.vim.org/scripts/script.php?script_id=1318">SnippetsEmu</a>\r\n\r\n安装方法非常的简单:\r\n1.前3个插件只要将下载下来的压缩包解压,然后将plugin目录里的文件放入~/.vim/plugin/目录,将doc目录的文件放入~/.vim/doc/目录即可,安装taglist的前提是系统必须安装有excuberant-ctags程序(Ubuntu和Debian用户可以从新立得里安装此程序,其它linux请搜索其安装方法).\r\n2.SnippetsEmu插件的安装稍微有点繁琐,方法为:将下载下来的压缩包解压,会得到2个.vba文件,分别用vim打开这2个文件,然后输入命令'':so %''进行安装即可.\r\n\r\n对插件的设置请参考上一篇日志:<a href="http://davidshieh.cn/index.php/2009/03/13/vim配置/">个人的vim配置</a>', 1, '2009-03-19 10:02:35', '2009-03-19 10:02:35', 0, 0, 'test'),
(3, 'PHP中的日期处理', '在PHP中处理日期非常的简单,尽管Mysql中有DateTime字段,但是使用起来还有没有PHP的time()函数方便.在数据库设计的时候,把存储时间的字段设置为int(11),存储数据的时候,该字段的数据为time()即可.time()函数的作用就是产生当前时间的时间戳,一般为一个11位的数字,例如1235035834.\r\n\r\n在我们要显示时间的时候,显示该时间戳自然不行,PHP里提供了date()函数来格式化该时间戳,比如我们使用date("Y-m-d H:i:s",1235035834)即可得到该时间戳的日期和时间,这里为"2009-02-19 17:30:34",非常的方便.date()函数接受2个参数,第一个为日期的格式,有很多参数来控制显示的格式,"Y"表示4位数的年,"m"表示2位数的月份,"d"表示2位数的天,"H"表示24小时制的小时,"i"表示分钟,"s"表示秒数,需要更多的格式,可以查阅官网的说明 : <a href="http://cn2.php.net/manual/en/function.date.php">Date函数</a>\r\n\r\n<span style="color: #ff0000;"><strong>还有一个函数strftime()也可以做日期的格式化,这2个函数的区别就是,部分的linux和所有的windows都不支持该函数,就是说,只有部分的linux可以使用该函数,所以,如果要写跨平台的PHP代码,还是要使用date()函数.</strong></span>', 3, '2009-03-19 10:16:50', '2010-02-08 16:56:04', 6, 0, 'dealing-with-datetime-in-php'),
(4, 'Apache基于端口的虚拟机的配置', '修改httpd.conf文件,加入以下代码:\r\n\r\n<pre lang="conf">\r\n#监听88端口\r\nListen 88\r\n#虚拟机的配置\r\n<virtualHost *:88>\r\n ServerAdmin webmaster@localhost\r\n DocumentRoot /home/icefox/phpmyadmin/ #该虚拟机的目录\r\n <directory /home/icefox/phpmyadmin/> #该目录的配置\r\n Options FollowSymLinks\r\n AllowOverride All #开启地址重写\r\n Order allow,deny #设置访问规则\r\n allow from all\r\n </directory>\r\n ErrorLog /var/log/apache2/error.log #设置改虚拟机的错误日志文件的存放地址\r\n</virtualHost>\r\n</pre>\r\n\r\n修改完一定要重启apache使新配置生效.', 7, '2009-03-19 10:24:52', '2010-02-08 16:55:15', 5, 0, 'apache-virtualhost'),
(5, '使用PIL按比例做缩略图', '项目中遇到头像的制作~这里使用的方法会不失比例的缩放图片~代码:\r\n<pre lang="python">\r\nim = Image.open(''ceshi.jpg'')\r\nsize = im.size\r\nif size[0] > size[1]:\r\n rate = float(120) / float(size[0])\r\nelse:\r\n rate = float(90) / float(size[1])\r\nnew_size = (int(size[0] * rate), int(size[1] * rate))\r\nnew = im.resize(new_size, Image.BILINEAR)\r\nnew.save(''new.jpg'')\r\n</pre>\r\n唯一值得注意的地方算比例的时候,一定记得加float,不然算出来的比例会是0,然后就是算生成的缩略图大小的时候,要用int,这样算出来的大小才会是整数.', 2, '2009-03-22 23:34:47', '2010-02-08 16:54:33', 6, 0, 'make-thumbnails-using-pil'),
(6, 'Yii拾遗(陆续添加中)', '<strong>1.View中的语法.</strong>\nYii在view里使用自己的语法,常用的是if语句和foreach语句,跟php的语法非常相似.if的语法为:\n<pre lang="PHP">\n<?php if ($foo): ?>\n <?php echo $foo; ?>\n<?php elseif ($bar): ?>\n <?php echo $bar; ?>\n<?php else: ?>\n <?php echo "nothing..."; ?>\n<?php endif; ?>\n</pre>\nforeach的语法为:\n<pre lang="PHP">\n<?php foreach ($ones as $key => $value): ?>\n <?php echo "key is ".$key " ---- ."value is ".$value; ?>\n<?php endforeach; ?>\n</pre>\n基本和php的语法相同,只是这里没有大括号,全部由'':''来代替,结束的时候使用end.\n\n<strong>2.Model的关系定义.</strong>\n在Model里,可以定义该Model和其它model的关系,比如说,belongs_to和has_many等.在Model加入relations()方法或者修改西安曾的relations()方法,下面给出一个例子:\n<pre lang="PHP">\n<?php\npublic function relations() {\n return array(\n ''topicCount'' => array(self::STAT, ''TClubTopic'', ''_club''),\n ''creator''=>array(self::BELONGS_TO, ''TUser'', ''_creator''),\n ''topics'' => array(self::HAS_MANY, ''TClubTopic'', ''_club''),\n );\n}\n?>\n</pre>\ntopicCount和creator定义的是返回对象的别名.\nself::STAT定义的是关联表的记录数,相当于一个count.self::BELONGS_TO定义的是1对1的关系,比如说,日志跟用户的关系,一个日志对应一个用户.self::HAS_MANY定义的是多对多的关系,一个用户可能有很多的日志,他跟日志的关系就是多对多了.\nTClubTopic和TUser是关联的Model名字,_club和_creator关联Model的外键.\n\n<strong>3.指定Model链接的表名.</strong>\n有时需要让Model指向的表名和Model的名字不一样,可以定义以下的一个方法:\n<pre lang="PHP">\npublic function tableName() {\n return ''foo_bar'';\n}\n</pre>', 1, '2009-03-25 17:12:08', '2009-03-25 17:12:08', 0, 2, 'test'),
(7, 'U盘安装ArchLinux-200902-x86_64', 'ArchLinux的200902版放出来有一段时间了,最近决定升级系统为64位的,并且可以尝试下EXT4的文件系统。由于没有刻录机,ArchLinux对硬盘安装的支持又不好~所以决定用U盘来安装。\n\n<strong>准备工作:</strong>\n下载archlinux-200902-core-x86_64.img,并在linux用dd将镜像写入U盘,命令为:\ndd if=/path/to/archlinux-200902-core-x86_64.img of=/dev/sdb\n一般U盘的位置为/dev/sdb,如果以上命令有错误的话,建议查看下U盘的位置并修改上面的命令。\n\n<strong>引导计算机:</strong>\n修改CMOS的设置,将USB-ZIP的启动放在硬盘的前面,并修改硬盘的启动顺序,将U盘放在本机硬盘的前面,然后重启计算机即可。\n<!--more-->\n<strong>安装Arch:</strong>\n由于机器本身已经有linux分区,所以不需要对硬盘进行分区,只需要选择挂载点即可,由于200902支持ext4,这里的分区类型当然要选择ext4了。设置结束后,进行包选择。本机使用的是无线上网,所以在base的基础上,还要选择相应的无线网卡模块和iwconfig包以确保无线的使用,本人使用的无线模块是rt71w。其它的设置和之前的arch没有什么区别了,locale的选择上,en只需要选择utf-8即可,中文需要选择gdk,utf-8和gb2312,GB10830没有特殊需求的话,就不用选择了。安装完成后重新启动计算机即可进入base system了。\n\n<strong>升级系统:</strong>\nArch的更新非常快 ,所以安装完系统以后需要进行一次升级。先使用pacman -Sy跟源进行同步,然后使用pacman -Suv进行升级。\n\n<strong>安装桌面系统:</strong>\n装桌面前,我们需要创建一个自己的用户。很多人喜欢开着root跑,但是我不推荐这样做,使用自己的帐户可以避免自己的误操作给系统带来麻烦。建立新用户并设置用户的密码,命令为:\nuseradd -m -s /bin/bash <em>username</em>\npasswd <em>username</em>\n上面的username为要设置的用户名。gnome桌面默认是不允许以root登录的,所以切记要在桌面装好前建立自己的用户。\n要装桌面首先要装xorg,这是所有桌面系统的基础,命令为:\npacman -S xorg hwd\n装好xorg后使用hwd -x生成xorg.conf配置文件,这个命令会生成xorg.conf.vesa文件,将这个文件改名为xorg.cong即可。\n接下来就是gnome的安装了,命令为:\npacman -S gnome gdm gnome-terminal\ngdm是gnome使用的登录器,gnome-terminal是gnome下的一个终端模拟器。\nxorg加上gnome,大概有270M,网速150K的话,大概需要将近1个小时的时间,我就打了一个小时的街霸,嘿嘿。\n安装完成后,使用pacman -S nvidia-173xx来安装显卡的驱动,本人所用的是nvidia 9600GSO的显卡,ATI显卡驱动的安装请查阅archlinux的wiki。装好驱动后,修改xorg.conf,将里面的Load "type1"去掉,然后将Driver里的vesa改成nvidia,保存退出即可。修改/etc/inittab文件,将boot to console里的3改成5,意思是系统启动后引导到Xorg,再将xdm的这一行注释掉,将gdm这一行的注释去掉,意思是使用gdm作为登录管理器。最后使用reboot重新启动计算机,就会看到熟悉的gnome登录界面了。', 1, '2009-03-27 22:21:10', '2009-03-27 22:21:10', 0, 3, 'test'),
(8, 'Archlinux系统配置和优化', 'Arch默认的配置非常简单,我们需要修改和优化它,以使它可以更好的供我们使用。\n下面的所有配置都是建立在gnome桌面系统上,所有的命令都是以root身份执行的,如果不想用root登录,可以在命令前加sudo。\n\n<strong>一、字体的优化</strong>\nArch自带的字体非常的难看,中文字体更是难看之极,所以我们需要安装一些好看的字体来美化我们的系统。使用下面的命令安装所有需要的字体:\npacman -S ttf-arphic-uming ttf-arphic-ukai wqy-zenhei wqy-bitmapfont ttf-dejavu ms-fonts\n安装完成后,需要修改/etc/fonts/conf.d/44-wqy-zenhei.conf以打开embeddedbitmap, 将里面name="embeddedbitmap"的值false改成true。\n<!--more-->\n<strong>二、桌面的美化</strong>\nArch自带的主题比较少~我们可以自行安装一些其它主题以我们的系统更加美观。使用下面的命令安装主题:\npacman -S gtk-engine-murrine gtk2-themes-collection gtk-aurora-engine gtk-candido-engine gtk-rezlooks-engine\n安装完成即可以在外观里选择喜欢的主题了。\n\n<strong>三、安装网络管理器</strong>\nArch本身并不带网络管理器,只是使用系统配置来登录网络,如果只用的是无线网络的话,每次都手动连接网络的话,非常的麻烦,这个时候,就需要安装网络管理器了。使用下面的命令来安装网络管理器:\npacman -S gnome-network-manager\n安装完成后,修改/etc/rc.conf文件,将里面的INTERFACES里装载的模块都点掉,只留下lo,改成以下的样子,INTERFACES=(lo !eth0 !ath0)。然后禁掉系统本身的network选项,并开启hal,dhcdbd和networkmanager3个进程,将DAEMONS里的东西改成以下这样:DAEMONS=( ... !network hal dhcdbd networkmanager networkmanager-dispatcher ... )。修改完成后,我们要继续修改/etc/pam.d/gdm文件,以确保netwokrmanager可以顺利修改机器的网络配置,确保这个文件里有以下2行:\nauth optional pam_gnome_keyring.so\nsession optional pam_gnome_keyring.so auto_start\n然后修改/etc/pam.d/passwd文件,加入这行:\npassword optional pam_gnome_keyring.so\n这一步做完后,将自己加入network这个用户组里,命令为gpasswd -a <em>USERNAME</em> network。完成后启动计算机即可。\n\n<strong>四、安装声卡</strong>\nArch的内核已经带有声卡的驱动,我们需要用以下的命令来安装声卡必须的库,命令为:\npacman -S alsa-lib alsa-utils alsa-oss\n安装完成后,需要修改/etc/modprobe.conf以确保最后读取snd_pcsp模块,在该文件里加入如下内容:\noptions snd-pcsp index=2\n完成后使用gpasswd -a <em>USERNAME</em> audio将自己加入audio用户组。重新启动计算机即可生效。\n\n<strong>五、配置HAL自动挂载</strong>\nLinux以前的挂载都是用mount命令,虽然非常的简单,但是如果经常要用别的分区的话,也是很麻烦的事情。所以我们需要配置HAL以实现自动挂载分区和移动硬盘。首先使用下面的命令以确保你没有漏安装包:\npacman -S hal dbus pmount ntfs-3g\n然后修改/etc/rc.conf文件,在DAEMONS里加入hal,例如DAEMONS=(syslog-ng hal network ...)。然后使用如下命令将自己加入到用户组里:\ngpasswd -a <em>USERNAME</em> optical\ngpasswd -a <em>USERNAME</em> storage\n接下来创建/etc/hal/fdi/policy/20-ntfs-config-write-policy.fdi文件,在里面写上如下的内容:\n<pre lang="XML">\n<?xml version="1.0" encoding="UTF-8"?>\n<deviceinfo version="0.2">\n <device>\n <match key="volume.fstype" string="ntfs">\n <match key="@block.storage_device:storage.hotpluggable" bool="true">\n <merge key="volume.fstype" type="string">ntfs-3g</merge>\n <merge key="volume.policy.mount_filesystem" type="string">ntfs-3g</merge>\n <append key="volume.mount.valid_options" type="strlist">locale=</append>\n </match>\n </match>\n </device>\n</deviceinfo>\n</pre>\n接着修改/etc/PolicyKit/PolicyKit.conf,以改变挂载的权限,在里面加入如下内容:\n<pre lang="XML">\n <match user="USERNAME"> <!-- replace with your login or delete the line if you want to allow all users to manipulate devices (keep security issues in mind though) -->\n <match action="org.freedesktop.hal.storage.*">\n <return result="yes"/>\n </match>\n <match action="hal-storage-mount-fixed-extra-options"> <!-- for internal devices mounted with extra options like a wished mount point -->\n <return result="yes" />\n </match>\n <match action="hal-storage-mount-removable-extra-options"> <!-- for external devices mounted with extra options like a wished mount point -->\n <return result="yes" />\n </match>\n </match> <!-- don''t forget to delete this line if you deleted the first one -->\n</pre>\n将里面的USERNAME改成你的用户名即可。重新启动X使配置失效。\n\n<strong>六、安装mplayer</strong>\nLinux上比较好用的播放器就是mplayer了,Arch自然可以很轻松的安装和使用mplayer了,使用下面的命令安装mplayer,支持的编码和插件:\npacman -S mplayer codecs mplayer-plugin\n\n<strong>七、安装必要的软件</strong>\nArch本身带的软件比较少,我们需要安装一些必要的软件以方便日常的使用,首先要安装的就是file-roller,这是对文件进行相应操作的工具,比如说,对文件进行压缩和解压缩,当然,使用它正确操作文件的话,需要安装相应的压缩和解压程序,安装命令为:\npacman -S file-roller unrar zip unzip', 1, '2009-03-27 22:48:21', '2009-03-27 22:48:21', 0, 2, 'test'),
(9, 'Arch使用Fcitx输入法', '之前一直使用的是SCIM的输入法,虽然有些别扭,但是也没有动过更换输入法的念头.最近受朋友鼓动,去尝试了下Fcitx,感觉还不错,附上安装和配置的过程.\n首先使用sudo pacman -S fcitx安装输入法,然后修改~/.bashrc文件,加入如下内容:\nexport GTK_IM_MODULE=xim\nexport QT_IM_MODULE=xim\nexport XMODIFIERS="@im=fcitx"\n保存后重新登录.\n这时我们就可以使用fcitx &来启动输入法,希望以后每次登录自动启动输入法,可以将这句命令加入到会话中.\n由于我们平常用的输入法都是使用,.来切换选词,所以我们可以修改~/.fcitx/conf/的文件来改变Fcitx切换选择的快捷键.', 1, '2009-03-30 20:04:14', '2009-03-30 20:04:14', 0, 0, 'test'),
(10, 'Arch配置Apache+Mysql+PHP', 'Arch上配置Apache+Mysql+PHP还是有些麻烦的,它跟其它的发行版有些许不同,下面我们就来一点一点的配置它们.\n\n<strong>安装Apache+Mysql+PHP</strong>\n使用命令pacman -S apache mysql php来安装3个软件.\n\n<strong>配置Apache:</strong>\nApache的主要配置文件是/etc/httpd/conf/httpd.conf,我们在里面要去掉一些不使用的模块,以使apache跑的更轻松,以下模块都是可以不用的:\nauthnz_ldap_module, ldap_module, unique_id_module, proxy_module, proxy_connect_module, proxy_ftp_module, proxy_http_module, proxy_ajp_module, proxy_balancer_module, ssl_module, dav_module, cgi_module, cgid_module, dav_fs_module\n修改DocumentRoot和<Directory "/var/http">, 将里面的路径改成你的web根目录, 再去掉关于ssl和cgi的配置信息,并将Include conf/extra/httpd-userdir.conf行注释掉.在文件的最末尾加入如下2行使Apache启动时加载PHP5:\nLoadModule php5_module modules/libphp5.so\nInclude conf/extra/php5_module.conf\n最后,将http这个用户加入你的组,命令为gpasswd -a http <em>USERNAME</em>\n启动apache的命令为sudo /etc/rc.d/httpd start.\n\n<!--more-->\n<strong>配置Mysql</strong>\nMysql的配置相对比较简单,使用sudo /etc/rc.d/mysqld start启动Mysql, 然后使用mysqladmin -u <strong>root</strong> -p password <em>root</em>来设置密码,注意,黑体的位置输入你要设置的用户名,斜体的是该用户名的密码,第一次使用这个命令会提示你输入root的密码,由于我们还没有密码,所以直接按回车即可.\n\n<strong>配置PHP</strong>\nPHP的配置比Apache要简单一些.第一步需要修改//etc/php/php.ini里面的open_basedir变量,确保里面有你的web根目录的路径.第二步修改加载的库,按照需要选择自己要用的库即可.\n\n上述的所有配置均是以开发为目的的配置,如果需要做服务器使用的话,请修改相应的配置,并增加安全配置.\n\nP.S.\n将httpd和mysqld加入rc.conf文件可以使apache和mysql随系统一起启动,例如:\nDAEMONS=(... httpd mysqld ...)', 1, '2009-03-30 20:53:29', '2009-03-30 20:53:29', 0, 0, 'test'),
(11, '使用PDO尝试自己写一个数据库类(放出0.1版)', '长久以来, 一直是使用框架的数据库类来操作数据库,很少自己来写这个东西.最近看到pdo,发现这个东西用来写数据库的类很合适,于是打算尝试下自己写一个数据库的类,不知道能写到什么程度,呵呵\n\n这个类要用完全面向对象的方法来操作数据,每一条记录就是一个对象,记录中的每一个字段,就是对象的一个属性.对象拥有保存,更改和删除的方法.\n\n如果能写出来,就叫0.1版本吧,呵呵.希望能够借此多多熟悉php的面向对象特性.\n\n代码还没有完全写完,先贴出来部分.\n<!--more-->\n<pre lang="PHP">\n<?php\n/**\n * =========================================\n * ======== ShiehDB ver 0.1 alpha =========\n * =========================================\n *\n * Created by David Shieh at 2009-04-15\n *\n * E-mail : mykingheaven@gmail.com\n * Gtalk : mykingheaven@gmail.com\n * QQ : 55832168\n *\n * 如果大家对本程序有任何的建议和修改意见,\n * 欢迎大家与我探讨,\n * 希望这个类可以使大家的数据库操作更加的方便\n *\n * 此类既可以直接使用,也可以继承使用\n *\n */\nclass ShiehDB {\n\n //要操作的表名\n public $_tableName = null;\n\n //最终执行的sql语句\n private $_sql = '''';\n\n /**\n * 构造函数,连接数据库\n * @param string $host\n * @param string $dbname\n * @param string $username\n * @param string $password\n */\n public function __construct($host, $dbname, $username, $password) {\n try {\n $this->_db = new PDO(''mysql:dbname=''.$dbname.'';host=''.$host, $username, $password);\n } catch (PDOException $e) {\n die($e->getMessage());\n }\n }\n\n /**\n * 查询数据\n * @return array\n */\n public function find() {\n if (!$this->_tableName)\n return $this->errorCode(''201'');\n $this->_sql = ''SELECT '';\n\n //要获取的字段\n if (isset($this->fields))\n $this->getFields();\n else\n $this->_sql = $this->_sql.''* '';\n\n //生成sql语句\n $this->_sql = $this->_sql.''FROM ''.$this->_tableName;\n\n //查询的条件\n if (isset($this->conditions))\n $this->getConditions();\n\n //返回sql语句ѯ\n return $this->_sql;\n }\n\n /**\n * 更新数据\n * @return\n */\n public function save() {\n //判断有无ID,有则做update操作,无则做insert操作\n if (isset($this->id)) {\n echo ''1'';\n } else {\n $this->_sql = ''INSERT INTO ''.$this->_tableName." ";\n\n $array = get_object_vars($this);\n $keys = array();\n $values = array();\n foreach ($array as $key => $value) {\n if ($key[0] !== ''_'') {\n $keys[] = ''`''.$key.''`'';\n $values[] = $value;\n }\n }\n\n $keys = implode('','', $keys);\n $values = implode('','', $values);\n\n $this->_sql = $this->_sql."(".$keys.'') VALUES (''.$values.'')'';\n return $this->_sql;\n }\n }\n\n /**\n * 执行自定义sql语句\n * @return array\n * @param string $sql\n */\n public function query($sql) {\n if (!empty($sql)) {\n $stmt = $this->_db->prepare($sql);\n $stmt->execute();\n $num = $stmt->columnCount();\n $result = array();\n for ($i = 1;$i < $num;$i++) {\n $result[] = $stmt->fetchObject();\n }\n return $result;\n }\n }\n\n /**\n * 查询错误信息代码\n * @return\n * @param string $code\n */\n private function errorCode($code) {\n $codes = array(\n ''201'' => ''No table used.''\n );\n return $codes[$code];\n }\n\n /**\n * 处理查询的条件\n * @return\n */\n private function getConditions() {\n if (isset($this->conditions)) {\n $result = '''';\n $keys = array_keys($this->conditions);\n $num = count($keys);\n\n for ($i = 0;$i < $num;$i++) {\n if ($i !== ($num -1) ) {\n $result = $result."`".$keys[$i]."` = ".$this->conditions[$keys[$i]]." AND ";\n }\n else $result = $result."`".$keys[$i]."` = ".$this->conditions[$keys[$i]];\n }\n\n $this->_sql = $this->_sql." WHERE ".$result;\n unset($this->conditions);\n }\n\n }\n\n /**\n * 处理读取的字段\n * @return\n */\n private function getFields() {\n if (isset($this->fields)) {\n $temp = implode('','', $this->fields);\n $this->_sql = $this->_sql.$temp." ";\n unset($this->fields);\n }\n }\n\n /**\n * 处理排序\n * @return\n */\n private function getOrders() {\n\n }\n}\n?>\n</pre>\n\n使用方法:\n1.直接使用该类:\n<pre lang="PHP">\n<?php\ninclude(''shiehdb.php'');\n$db = new ShiehDB(''localhost'', ''test'', ''root'', ''root'');\n$db->_tableName = ''tableName'';\n$db->conditions = array(''username'' => ''user'');\n$user = $db->find();\n?>\n</pre>\n\n2.继承该类:\n<pre lang="PHP">\n<?php\ninclude(''shiehdb.php'');\nclass User extends ShiehDB {\n public function __construct() {\n parent::__construct(''localhost'', ''test'', ''root'', ''root'');\n $this->_tableName = ''user'';\n }\n}\n\n$user = new User();\n$user->conditions = array(''id'' => 1);\necho $user->find();\n?>\n</pre>', 1, '2009-03-31 15:42:16', '2009-03-31 15:42:16', 0, 0, 'test'),
(12, 'Linux下的取色器', '最近需要做HTML~需要一个取色器~一直以来Linux底下都没有什么好的取色器软件~\n偶然间发现Gcolor2~还不错~是个Gnome下的取色软件~试用过后~觉得很是好用~再也不需要Gimp取色了~\n安装命令为:\npacman -S gcolor2', 1, '2009-04-03 00:10:46', '2009-04-03 00:10:46', 0, 3, 'test'),
(13, 'Yii请求处理流程分析', '近日对Yii的请求处理有些疑惑~所以便开始了对Yii的源码的研究.\n[caption id="attachment_100" align="alignnone" width="420" caption="Yii请求处理流程图"]<img src="http://davidshieh.cn/wp-content/uploads/2009/04/flow.png" alt="Yii请求处理流程图" title="flow" width="420" height="520" class="size-full wp-image-100" />[/caption]\n这是官方的一副流程图.\n打开源码~开始了请求的追踪.\n<!--more-->\n当一次请求被处理的时候~程序先调用了project/index.php文件,里面有如下几行代码:\n<pre lang="PHP">\n// change the following paths if necessary\n$yii=dirname(__FILE__).''/../yii/framework/yii.php'';\n$config=dirname(__FILE__).''/protected/config/main.php'';\n\n// remove the following line when in production mode\ndefined(''YII_DEBUG'') or define(''YII_DEBUG'',true);\n\nrequire_once($yii);\nYii::createWebApplication($config)->run();\n</pre>\n这段代码首先讲yii.php文件和main.php文件放入2个变量中,然后设置了YII_DEBUG变量为true,接着require_once了yii.php文件,并调用了run()方法.\n\nyii.php文件有如下代码:\n<pre lang="PHP">\nrequire(dirname(__FILE__).''/YiiBase.php'');\nclass Yii extends YiiBase\n{\n}\n</pre>\n这段代码导入了yiibase.php,并定义了类Yii,该类继承YiiBase.\n\nmain.php里面是各种配置的信息,将配置信息作为数组返回.\nYii继承YiiBase,于是又找到YiiBase.php文件,发现这个文件开始的时候定义了如下几个变量:YII_BEGIN_TIME,YII_DEBUG,YII_ENABLE_EXCEPTION_HANDLER,YII_ENABLE_ERROR_HANDLER和YII_BATH.\n找到createWebApplication方法,里面就一条语句:\n<pre lang="PHP">\nreturn new CWebApplication($config);\n</pre>\n于是又找到yii/framework/web/CWebApplication.php文件,但是却没有在里面找到构造函数,由于该类继承CApplication,又找到yii/framework/base/CApplication.php,这个类里有构造函数,内容如下:\n<pre lang="PHP">\npublic function __construct($config=null)\n{\n Yii::setApplication($this);\n\n // set basePath at early as possible to avoid trouble\n if(is_string($config))\n $config=require($config);\n if(isset($config[''basePath'']))\n {\n $this->setBasePath($config[''basePath'']);\n unset($config[''basePath'']);\n }\n else\n $this->setBasePath(''protected'');\n Yii::setPathOfAlias(''application'',$this->getBasePath());\n Yii::setPathOfAlias(''webroot'',dirname($_SERVER[''SCRIPT_FILENAME'']));\n\n $this->preinit();\n\n $this->initSystemHandlers();\n $this->registerCoreComponents();\n\n $this->configure($config);\n $this->attachBehaviors($this->behaviors);\n $this->preloadComponents();\n\n $this->init();\n}\n</pre>\n第一句Yii::setApplication($app);调用YiiBase里的setApplication()方法,该方法内容如下:\n<pre lang="PHP">\npublic static function setApplication($app)\n{\n if(self::$_app===null || $app===null)\n self::$_app=$app;\n else\n throw new CException(Yii::t(''yii'',''Yii application can only be created once.''));\n}\n</pre>\n这个方法的目的是实例化一个app对象.\n第6行到第14行设定了config和basePath.第15句和第16句设定了2个路径的快捷方式, webroot和application.\n第18行调用了preinit()方法,该方法在该类中没有,是该类的父类CModule里的,但是找到yii/framework/base/CModule.php后,发现该方法内容为空.\n第20行调用了initSystemHandlers,该方法位于该类中,内容如下:\n<pre lang="PHP">\nprotected function initSystemHandlers()\n{\n if(YII_ENABLE_EXCEPTION_HANDLER)\n set_exception_handler(array($this,''handleException''));\n if(YII_ENABLE_ERROR_HANDLER)\n set_error_handler(array($this,''handleError''),error_reporting());\n}\n</pre>\n第21行调用了registerCoreComponents方法,该方法内容如下:\n<pre lang="PHP">\nprotected function registerCoreComponents()\n{\n $components=array(\n ''coreMessages''=>array(\n ''class''=>''CPhpMessageSource'',\n ''language''=>''en_us'',\n ''basePath''=>YII_PATH.DIRECTORY_SEPARATOR.''messages'',\n ),\n ''db''=>array(\n ''class''=>''CDbConnection'',\n ),\n ''messages''=>array(\n ''class''=>''CPhpMessageSource'',\n ),\n ''errorHandler''=>array(\n ''class''=>''CErrorHandler'',\n ),\n ''securityManager''=>array(\n ''class''=>''CSecurityManager'',\n ),\n ''statePersister''=>array(\n ''class''=>''CStatePersister'',\n ),\n );\n\n $this->setComponents($components);\n}\n</pre>\n第23行调用了configure方法,该方法在父类CModule里,内容如下:\n<pre lang="PHP">\npublic function configure($config)\n{\n if(is_array($config))\n {\n foreach($config as $key=>$value)\n $this->$key=$value;\n }\n}\n</pre>\n第24行调用了attachBehaviors方法,该方法位于父类CModule的父类CComponent类中,内容如下:\n<pre lang="PHP">\npublic function attachBehaviors($behaviors)\n{\n foreach($behaviors as $name=>$behavior)\n $this->attachBehavior($name,$behavior);\n}\n</pre>\n第25行调用了preloadComponents方法,该方法同样位于父类CModule里,内容如下:\n<pre lang="PHP">\nprotected function preloadComponents()\n{\n foreach($this->preload as $id)\n $this->getComponent($id);\n}\n</pre>\n第27行调用了init方法,该方法位于父类CModule方法中,内容为空.\n至此Yii::createWebApplication($config)方法已经分析完成~剩下的就是run()方法了.', 1, '2009-04-20 00:04:48', '2009-04-20 00:04:48', 0, 0, 'test'),
(14, '使用Yii开发简单新闻系统之一--建立项目', '前端时间一直想一个适合新手入门的Yii实例, 一直没有完成, 这个周末有些时间, 把这个教程完成.\n\n首先我们来分析下项目需求:\n这个新闻系统, 所有用户可以查新新闻, 但只有注册用户才可以评论新闻.用户可以随便注册成为注册用户.\n建表的sql语句如下:\n<pre lang="SQL">\nSET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";\n\n--\n-- 数据库: `shiehnews`\n--\n\n-- --------------------------------------------------------\n\n--\n-- 表的结构 `articles`\n--\n\nCREATE TABLE IF NOT EXISTS `articles` (\n `id` int(11) NOT NULL auto_increment,\n `userId` int(11) NOT NULL,\n `categoryId` int(11) NOT NULL,\n `title` varchar(255) NOT NULL,\n `createdTime` int(11) NOT NULL,\n `modifiedTime` int(11) NOT NULL,\n `content` text NOT NULL,\n `viewNum` int(11) NOT NULL default ''0'',\n `commentNum` int(11) NOT NULL default ''0'',\n PRIMARY KEY (`id`),\n KEY `fk_articles_users` (`userId`),\n KEY `fk_articles_categories` (`categoryId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;\n\n-- --------------------------------------------------------\n\n--\n-- 表的结构 `categories`\n--\n\nCREATE TABLE IF NOT EXISTS `categories` (\n `id` int(11) NOT NULL auto_increment,\n `name` varchar(255) NOT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;\n\n-- --------------------------------------------------------\n\n--\n-- 表的结构 `comments`\n--\n\nCREATE TABLE IF NOT EXISTS `comments` (\n `id` int(11) NOT NULL auto_increment,\n `userId` int(11) NOT NULL,\n `articleId` int(11) NOT NULL,\n `comment` text NOT NULL,\n `createdTime` int(11) NOT NULL,\n `modifiedTime` int(11) NOT NULL,\n PRIMARY KEY (`id`),\n KEY `fk_comments_articles` (`articleId`),\n KEY `fk_comments_users` (`userId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;\n\n-- --------------------------------------------------------\n\n--\n-- 表的结构 `users`\n--\n\nCREATE TABLE IF NOT EXISTS `users` (\n `id` int(11) NOT NULL auto_increment,\n `username` varchar(45) NOT NULL,\n `password` varchar(45) NOT NULL,\n `articleNum` int(11) NOT NULL default ''0'',\n `commentNum` int(11) NOT NULL default ''0'',\n `email` varchar(50) NOT NULL,\n `nickname` varchar(50) default NULL,\n `createdTime` int(11) NOT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;\n</pre>\n\n下载Yii框架, 我使用的是SVN版的, 大家可以下载1.0.7的.将Yii框架放到D:yii下,在D盘根目录下执行\nyiiframeworkyiic.bat webapp shiehnews-yii\n建立项目, 然后进入项目, 修改protectedconfigmain.php, 修改里面name值,改成ShiehNews, 接着修改db值\n将db值修改为:\n<pre lang="PHP">\n''db'' => array(\n ''class'' => ''CDbConnection'',\n ''connectionString'' => ''mysql:host=localhost;dbname=shiehnews'',\n ''username'' => ''root'',\n ''password'' => ''root'',\n ''charset'' => ''utf8'',\n),\n</pre>\ndbname改成数据库的名称,username和password改成自己数据库的用户名和密码.保存即可.\n回到命令行, 进入shiehnews-yii目录, 执行\nprotectedyiic.bat shell\n运行代码生成器, 使用model <ModelName>来建立4个model, 对应我们建的4张表, 这里给4个model启的名字分别为Article, Category, Comment, User, 建好后, 使用crud Article和crud User来建立脚手架. 完成后, 输入exit退出.\n\n至此, 我们已经建立了需要的数据库, 也创建了项目目录, 同时也有了4个model和2个controller, 下一节开始, 我们一起来增加注册, 登录和注销的功能.', 1, '2009-04-21 16:09:30', '2009-04-21 16:09:30', 0, 7, 'test'),
(15, '使用Yii开发简单文章系统之二--用户操作', '上一节我们使用Yii的工具创建了项目, 并创建了我们会用到的model代码和controller代码, 从本节开始, 我们将不断的接触MVC, 不断的完善我们的系统.\n\n打开protectedmodelsUser.php文件, 修改我们的User Model.\n首先修改Model指向的表名, 将tableName()里面return的内容改成users, 如下:\n<pre lang="PHP">\npublic function tableName() {\n return ''users'';\n}\n</pre>\n<!--more-->\n\n用户注册的时候, 我们需要用户来输入他喜欢的密码, 需要一个密码确认的字段, 为了防止机器人程序恶意注册, 我们还需要一个验证码字段, 所以要在User这个类里加入2个属性: passwordConfirm和verifyCode, 代码如下:\n<pre lang="PHP">\n public $passwordConfirm;\n public $verifyCode;\n</pre>\n\n下面我们来添加User的字段验证规则.根据我们的需求, username, password, passwordConfirm, email和verifyCode都是必填项, 所以需要添加如下的规则:\narray(''username, password, passwordConfirm, email, verifyCode'', ''required'')\n另外, 我们希望用户名和nickname唯一, 就需要添加以下的规则:\narray(''username'', ''unique''),\narray(''nickname'', ''unique'')\n注册的时候, 用户需要输入两遍密码以确保没有把密码输错, 这里就需要passwordConfirm字段的值等于password了, 可以使用以下的规则:\narray(''passwordConfirm'', ''compare'', ''compareAttribute'' => ''password'')\n这个规则的意思是, passwordConfirm的值必须与password相同.\n这样, 我们完成好的验证规则就应该像下面的代码:\n<pre lang="PHP">\n public function rules() {\n return array(\n array(''username, password, passwordConfirm, email, verifyCode'', ''required''),\n array(''username'', ''unique''),\n array(''username'', ''length'', ''min'' => 5, ''max'' => 12),\n array(''password'', ''length'', ''min'' => 5, ''max'' => 12),\n array(''nickname'', ''length'', ''min'' => 4, ''max'' => 20),\n array(''nickname'', ''unique''),\n array(''verifyCode'', ''captcha''),\n array(''passwordConfirm'', ''compare'', ''compareAttribute'' => ''password''),\n );\n }\n</pre>\n\nYii的model里有个特殊的地方就是, 它可以保护字段的安全性, 所有放在safeAttributes()方法里的字段被认为是可以访问和修改的, 不在里面的字段则是需要保护的, 所以我们需要将我们刚才的字段都放进这个方法里, 如下:\n<pre lang="PHP">\n public function attributeLabels() {\n return array(\n ''username'' => ''用户名'',\n ''password'' => ''密码'',\n ''passwordConfirm'' => ''密码确认'',\n ''email'' => ''邮件地址'',\n ''nickname'' => ''昵称'',\n ''verifyCode'' => ''验证码''\n );\n }\n</pre>\n\n好了, 现在我们已经有了一个完善的字段验证规则, 又确保了我们的字段是可以访问的, 现在该修改controller文件了. 打开protected/controllers/UserController.php文件, 创建一个新的方法register, 根据yii的规则, 所有允许用户访问的的action方法必须以action开头, 所以我们创建的方法名字应该是actionRegister()了.\n\n书写该方法的方法体, 首先我们需要创建一个form, 这个form是一个Model的实例, 因为我们的目的是注册一个用户, 所以这个form需要是User的实例, 用以下代码:\n$form = new User;\n这个form建好后, 没有任何属性, 但是已经可以使用了, 我们需要将它传到view里去显示它, 以便让用户填写自己的信息, 使用代码:\n$this->render(''register'', array(''form'' => $form));\n将$form传到register试图并命名为form.\n\n在protected/views/user目录下创建register.php文件, 内容如下:\n<pre lang="PHP">\n<h2>新用户注册</h2>\n\n<?php echo CHtml::beginForm(); ?>\n\n<?php echo CHtml::errorSummary($form); ?>\n\n<p>\n <?php echo CHtml::activeLabelEx($form, ''username''); ?>\n <?php echo CHtml::activeTextField($form, ''username'', array(''size'' => 20, ''maxlength'' => 12)); ?>\n</p>\n<p>\n <?php echo CHtml::activeLabelEx($form, ''password''); ?>\n <?php echo CHtml::activePasswordField($form, ''password'', array(''size'' => 20, ''maxlength'' => 12)); ?>\n</p>\n<p>\n <?php echo CHtml::activeLabelEx($form, ''passwordConfirm''); ?>\n <?php echo CHtml::activePasswordField($form, ''passwordConfirm'', array(''size'' => 20, ''maxlength'' => 12)); ?>\n</p>\n<p>\n <?php echo CHtml::activeLabelEx($form, ''email''); ?>\n <?php echo CHtml::activeTextField($form, ''email'', array(''size'' => 20)); ?>\n</p>\n<p>\n <?php echo CHtml::activeLabelEx($form, ''nickname''); ?>\n <?php echo CHtml::activeTextField($form, ''nickname'', array(''size'' => 20, ''maxlength'' => 12)); ?>\n</p>\n\n<p>\n <label> </label>\n <?php $this->widget(''CCaptcha''); ?>\n</p>\n\n<p>\n <?php echo CHtml::activeLabelEx($form, ''verifyCode''); ?>\n <?php echo CHtml::activeTextField($form, ''verifyCode''); ?>\n</p>\n\n<p>\n <label> </label>\n <?php echo CHtml::submitButton(''注册''); ?>\n</p>\n\n<?php echo CHtml::endForm(); ?>\n</pre>\n里面调用了Yii提供的方法来创建我们需要的HTML标签, 有一个需要注意的地方就是里面使用$this->widget(''CCaptcha'');\n来显示一个验证码, 用它的时候, 我们需要在controller里声明它, 声明的方法如下:\n<pre lang="PHP">\n public function actions() {\n return array(\n ''captcha''=>array(\n ''class'' => ''CCaptchaAction'',\n ''backColor'' => 0xCCCCCC,\n ''testLimit'' => 1,\n ),\n );\n }\n</pre>\n这样,我们就可以在view里使用验证码了, 怎么样, 赶紧去试试吧, 访问url:\nhttp://localhost/index.php?r=user/register\n怎么?显示你没有权限访问该action, 嘿嘿, 这就对了, 在Yii的世界里, 任何一个action在被访问的时候, 都会检查它的权限的, 我们只需要到controller里找到accessRules()方法, 在''user'' => array(''*'')的这个array里, 将我们的action加进入, 就可以顺利访问了, 比如说:\n<pre lang="PHP">\n array(''allow'', // allow all users to perform ''list'' and ''show'' actions\n ''actions'' => array(''register'', ''login'', ''logout'', ''captcha''),\n ''users'' => array(''*''),\n ),\n</pre>\n注意, 要在view里显示captcha, 也必须把captcha action加进去.\n回到浏览器重新刷新一下, 怎么样, 我们的表单出来了吧.', 1, '2009-04-21 16:24:53', '2009-04-21 16:24:53', 0, 12, 'test'),
(16, 'ShiehNews 源码下载', '最近正在找工作~有些许忙碌~前面写的教程一直没有及时更新~这里放出ShiehNews的源码~感兴趣的朋友可以下来研究~我找到工作后~会把教程补齐的~\n<a href="http://davidshieh.cn/wp-content/uploads/2009/04/shiehnews-yii.rar">点击下载源码</a>', 1, '2009-04-24 00:21:56', '2009-04-24 00:21:56', 0, 1, 'test'),
(17, '优秀的数据库设计软件--MySQL Workbench', '之前一直在寻找一款优秀的数据库设计软件,尝试了很多,都没有太中意的~\r\n不经意间发现了MySQL Workbench, 由于是MySQL官方出的数据库软件,所以没有理由不试用一下.\r\n\r\n软件不大, 大概有11M的样子, 安装时提示需要.Net Framework 2.0, 这是唯一让我不爽的地方. 为了使用它, 只好委屈下自己了.\r\n<!--more-->\r\n运行后, 发现界面非常的清爽, 如图:\r\n[caption id="attachment_120" align="aligncenter" width="300" caption="MySQL Workbench 界面"]<img src="http://davidshieh.cn/wp-content/uploads/2009/04/mysql-workbench-300x224.png" alt="MySQL Workbench 界面" title="mysql-workbench" width="300" height="224" class="size-medium wp-image-120" />[/caption]\r\n\r\n双击上面的"Add Diagram"创建模型图表, 在图表试图里, 左边有一系列的按钮, 上数第7个按钮是创建Table的按钮, 使用它来创建我们需要的表格, 具体过程不描述了, very easy的.\r\n下面还有几个按钮是创建关联的. 如果要关联的字段已经写在表里了, 直接在表的信息栏里可以找到Foreign Keys这个标签.\r\n\r\n下面是我为ShiehNews创建的关系图:\r\n[caption id="attachment_121" align="aligncenter" width="300" caption="ShiehNews 关系图"]<img src="http://davidshieh.cn/wp-content/uploads/2009/04/shiehnews-eer-300x213.png" alt="ShiehNews 关系图" title="shiehnews-eer" width="300" height="213" class="size-medium wp-image-121" />[/caption]\r\n\r\nMySQL Workbench同样支持将关系图转成sql文件, 点击File, 选择Export->Forward Engineer SQL create script...即可.', 1, '2009-04-24 00:38:50', '2009-04-24 00:38:50', 0, 4, 'test'),
(18, '使用Yii优秀的CWebLogRoute组件', '用yiic生成的代码, 已经自带了log系统, 但是这个log是基于文件, 我们想查看一个页面都执行哪个sql语句的时候, 就需要加入另外一个log组件了.\n\n修改main.php, 将下面的代码加入routes里, 完成后的代码如下:\n<pre lang="PHP">\n''routes''=>array(\n array(\n ''class'' => ''CWebLogRoute'',\n ''levels'' => ''trace,info,error,warning'',\n ''categories'' => ''system.db.*'',\n ),\n array(\n ''class''=>''CFileLogRoute'',\n ''levels''=>''error, warning, watch'',\n ''categories'' => ''system.*''\n ),\n),\n</pre>\n\n如果不需要计入文件的话, 可以将CFileLogRoute这段去掉, 不过作为产品发布的话, 记录log文件倒是必须的.', 1, '2009-04-26 00:37:21', '2009-04-26 00:37:21', 0, 0, 'test'),
(19, 'ShiehNews 0.2版发布', '最近对ShiehNews进行了一些更改, 发布第二个版本, 就暂时叫为0.2版吧.\n\n数据库建表命令在压缩包里的sql文件里.\n\n欢迎大家提意见!~\n\n<a href="http://davidshieh.cn/wp-content/uploads/2009/05/shiehnews-yii-02-beta.rar">ShiehNews-yii-02-beta</a>\n\nP.S.感谢"Email是真的"仁兄的提醒~发现了我CategoryController的一个小问题\n自己太粗心了~弄出来个语法错误~\n\n修改CategoryController里的update Action, 代码如下:\n<pre lang="PHP">\n public function actionUpdate() {\n $category=$this->loadCategory();\n if(isset($_POST[''Category'']))\n {\n $category->attributes=$_POST[''Category''];\n if($category->save())\n $this->redirect(array(''show'',''id''=>$category->id));\n }\n $this->render(''update'',array(''category''=>$category));\n }\n</pre>', 1, '2009-05-04 00:52:25', '2009-05-04 00:52:25', 0, 2, 'test'),
(20, '使用Email地址作为登录名', '有些时候,我们可能会要求使用Email地址作为登录名, 而Yii默认的登录名是用户名, 其实只需要改变几个地方, 就可以把我们的登录和验证系统改成Email登录的.\n<!--more-->\n首先要修改LoginForm, 将username改成email, 其实也就需要改几个小地方, 如下:\n<pre lang="PHP">\n<?php\nclass LoginForm extends CFormModel {\n\n public $email;\n public $password;\n public $rememberMe;\n\n public function rules() {\n return array(\n array(''email, password'', ''required''),\n array(''email'', ''email''),\n array(''password'', ''authenticate''),\n );\n }\n\n public function attributeLabels() {\n return array(\n ''email'' => ''邮件地址'',\n ''password'' => ''密码'',\n ''rememberMe'' => ''记住我'',\n );\n }\n\n public function authenticate($attribute,$params) {\n if(!$this->hasErrors()) {\n $identity = new UserIdentity($this->email, $this->password);\n $identity->authenticate();\n switch($identity->errorCode) {\n case UserIdentity::ERROR_NONE:\n $duration = $this->rememberMe ? 3600*24*30 : 0;\n Yii::app()->user->login($identity, $duration);\n break;\n case UserIdentity::ERROR_USERNAME_INVALID:\n $this->addError(''email'',''邮件地址错误.'');\n break;\n default:\n $this->addError(''password'',''密码不正确.'');\n break;\n }\n }\n }\n}\n</pre>\n修改view层的login.php比较简单, 这里就不贴出来了.\n\n最后修改components/UserIdentity.php, 代码如下:\n<pre lang="PHP">\n<?php\nclass UserIdentity extends CUserIdentity {\n public function authenticate() {\n\n $user = User::model()->findByAttributes(array(''email'' => $this->username));\n\n if ($user === null)\n $this->errorCode = self::ERROR_USERNAME_INVALID;\n else if ($user->password !== md5($this->password))\n $this->errorCode = self::ERROR_PASSWORD_INVALID;\n else {\n $this->errorCode = self::ERROR_NONE;\n $this->setState(''id'', $user->id);\n }\n return !$this->errorCode;\n }\n}\n</pre>\n这里有一个地方必须要注意, 就是\n$user = User::model()->findByAttributes(array(''email'' => $this->username));\n查找的时候, 必须把$this->username的值给email, 究其原因, 就要从UserIdentity继承的CUserIdentity说起了.\n\n打开CUserIdentity文件, 可以看到下面的代码:\n<pre lang="PHP">\nclass CUserIdentity extends CBaseUserIdentity\n{\n /**\n * @var string username\n */\n public $username;\n /**\n * @var string password\n */\n public $password;\n\n /**\n * Constructor.\n * @param string username\n * @param string password\n */\n public function __construct($username,$password)\n {\n $this->username=$username;\n $this->password=$password;\n }\n...\n</pre>\n可以看到, 这里定义了2个属性, $username和$password, 当调用构造函数的时候, 自动把参数赋给了$username和$password, 在LoginForm里使用\n$identity = new UserIdentity($this->email, $this->password);\n的时候, 其实是把$this->email的值赋给了$username, 所以在上面的UserIdentity里查询user的时候, 必须用\narray(''email'' => $this->username)\n\n至此, 我们已经把网站的登录名改成了Email, 非常的方便!', 1, '2009-05-06 00:48:15', '2009-05-06 00:48:15', 0, 2, 'test'),
(21, 'ShiehNews 0.3 beta版放出', '最近工作上的事情比较多~耽搁了ShiehNews的制作进度~\n\n这次放出的版本修改了上一版中的错误, 并且做了良好的SEO优化, 同时增加ajax评论文章的功能.\n\n里面自带了SQL文件, 创建管理员的方法为, 注册一个用户名为admin的用户.\n\n<a href="http://davidshieh.cn/wp-content/uploads/2009/05/shiehnews-yii-03-beta.rar">点击下载</a>', 1, '2009-05-13 22:43:35', '2009-05-13 22:43:35', 0, 2, 'test');
INSERT INTO `entries` (`id`, `title`, `content`, `categoryId`, `createdTime`, `modifiedTime`, `viewNum`, `commentNum`, `slug`) VALUES
(22, 'Windows下安装PyGTK', 'Linux下使用非常广泛的桌面系统就是Gnome了, 它的内核就是GTK, 开发Gnome下的程序的时候, 一般使用C或者C++来调用GTK.\n不过Pythoner不用失望, 因为Python有PtGTK可以用. 同时, 它也能够很好的应用在windows下.\n在Linux安装PyGTK是件非常轻松的事情, 下面我们就来在windows上开发它的开发环境, 做一个真正的跨平台的桌面程序.\n<!--more-->\n首先去<a href="http://pygtk.org/downloads.html">www.pygtk.org</a>下载必要的包, 有\n<ul>\n <li>PyCairo</li>\n <li>PyGObject</li>\n <li>PyGTK</li>\n <li>GTK+ runtime</li>\n</ul>\n安装顺序为:GTK+ runtime, PyCairo, PyGObject, PyGTK, 4个包都有windows binary, 安装起来非常容易, 安装完成后, 使用下面的代码来测试安装是否成功.\n\n<pre lang="python">\nimport gtk\nwindow = gtk.Window()\nwindow.set_title("Hello World")\nwindow.show_all()\n\ngtk.main()\n</pre>', 1, '2009-05-16 00:37:13', '2009-05-16 00:37:13', 0, 0, 'test'),
(23, 'ShiehNews 0.3 beta bug修复版放出', '之前放出的0.3版还存在一些bug, 自己竟然不知道~真是太粗心了~\n\n感谢群里的 白云山 同学和kukat同学的指正, 才意识到bug, 这里放出修复版.\n\n<a href="http://davidshieh.cn/wp-content/uploads/2009/05/shiehnews-yii-03-beta-bug-fixed.rar">ShiehNews 0.3 beta bug修复版</a>\n\n另:新版本展望:\n0.4 添加fckeditor或者其它的可视编辑器\n0.5 打算添加wiki功能', 1, '2009-05-17 01:38:04', '2009-05-17 01:38:04', 0, 2, 'test'),
(24, 'PyGTK学习笔记(一)', '终于把工作环境换回了Arch, 这次的Arch不知道怎么了, 应该是Xorg更新的问题吧, 让我的键盘和鼠标失效了, 折腾了很长的时间, 还是老外帮忙解决的.感谢Arch的论坛啊, 提出问题就有人来解答.\n\n回到PyGTK上来, Arch默认就安装了PyGTK, 所以没有安装和配置的问题了.\n<!--more-->\n这里有个小程序, 先放上来\n<pre lang="python">\n#!/usr/bin/python\n#-*-coding:utf-8-*-\n\nimport pygtk\npygtk.require("2.0")\nimport gtk\n\nclass HelloWorld2:\n def callback(self, widget, data):\n print "Hello again -%s was pressed" % data\n\n def delete_event(self, widget, event, data = None):\n gtk.main_quit()\n return False\n\n def __init__(self):\n self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)\n\n self.window.set_title(u"高级HelloWorld")\n\n self.window.connect(''delete_event'', self.delete_event)\n\n self.window.set_border_width(10)\n\n self.box1 = gtk.HBox(False, 0)\n\n self.window.add(self.box1)\n\n self.button1 = gtk.Button("Button 1")\n\n self.button1.connect(''clicked'', self.callback, "button 1")\n\n self.box1.pack_start(self.button1, True, True, 0)\n\n self.button1.show()\n\n self.button2 = gtk.Button("Button 2")\n\n self.button2.connect(''clicked'', self.callback, ''button 2'')\n\n self.box1.pack_start(self.button2, True, True, 0)\n\n self.button2.show()\n\n self.box1.show()\n self.window.show()\n\ndef main():\n gtk.main()\n\nif __name__=="__main__":\n hello = HelloWorld2()\n main()\n</pre>\n第4-6行是导入gtk包, 并确保PyGTK的版本是2.0. 在HelloWorld2这个类里, 定义了一个关闭窗口的方法delete_event和一个callback的方法, 供2个button来调用.\n\n在PyGTK里添加一个widget的方法: 首先, 创建该widget并设置部件属性, 然后使用该widget的connect方法绑定一个事件, 最后使用show()方法显示该widget.\n例如:\n<pre lang="python">\nwindow = gtk.Window(gtk.WINDOW_TOPLEVEL) #创建该Window部件(顶层部件)\nwindow.set_title(''My PyGTK'') #设置部件属性\nwindow.connect(''delete_event'', delete_event) #将delete_event函数绑定在delete_event这个事件上, 该事件其实就是窗口的关闭\nwindow.show() #显示该部件\n</pre>\n如果该部件里包含其它部件, 可以用add()方法将其它部件添加进来. 部件可以绑定的事情依部件不同而不同, 比如说window部件有delete_event事件, 在窗口关闭的时候激活;button有clicked事件, 当按钮被点击的时候激活. 还有很多其它的部件和事情, 我还没有学习到, 以后会慢慢补上.\n\n今天就先研究到这~明天继续.', 1, '2009-05-18 01:00:26', '2009-05-18 01:00:26', 0, 1, 'test'),
(25, 'PyGTK学习笔记(二)', '今天看了PyGTK的部件布局~发现使用起来很是简单~不过部件多了的话~写起来还是非常麻烦的.\n\n大体的布局有2种, 水平布局(HBox)和垂直布局(VBox).往容器(Box)添加部件的时候, 有2种方式, pack_start()和pack_end(), 2个方式的区别是, start是从前往后填, 而end是从后往前填.\n<!--more-->\nHBox和VBox接受2个参数, homogeneous和spacing, 定义如下:hbox = gtk.HBox(homogeneours = False, spacing = 0).homogeneous给True, 表示里面所有的部件都使用相同的大小, 给False则正好相反.spacing表示的是2个部件的距离.\n\npack_start()和pack_end()接受4个参数, 分别为child, expand, fill, padding.child为需要放入容器的部件. expand为True的时候, 表示该部件会填满容器, False则反之. fill用来表示是否使用空白空间, 只有当expand为True的时候, 该选项才起作用. padding表示部件周围留出的空间.完整的定义如下:box.pack_start(child, expand = True, fill = True, padding = 0)\n\n下面举一个例子说明使用上面的2个布局:\n<pre lang="python">\n#!/usr/bin/python\n\nimport pygtk\npygtk.require(''2.0'')\nimport gtk\nimport sys, string\n\ndef make_box(homogeneous, spacing, expand, fill, padding):\n box = gtk.HBox(homogeneous, spacing)\n\n button = gtk.Button(''box.pack'')\n box.pack_start(button, expand, fill, padding)\n button.show()\n\n button = gtk.Button(''(button,'')\n box.pack_start(button, expand, fill, padding)\n button.show()\n\n if expand == True:\n button = gtk.Button(''True,'')\n else:\n button = gtk.Button(''False,'')\n\n box.pack_start(button, expand, fill, padding)\n button.show()\n\n button = gtk.Button((''False,'', ''True,'')[fill==True])\n box.pack_start(button, expand, fill, padding)\n button.show()\n\n padstr = "%d)" % padding\n\n button = gtk.Button(padstr)\n box.pack_start(button, expand, fill, padding)\n button.show()\n\n return box\n\nclass PackBox1:\n def delete_event(self, widget, event, data = None):\n gtk.main_quit()\n return False\n\n def __init__(self, which):\n self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)\n\n self.window.connect(''delete_event'', self.delete_event)\n self.window.set_border_width(10)\n\n box1 = gtk.VBox(False, 0)\n\n if which == 1:\n label = gtk.Label(''HBox(False, 0)'')\n\n label.set_alignment(0, 0)\n\n box1.pack_start(label, False, False, 0)\n\n label.show()\n\n box2 = make_box(False, 0, False, False, 0)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n box2 = make_box(False, 0, True, False, 0)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n box2 = make_box(False, 0, True, True, 0)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n separator = gtk.HSeparator()\n\n box1.pack_start(separator, False, True, 5)\n separator.show()\n\n label = gtk.Label(''HBox(True, 0)'')\n label.set_alignment(0, 0)\n box1.pack_start(label, False, False, 0)\n label.show()\n\n box2 = make_box(True, 0, True, False, 0)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n box2 = make_box(True, 0, True, True, 0)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n separator = gtk.HSeparator()\n box1.pack_start(separator, False, True, 5)\n separator.show()\n elif which == 2:\n label = gtk.Label(''HBox(False, 10)'')\n label.set_alignment(0, 0)\n box1.pack_start(label, False, False, 0)\n label.show()\n\n box2 = make_box(False, 10, True, False, 0)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n separator = gtk.HSeparator()\n box1.pack_start(separator, False, True, 5)\n separator.show()\n\n label = gtk.Label(''HBox(False, 0)'')\n label.set_alignment(0, 0)\n box1.pack_start(label, False, False, 0)\n label.show()\n\n box2 = make_box(False, 0, True, False, 10)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n box2 = make_box(False, 0, True, True, 10)\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n separator = gtk.HSeparator()\n box1.pack_start(separator, False, True, 5)\n separator.show()\n elif which == 3:\n box2 = make_box(False, 0, False, False, 0)\n\n label = gtk.Label(''end'')\n box2.pack_end(label, False, False, 0)\n label.show()\n\n box1.pack_start(box2, False, False, 0)\n box2.show()\n\n separator = gtk.HSeparator()\n\n box1.pack_start(separator, False, True, 5)\n separator.show()\n\n quitbox = gtk.HBox(False, 0)\n\n button = gtk.Button(''Quit'')\n\n button.connect(''clicked'', lambda w: gtk.main_quit())\n\n quitbox.pack_start(button, True, False, 0)\n box1.pack_start(quitbox, False, False, 0)\n\n self.window.add(box1)\n\n button.show()\n quitbox.show()\n\n box1.show()\n\n self.window.show()\n\ndef main():\n gtk.main()\n return 0\n\nif __name__ == "__main__":\n if len(sys.argv) != 2:\n sys.stderr.write(''usage:packbox.py num, where num is 1, 2, or 3.\n'')\n sys.exit(1)\n PackBox1(string.atoi(sys.argv[1]))\n main()\n</pre>\n\n程序有点长~但是很好理解~运行时~使用python study2.py 1可以看到所有的部件了.', 1, '2009-05-19 01:10:14', '2009-05-19 01:10:14', 0, 0, 'test'),
(26, '测试PyGTK学习成果的例子', '这个例子没有什么难点~只是为了测试自己目前对PyGTK的理解程度~同时也是测试下如何使用回调函数~下面贴出代码.\n\n<!--more-->\n\n<pre lang="python">\n#!/usr/bin/python\n\nimport pygtk\npygtk.require(''2.0'')\nimport gtk\n\nclass Test():\n def one(self, widget, data = None):\n self.label.set_label(''one'')\n\n def two(self, widget, data = None):\n self.label.set_label(''two'')\n\n def delete_event(self, widget, data = None):\n gtk.main_quit()\n return False\n\n def __init__(self):\n self.vbox = gtk.VBox(False, 0)\n\n hbox = gtk.HBox(False, 0)\n self.label = gtk.Label(''No Text Now'')\n self.label.show()\n self.vbox.pack_start(self.label, False, True, 5)\n\n button = gtk.Button(''Hello1'')\n button.connect(''clicked'', self.one)\n button.show()\n hbox.pack_start(button, False, True, 5)\n\n button = gtk.Button(''Hello2'')\n button.connect(''clicked'', self.two)\n button.show()\n hbox.pack_start(button, False, True, 5)\n\n hbox.show()\n self.vbox.pack_start(hbox, False, True, 0)\n\n self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)\n self.window.set_title(''My First Test'')\n self.window.set_border_width(10)\n self.window.add(self.vbox)\n self.window.connect(''delete_event'', self.delete_event)\n\n self.vbox.show()\n self.window.show()\n\ndef main():\n gtk.main()\n\nif __name__ == ''__main__'':\n test = Test()\n main()\n</pre>', 1, '2009-05-19 01:29:28', '2009-05-19 01:29:28', 0, 1, 'test'),
(27, 'PyGTK学习笔记(三)', '在二里我看的布局方式有2种,分别是水平布局和垂直布局, 这2种方式简单易用, 而且可以混合使用, 但是想设计出更精细的界面, 还需要另外一种布局方式, 那就是表格布局.\n\n顾名思义, 表格布局就是把一个窗口分成若干个小的表格, 将部件放入这些小的格子里, 一个部件可以占一个格子, 也可以占多个.\n<!--more-->\n使用表格布局, 首先要创建表格部件, 表格部件的定义如下:\n<pre lang="python">\ntable = gtk.Table(rows = 1, columns = 1, homogeneous = False)\n</pre>\nrows表示行, columns表示列, homogeneous跟HBox和VBox里的参数一个意思, 表示这个表格是否随着窗口的缩放而缩放.\n\n定义好表格部件后, 下面就是往里面放入其它的部件了. 这时需要了解表格部件的布局, 比如我们使用\ntable = gtk.Table(2, 2, True)\n创建了一个2x2的表格, 实际上这个模型如下:\n 0 1 2\n0 +--------+--------+\n | | |\n1 +--------+--------+\n | | |\n2 +--------+--------+\n横着的边有三条, 编号分别为0,1,2, 竖着的边也有三条, 分别为0,1,2.\n\n往表格里添加输入的方法定义如下:\n<pre lang="python">\ntable.attach(child, left_attach, right_attach, top_attach, bottom_attach, xoptions = EXPAND|FILL, yoptions = EXPAND|FILL, xpadding = 0, ypadding = 0)\n</pre>\n这里的left_attach, right_attach等参数, 实际上是上面那个模型中的边的编号, 比如说, 要把一个按钮放在这个表格的左上角的位置, 代码就要这么写:\ntable.attach(button, 0, 1, 0, 1)\n表示它左边的边是0, 右边的边是1, 上面的边是0, 下面的边是1, 这点需要特别注意.\n\n我们还可以使用table.set_row_spacing(row, spacing)和table.set_col_spacing(col, spacing)来指定任意行和列之间的空隙, 或者使用table.set_row_spacings(spacing)和table.set_col_spacings来指定所有行和列的空隙.\n\n用table布局把上一个例子重写后, 代码如下:\n<pre lang="python">\n#!/usr/bin/python\n\nimport pygtk\npygtk.require(''2.0'')\nimport gtk\n\nclass TableTest:\n def delete_event(self, widget, data = None):\n gtk.main_quit()\n return False\n\n def click(self, widget, data = None):\n self.label.set_label(''the %s button clicked!'' % data)\n\n def __init__(self):\n self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)\n self.window.set_title(''Table Layout Test'')\n self.window.set_border_width(10)\n self.window.connect(''delete_event'', self.delete_event)\n\n self.table = gtk.Table(2, 2, True)\n\n self.label = gtk.Label()\n self.label.set_label(''Hello Pygtk'')\n self.table.attach(self.label, 0, 2, 0, 1)\n self.label.show()\n\n button = gtk.Button(''Left'')\n button.connect(''clicked'', self.click, ''Left'')\n button.show()\n self.table.attach(button, 0, 1, 1, 2)\n\n button = gtk.Button(''Right'')\n button.connect(''clicked'', self.click, ''Right'')\n button.show()\n self.table.attach(button, 1, 2, 1, 2)\n\n self.window.add(self.table)\n self.table.show()\n self.window.show()\n\ndef main():\n gtk.main()\n\n\nif __name__ == ''__main__'':\n TableTest = TableTest()\n main()\n</pre>', 1, '2009-05-20 13:23:27', '2009-05-20 13:23:27', 0, 3, 'test'),
(28, '在Yii中使用Captcha(修改)', 'Web开发的过程中, 经常会用到验证码, 以防止机器人不断的提交数据, 造成网站的瘫痪. Yii里提供了一个验证码的插件, 就是Captcha. 在项目中使用Captcha需要以下一些设置:\n首先在model里加入一个属性verifyCode\n<pre lang="PHP">public $verifyCode;</pre>\n<span style="color:red;">然后将verifyCode加入到safeAttributes里面.\n很多人都没有认真看, 或者不知道怎么将captcha加到safeAttributes里, 这里给出方法:</span>\n<pre lang="PHP">public funtion safeAttributes() {\n return array(\n ''verifyCode'', ''xx'', ''yy'', ....\n }\n}</pre>\n接着在rules里加入verifyCode的验证规则:\n<pre lang="PHP">array(''verifyCode'', ''captcha'');</pre>\nController里也要做必要的设置, 添加actions方法:\n<pre lang="PHP"> public function actions() {\n return array(\n ''captcha'' => array(\n ''class'' => ''CCaptchaAction'',\n ''backColor'' => 0xF5F5F5,\n ),\n );\n }</pre>\n同时, 需要将captacha添加到accessRules里, 以允许所有用户访问该方法.\n最后, 就是在view里显示captcha了, 方法如下:\n<pre lang="PHP">\n<div class="simple">\n<label> </label>\nwidget(''CCaptcha''); ?></div>\n<div class="simple"></div></pre>\n这里用了2行来处理captcha, 效果会比较美观.', 1, '2009-06-04 12:22:54', '2009-06-04 12:22:54', 0, 0, 'test'),
(29, '美化ArchLinux - Compiz + AWN', '好看的桌面和主题可以愉悦工作者的心情, 心情愉快了, 自然工作就更加顺利了, 效率也就提高了.\n\n一、Compiz\n\n这次要安装的是大名鼎鼎的Compiz. 相信很多Linuxer都看过Ubuntu的3D效果, 觉得非常震撼, 事实上, Ubuntu只不过是使用Compiz这个包来得到这个效果的, 我们得Arch自然不会在这方面落后它了.\n<!--more-->\n使用\npacman -S compiz-fusion-gtk\n来安装compiz-fusion(它是compiz的一个分支), 安装完成后, 将compiz-fusion &加入到启动会话里已实现开机自动启动.\n重启X后发现, 窗口的标题栏全都不见了, 这是新版本的compiz-fusion默认没有打开 <strong>窗口装饰(window-decorator)</strong> 的原因. 不用担心, 打开 系统->首选项->CompizConfig设置管理器, 找到 窗口装饰(window-decorator), 激活它即可. 同时需要激活的还有 <strong>最大化</strong>, <strong>调整窗口大小</strong> 和 <strong>移动窗口</strong>, 否则你将不能操作窗口, 这是件多么痛苦的事情啊. 都激活后, 重启X即可.\n\n二、Avant-Window-Navigator (AWN)\nAWN是Linux下的一个老牌Dock工具了, 口碑颇好, 不过最近有被Cario-Dock超越的趋势. 但是咱们这里, 还是安装源里提供的AWN.\n使用\npacman -S avant-window-navigator\n安装AWN, 然后从 应用程序->附近 来启动AWN, 启动后, 在Dock上点击右键, 选择Dock Preferences设置AWN, 勾中开机自动启动即可. 现在, 就可以把常用的程序从菜单里拖到AWN上使用了, 非常之方便.\n\n三、Cario-Dock\n感谢葡萄皮同学的帮助, 已经找到了安装Cario-Dock得安装方法, 首先确保安装了yaourt, 然后使用yaourt Cario-Dock来安装Cario-Dock和Cario-Dock-plugins, 安装完成后, 就可以从 应用程序->系统工具->glx-Cario-Dock 来启动Cario-Dock了.\n\n有人说有图才有真相~今天就让大家看看我平常工作的桌面:\n<img src="http://davidshieh.cn/wp-content/uploads/2009/06/desktop-with-windows.jpg" alt="desktop-with-windows" title="desktop-with-windows" width="300" height="168" class="aligncenter size-medium wp-image-191" />', 1, '2009-06-15 23:34:06', '2009-06-15 23:34:06', 0, 6, 'test'),
(30, 'ArchLinux小技巧(不断更新中)', '一、取消难听的电脑喇叭声音\n在使用终端的时候, 经常会听到刺耳的警告声音. 比如说, 按tab的时候, 报错的时候, 有时觉得很吵. 以前可以在系统->首选项里找声音把它关掉, 升级到Gnome 2.26后, 这个选项没有了. 有时觉得很烦, 于是找到了个办法把它关掉.\n修改/etc/rc.conf文件, 找到MODULES=()项, 将!pcspkr和!snd_pcsp加入到里面即可了, 从此与烦人的喇叭警报say goodbye!\n<!--more-->\n\n二、自动同步时间\n使用\npacman -S openntpd\n安装openntpd同步时间程序, 如果系统开机时自动同步时间, 将openntpd加入到启动daemons即可, 建议在openntpd前加@使它后台启动.', 1, '2009-06-16 00:35:12', '2009-06-16 00:35:12', 0, 2, 'test'),
(31, '功能强大的yaourt - AUR', '一直以为Pacman是Arch下唯一的, 也是最好的包管理软件, 从来没有去关注过AUR, 今天得 <a href="http://imxxb.com"><strong><em>高人</em></strong></a> 指点, 安装了yaourt, 才发现这个管理软件也是异常的强大, 有了它, 我们就可以安装所有AUR里的软件了.\n\n另 : 添加一个资源非常丰富的Arch源.\n配置/etc/pacman.conf文件, 将\n[archlinuxfr]\nServer = http://repo.archlinux.fr/x86_64\n加入文件的末尾, 然后pacman -Sy 即可更新此源.', 1, '2009-06-16 00:42:53', '2009-06-16 00:42:53', 0, 3, 'test'),
(32, 'ArchLinux 下配置nginx+PHP5 (FastCGI)', '由于自身的臃肿, Apache现在已经越来越不能胜任大型的web服务了, 现在比较流行的一个web服务器就是nginx了, 怎么在Arch上配置该服务器以实现对PHP的支持呢? 跟我来一步一步的做吧.\n\n首先使用pacman -S nginx php安装nginx和php, Arch里默认php自带了php-cgi. 安装完成后, 配置/etc/nginx/conf/nginx.conf文件, 主要修改和添加一下内容:\n<pre lang="conf">\n location / {\n root /home/icefox/webroot;\n index index.php index.html index.htm;\n }\n\n location ~ .php$ {\n root /home/icefox/webroot;\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n</pre>\n其中, root表示程序所在的目录, fastcgi-pass表示fastcgi的地址和端口, 关键的地方是fastcgi_param, 这里写错的话, 会导致服务器无法正常解析PHP而报No input file specified.的错误, 配置好以后, 保存推出.\n\n启动fastcgi服务可以使用php-cgi命令, 但是该进程不是很稳定, 而且挂掉后不会自动重启, 这里使用spawn-fcgi来启动和守护fastcgi进程, 这时就需要安装lighttpd程序了, 因为spawn-fcgi是随lighttpd一起安装的, 使用pacman -S lighttpd来安装lighttpd, 然后使用\n<pre lang="bash">\nspawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u USERNAME -g USERGROUP -f /usr/bin/php-cgi\n</pre>\n来启动fastcgi进程(USERNAME和USERGROUP换成自己的用户名和用户组), 这里的几个参数需要说明下:\na:fastcgi的地址\np:fastcgi的端口\nC:fastcgi的进程数\nf:php-cgi的位置\nu和g分别表示该进程所属的用户名和用户组.\n\n现在, 就剩开始nginx服务了, 使用sudo /etc/rc.d/nginx start来开启nginx. 大功告成!', 1, '2009-06-17 20:41:54', '2009-06-17 20:41:54', 0, 3, 'test'),
(33, '修复Arch下新装Xorg键盘和鼠标失灵的问题', '新版本的Xorg安装时, 是不带xf86-input-mouse和xf86-input-keyboad的, 所以很多朋友安装完Gnome后, 都无法使用鼠标和键盘, 其实修复的方法很简单, 启动到命令行下, 输入pacman -S xf86-input-mouse xf86-input-keyboad, 并把hal加入启动进程Daemons即可.\n\n启动Arch进入命令行模式的方法, 在grub里选择系统的时候, 修改启动参数, 在kernel一行的末尾加一个空格1即可, 如下:\nkernel /boot/vmlinuz26 root=/dev/disk/by-uuid/be452451-f744-45e8-988c-c143a0a04465 ro quiet 1', 1, '2009-06-17 20:50:57', '2009-06-17 20:50:57', 0, 4, 'test'),
(34, '优秀的PHPer应具备的技术(探讨)', '很多接触过和没有接触过PHP的人, 都说PHP很简单, 诚然, 如果单比语法和普通应用的话, PHP确实简单, 但是想成为一名优秀的PHPer, 要走的路就很长了.除了PHP本身的技术外, 一名优秀的PHPer还应该具备以下能力:\n\n1.前端技术\nPHP是一种模板类语言, 这就要求写PHPer需要HTML和CSS的知识来写出优秀的页面. 除了优秀的HTML和CSS知识, JavaScript的功力也是必须的, web2.0时代, 写一个ajax总是要会的.\n\n2.数据库技术\n数据库技术包含的方面就很多了, 除了要会数据库设计, sql语言, 优秀的PHPer还要掌握sql优化, 触发器, 存储过程等知识.\n<!--more-->\n3.缓存技术\nPHP是一个面向连接的语言, 一次请求完成所有资源释放, 这就决定了优秀的PHPer要使用缓存技术来对页面和数据进行缓存, 以减少服务器和数据库的压力, 目前使用比较多的缓存工具是memcached和apc.\n\n4.服务器技术\n好的服务器配置可以使PHP跑的更加流畅, 所以PHPer们还要掌握服务器的配置, 以使资源最优化配置. 目前用的比较多的是服务器是apache, lighttpd和nginx. 个人比较看好nginx, 负载能力强.\n\n5.后端脚本技术\n由于PHP是面向连接的语言, 决定了它无法做类似计划任务的事情, 而且又由于PHP本身没有线程的概念, 所以当需要后台处理大量数据的时候, PHP又显得力不从心了. 这时就需要PHPer使用perl, python, java等语言编写服务器端的脚本, 放在服务器端不断运行以处理一些类似守护进程的应用.\n\n6.写扩展的技术(非必须)\nPHP的类库和扩展很多, 使得PHP的应用也比较广泛, 但是偶尔也会遇上PHP不能做到的事情, 这时就要求PHPer用C来自己写扩展了, 当然, 目前大部分的web应用PHP都有相应的扩展, 自己写扩展的几率还是比较低的.\n\n7.设计模式的思想(新添加)\n优秀的PHPer已经不再立志于编写简单的脚本了, 设计大型的应用系统已经变成首要任务了. 所以, 拥有良好的设计模式思想又变的尤为重要了. PHP无架构可言已经变成过去式了.\n\n综上所述, 成为一名优秀的PHPer要有很长的路要走, 想成为优秀的PHPer, 涉猎的范围一定要广, 不能只把自己局限在PHP端, 认为只要PHP脚本写好了就行了, 这样永远成为不了优秀的程序员.\n\nPS. 本人目前正朝这个方向努力, 还有很多需要学习的地方, 上面所写也只是本人工作一段时间后的感触, 如有写的不对的地方, 欢迎各路高手与小弟探讨纠正, 本人在此谢过!', 1, '2009-06-17 22:59:33', '2009-06-17 22:59:33', 0, 4, 'test'),
(35, 'fcitx配置', '美化我们的fcitx, 让打字的心情变得更加舒畅, 来个截图:\r\n\r\n注意: fcitx 3.6.2的配置文件发生了改变, 下面的配置文件也是根据3.6.2改动过的, 可以放心使用.\r\n\r\n<!--more-->\r\n使用Gedit打开.fcitx/config文件, 注意选择编码格式为gb18030(原来这里写的是gb2312,但现在貌似是gb18030了), 保存的时候也必须是这个编码, 将里面的内容改外以下:\r\n<pre lang="CONFIG">\r\n[程序]\r\n显示字体(中)=*\r\n显示字体(英)=DejaVu Sans Mono\r\n显示字体大小=11\r\n主窗口字体大小=11\r\n字体区域=zh_CN.UTF-8\r\n使用AA字体=1\r\n使用粗体=1\r\n使用托盘图标=1\r\n\r\n[输出]\r\n数字后跟半角符号=1\r\nEnter键行为=2\r\n分号键行为=2\r\n大写字母输入英文=1\r\n转换英文中的标点=1\r\n联想方式禁止翻页=1\r\n\r\n[界面]\r\n候选词个数=6\r\n主窗口使用3D界面=0\r\n输入条使用3D界面=0\r\n主窗口隐藏模式=0\r\n显示虚拟键盘=0\r\n输入条居中=1\r\n首次显示输入条=1\r\n# 输入条固定宽度(仅适用于码表输入法),0表示不固定宽度\r\n输入条固定宽度=0\r\n输入条偏移量X=0\r\n输入条偏移量Y=16\r\n序号后加点=1\r\n显示打字速度=1\r\n显示版本=1\r\n光标色=102 159 66\r\n主窗口背景色=255 255 255\r\n主窗口线条色=203 202 186\r\n主窗口输入法名称色=153 153 153 102 159 66 56 134 230\r\n输入窗背景色=45 45 45\r\n输入窗提示色=242 221 40\r\n输入窗用户输入色=255 255 255\r\n输入窗序号色=76 118 235\r\n输入窗第一个候选字色=76 118 235\r\n# 该颜色值只用于拼音中的用户自造词\r\n输入窗用户词组色=0 99 200\r\n输入窗提示编码色=255 255 255\r\n# 五笔、拼音的单字/系统词组均使用该颜色\r\n输入窗其它文本色=242 221 40\r\n输入窗线条色=45 45 45\r\n输入窗箭头色=242 221 40\r\n虚拟键盘窗背景色=220 220 220\r\n虚拟键盘窗字母色=80 0 0\r\n虚拟键盘窗符号色=0 0 0\r\n\r\n# 除了“中英文快速切换键”外,其它的热键均可设置为两个,中间用空格分隔\r\n[热键]\r\n打开/关闭输入法=CTRL_SPACE\r\n# 中英文快速切换键 可以设置为L_CTRL R_CTRL L_SHIFT R_SHIFT L_SUPER R_SUPER\r\n中英文快速切换键=L_SHIFT\r\n双击中英文切换=0\r\n击键时间间隔=250\r\n光标跟随=CTRL_K\r\n隐藏主窗口=CTRL_ALT_H\r\n切换虚拟键盘=CTRL_ALT_K\r\nGBK支持=CTRL_M\r\nGBK繁体切换键=CTRL_ALT_F\r\n联想=CTRL_L\r\n反查拼音=CTRL_ALT_E\r\n全半角=SHIFT_SPACE\r\n中文标点=ALT_SPACE\r\n上一页=,\r\n下一页=.\r\n第二三候选词选择键=0\r\n\r\n[输入法]\r\n使用拼音=1\r\n拼音名称=智能拼音\r\n使用双拼=0\r\n双拼名称=智能双拼\r\n默认双拼方案=自然码\r\n使用区位=0\r\n区位名称=区位\r\n使用码表=0\r\n提示词库中的词组=1\r\n其他输入法=\r\n\r\n[拼音]\r\n使用全拼=0\r\n拼音自动组词=1\r\n保存自动组词=0\r\n增加拼音常用字=CTRL_8\r\n删除拼音常用字=CTRL_7\r\n删除拼音用户词组=CTRL_DELETE\r\n# 拼音以词定字键,等号后面紧接键,不要有空格\r\n拼音以词定字键=[]\r\n# 重码调整方式说明:0-->不调整 1-->快速调整 2-->按频率调整\r\n拼音单字重码调整方式=2\r\n拼音词组重码调整方式=1\r\n拼音常用词重码调整方式=0\r\n模糊an和ang=0\r\n模糊en和eng=0\r\n模糊ian和iang=0\r\n模糊in和ing=0\r\n模糊ou和u=0\r\n模糊uan和uang=0\r\n模糊c和ch=0\r\n模糊f和h=0\r\n模糊l和n=0\r\n模糊s和sh=0\r\n模糊z和zh=0\r\n</pre>', 1, '2009-06-19 19:38:27', '2009-06-19 19:38:27', 0, 5, 'test'),
(36, 'Gentoo 安装笔记 (AMD64)', '上次安装Gentoo的时候, 它把我的硬盘认成hd, 让我很是郁闷, 这次设置了BIOS, 让硬盘以SATA的形式启动, 终于被它认成了sd, 小有成就.\n\n一、对硬盘分区\n这是安装所有系统的必备步骤, 对硬盘进行分区. 使用\n<pre lang="BASH">\nfdisk /dev/sda\n</pre>\n命令, 将硬盘分出boot, swap和/3个分区来, swap分区使用82标志位, 其它2个选择83标志位. 标志位表示该分区可以使用的文件系统格式.\n使用\n<pre lang="BASH">\nmkefs.ext4 /dev/sda4\n</pre>\n将/分区格式化成ext4格式, 使用\n<pre lang="BASH">\nmkefs.ext2 /dev/sda8\n</pre>\n将boot分区格式化成ext2格式, 使用\n<pre lang="BASH">\nmakeswap /dev/sda3 && swapon /dev/sda3\n</pre>\n格式化swap分区并激活.\n\n分区工作完成.\n<!--more-->\n\n二、挂载分区\n使用\n<pre lang="BASH">\nmount /dev/sda4 /mnt/gentoo\nmkdir /mnt/gentoo/boot\nmount /dev/sda8 /mnt/gentoo/boot\nmount -t proc proc /mnt/gentoo/proc\nmount -o bind /dev /mnt/gentoo/dev\n</pre>\n挂载安装时需要的分区.\n\n三、配置网络\n本人使用的是无线网络, 所以这里使用\n<pre lang="BASH">\niwconfig wlan0 essid MERCURY key 8888888888\ndhcpcd wlan0\ncp /etc/resolv.conf /mnt/gentoo/etc\n</pre>\n来接入无线网络, 并把resolv.conf文件拷贝到目标系统中. (resolve.conf是DNS地址文件)\n\n四、安装stage3和portage-latest\n找一个速度快的源来下载stage3和portage-latest, 并把stage3解压到/mnt/gentoo, 把portage解压到/mnt/gentoo/usr.\n\n五、开始编译内核\n首先chroot到我们的目标系统中:\n<pre lang="BASH">\nchroot /mnt/gentoo /bin/bash\n</pre>\n然后使用\n<pre lang="BASH">\nemerge gentoo-sources\n</pre>\n来下载内核的源代码.\n下载完成后, 使用\n<pre lang="BASH">\nmake menuconfig\n</pre>\n来配置内核选项.\n\n这次有了上次编译失败的经验, 在配置内核编译选项的时候, 非常的小心, 把SCSI和SATA的支持, 都选上了, 由于那个SCSI Low什么的支持, 貌似比较重要.除了硬盘的支持, 在文件系统里, 要把ext2, ext3和ext4的支持都选上, 还有fat和ntfs的支持, 因为我还有windows系统, 其它的文件系统全部Cut掉. 再到网络里, 把ipv6什么的都Cut掉, 我用不到. 再到device driver里, 把我的无线网卡的支持选上, realtec rt73 usb, 嘿嘿, 没有网络的Linux不是好Linux. 找到Security, 把里面的selinux选项都Cut掉, 不需要这个. 这样, 我们的内核已经为本机做了很多的优化了, Cut掉了很多不用的特性.\n\n六、安装必备工具\n内核编译完成后, 使用命令\n<pre lang="BASH">\nemerge syslog-ng vixie-cron grub dhcpcd wireless_tools\n</pre>\n来安装syslog-ng, vixie-cron, grub, dhcpcd和wireless_tools这些必备的软件.\n使用\n<pre lang="BASH">\nrc-update add syslog-ng default\nrc-update add vixie-cron default\n</pre>\n把syslog-ng和vixie-cron加入到启动进程中.\n\n七、配置Grub\n配置好grub后, 可以重新机器了.', 1, '2009-06-23 10:55:51', '2009-06-23 10:55:51', 0, 0, 'test'),
(37, 'Gentoo emerge 命令使用', '<strong>更新Portage树</strong>\n<pre lang="BASH">\n# emerge --sync\n</pre>\n\n<strong>搜索软件</strong>\n<pre lang="BASH">\n# emerge --search XXX //通过软件名查找\n# emerge --searchdesc XXX //通过软件描述查找\n</pre>\n<!--more-->\n更改了USE标签后, 重新编译所有的包\n<pre lang="BASH">\n# emerge -avuDN world\n</pre>\n\n重新编译所有包\n<pre lang="BASH">\n# emerge -e world\n</pre>\n\n删除软件\n<pre lang="BASH">\n# emerge --unmerge XXX\n</pre>\n\n删除依赖软件\n<pre lang="BASH">\n# emerge --deepclean\n</pre>', 1, '2009-06-24 12:53:17', '2009-06-24 12:53:17', 0, 2, 'test'),
(38, 'Python 使用多线程', '使用python的多线程, 最好的方式就是继承Thread类, 自己重写run方法, 又方便又自由.\n\n基本流程如下:\n1.创建自己的类, 继承自Thread类.\n2.写构造函数, 在构造函数里调用Thread类的构造函数, 注意, 这里是关键, 不调用的话, 会报错.\n3.重写run方法, 将自己的操作放在里面.\n<!--more-->\n使用的时候, 创建该类的对象, 调用start()方法就可以执行run方法了.\n\n下面给出一个实例, 供大家参考:\n<pre lang="python">\nimport time,threading\n\nclass MyThread(threading.Thread): #继承Thread类\n\n def __init__(self, num):\n threading.Thread.__init__(self) #一定要记得调用父类的构造函数\n self.thread_num = num\n self.thread_stop = False\n print ''Thread %d started'' % self.thread_num\n\n def run(self): #在run方法里写自己的操作\n while not self.thread_stop:\n print ''Thread %d -- %s.'' % (self.thread_num, time.ctime())\n time.sleep(1)\n\n def stop(self):\n print ''Thread %d die.'' % self.thread_num\n self.thread_stop = True\n\nif __name__==''__main__'':\n thread1 = MyThread(1) #创建线程\n thread2 = MyThread(2)\n thread1.start() #开启进程\n thread2.start()\n time.sleep(10)\n thread1.stop() #结束进程\n thread2.stop()\n</pre>\n\n这里的例子是最基本的线程操作, 实际应用的时候, 还要考虑线程激活, 睡眠, 锁线程等很多操作.', 1, '2009-06-26 17:42:02', '2009-06-26 17:42:02', 0, 2, 'test'),
(39, 'Yii应用事务处理', '我们在数据库的使用中, 经常是使用事务的操作来保证数据的一致性, 那么在Yii中, 怎么使用事务呢, 其实很简单.\n\n<pre lang="PHP">\n$transaction = Yii::app()->db->beginTransaction(); //创建事务\n\n// 将需要事务处理的操作放进try里\ntry {\n $a = XXX::model()->findByPk(X);\n $a->x = 1;\n $a->update();\n $b = YYY::model()->findByPk(Y);\n $b->y = 2;\n $b->update();\n\n $transaction->commit(); //提交事务会真正的执行数据库操作\n} catch (Exception $e) {\n $transaction->rollback(); //如果操作失败, 数据回滚\n}\n</pre>\n\n怎么样, 没有比这更简单的方法了吧, 利用Yii给我们带来的这个特性, 我们可以非常方便的使用数据库的事务操作.', 1, '2009-07-07 14:19:56', '2009-07-07 14:19:56', 0, 0, 'test'),
(40, 'Gentoo安装总结(AMD64)', '折腾了近一个月的Gentoo, 一直都没有Desktop环境中使用过, 安装的过程中总是遇到这样那样的问题, 也真叫人头疼, 咋别人装都那么顺利呢...\n\n回到话题上来, 由于测试版的软件已经足够稳定了, 所以不需要在安装的时候还使用稳定版的老的软件, 可以直接使用测试版的软件了. 下面就记录下安装过程.\n\n一、安装base系统\n1.分区, 并把stage3和portage安装好(查阅相关文档)\n2.配置网络, 并把resolv.conf文件拷贝到/mnt/gentoo/etc目录下\n3.chroot到新系统中, 并做必要的配置(设置hostname, 密码等)\n4.修改make.conf文件, 如下:\n<pre lang="conf">\nCFLAGS="-march=k8 -O2 -pipe" #使用-march=k8会对处理器进行进一步优化, 只是用于amd的64位cpu.\nMAKEOPTS="-j3" #使用3线程进行编译, 编译速度快\nACCEPT_KEYWORDS="~amd64" #使用测试版的软件\n</pre>\n<!--more-->\n5.下载内核(2.6.30), 命令为emerge gentoo-sources\n6.配置和编译内核\n<pre lang="bash">\ncd /usr/src/linux\nmake menuconfig\nmake && make modules_install\n</pre>\n7.安装内核到boot分区\n<pre lang="bash">\ncp /usr/src/linux/arch/x86_64/boot/bzImage /boot/kernel-2.6.30\n</pre>\n8.安装syslog-ng和vixie-cron\n<pre lang="bash">\nemerge syslog-ng vixie-cron\nrc-update add syslog-ng default\nrc-update add vixie-cron default\nenv-update && source /etc/profile\n</pre>\n9.安装grub并配置\n<pre lang="bash">\nemerge grub\nnano /boot/grub/grub.conf\n</pre>\ngrub.conf里, 加入以下内容\n<pre lang="conf">\ntitle Gentoo 2.6.30\nroot (hd0,7)\nkernel /boot/kernel-2.6.30 root=/dev/sda4\nboot\n</pre>\n下面开始配置grub, 先输入grub进入grub, 然后使用以下命令\n> root (hd0,7)\n> setup (hd0)\n> quit\n没报任何错误信息的话, grub就安装成功了.\n10.先推出chroot模式, 然后将所有挂载的盘取下, 重启系统即可.\n\n二、安装桌面系统\n1.安装桌面系统前, 很重要的一步就是创建普通用户, 否则将会无法登陆gnome\n2.安装X\n在/etc/make.conf里加入以下USE: X svg glx unicode -ipv6, 并加入以下内容\nINPUT_DEVICES="keyboard mouse"\nVIDEO_CARDS="nvidia"\n设置完后, 使用emerge xorg-x11安装X, 安装完成后, 使用Xorg -configure生成xorg.conf.new配置文件, 将它拷贝到/etc/X11下, 并改名为xorg.conf, 或使用命令\ncp ~/xorg.cong.new /etc/X11/xorg.conf\n3.安装Gnome-light\n在/etc/make.conf里加入以下USE: gnome gtk consolekit -kde -qt3 -qt4 -arts\n使用emerge gnome-light安装轻量版的gnome, 但是这里有个问题, 就是由于没有安装libxml2, gnome-terminal的安装可能会失败, 所以安装前还是要先安装libxml2.由于gnome-light是非常轻量的, 它省去了很多必备的软件, 所以这里需要手动安装它们.使用命令emerge gnome-panel gnome-control-center, 也许还需要安装一些主题, 不过这个都可以放到以后再装.\n4.安装gdm并配置\n使用emerge gdm安装gdm, 然后修改/etc/conf.d/xdm, 将里面的xdm改成gdm, 然后使用rc-update add xdm default将xdm加入启动项, xdm在启动后会自动启动gdm.\n5.重启后即可进入gnome桌面.\n\n三、美化Gnome\n(未完待续)', 1, '2009-07-10 10:33:11', '2009-07-10 10:33:11', 0, 11, 'test'),
(41, 'Gentoo上配置nginx+php (2009年8月3日修改)', '(非常感谢transtone的回复, 让我发现了博文里面这么严重的笔误, 现在已经纠正了)\n先说句实话,Gentoo很好用,配置很灵活,软件安装也很灵活,但是这种灵活带来的坏处就是,配置太麻烦了。\n\n我花了近2天的时候,才成功在Gentoo上配置好nginx和php的环境,实在是太不容易了,流泪中。。。\n其实安装nginx和php都很简单,只要使用上正确的USE标签即可,由于这些USE标签平常用不到,所以没有必要把它们写在全局USE里。建立/etc/portage/package.use文件(如果已经建立国过文件了,直接修改它即可),加入以下内容:\n<!--more-->\n<pre lang="conf">\ndev-lang/php cli ming simplexml pdo mysqli json cgi ctype(新增加这个USE)\nwww-servers/nginx fastcgi\n</pre>\n加这些标签很好理解,使用nginx服务器,并以fastcgi的形式部署php,所以安装php的时候,cgi是必备的标签了,同样,fastcgi就是nginx的必备标签了。\n\n使用emerge php nginx spawn-fcgi来安装php,nginx和spawn-fcgi(cgi守护进程),完成后配置/etc/nginx/nginx.conf文件,在server里加入如下内容:\n<pre lang="conf">\n location / {\n root /home/icefox/webroot;\n index index.php index.html;\n }\n\n location ~ .php$ {\n root /home/icefox/webroot;\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n</pre>\n具体配置说明请参阅nginx相关文档。\n使用spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u icefox -g icefox -f /usr/bin/php-fcgi启动spawn-fcgi,然后使用/etc/init.d/nginx start启动nginx即可。', 1, '2009-07-15 00:48:44', '2009-07-15 00:48:44', 0, 13, 'test'),
(42, 'Yii使用自定义filter', '今天帮群里的朋友看filter,才发现原来Yii里有这么强大的东西。废话不多说,在咱们的controller里加入自己的filter吧。\n\n<pre lang="PHP">\n public function filters()\n {\n return array(\n ''accessControl'', // perform access control for CRUD operations\n ''testFilter + list, show'',\n );\n }\n\n public function FilterTestFilter($filterChain) {\n echo "begin";\n $filterChain->run();\n echo "end";\n }\n</pre>\n\n怎么样,很简单吧,现在执行下你的action看看有什么结果。\nfilter的作用就是在action执行前和执行后执行某些操作。自定义的filter方法必须以Filter开头,名字就是filters方法里的名字。参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。', 1, '2009-07-16 00:43:51', '2009-07-16 00:43:51', 0, 6, 'test'),
(43, '使用Yii开发简单文章系统之三--用户操作(续)', '上一节里我们修改了model以添加我们自己的验证规则, 我们也在view里成功的显示了form, 这一节里, 我们将完成注册功能, 并实现用户的登录与注销.\n\n在上一节创建好的form页面, 我们可以尝试下点击提交, 发现还是回到了本页面, 却没有将数据放入数据库, 怎么讲数据放进数据库呢? 跟我来! 回到UserController里, 找到刚才的actionRegister方法, 将它修改如下:\n<!--more-->\n<pre lang="PHP">\n public function actionRegister() {\n $form = new User;\n if (isset($_POST[''User''])) {\n $form->attributes = $_POST[''User''];\n if ($form->save()) {\n $this->redirect(array(''user/login''));\n }\n }\n\n $this->pageTitle = ''注册'';\n\n $this->render(''register'', array(''form'' => $form));\n }\n</pre>\n$form->attributes = $_POST[''User'']就成功的把字段里的值都赋给了model, 这时, 我们的model已经有了一些属性, 使用$form->save()来将我们的属性保存起来, 这样, 我们就在数据库里创建了一条记录, $form->save()成功后, 页面将跳转到login页面. 赶紧试一下吧.\n\n啊哦, 怎么不行啊, 提示createdTime没有默认值. 这里我们使用一个小技巧可以轻松完成这个功能. 打开User.php文件, 添加以下内容:\n<pre lang="PHP">\n protected function beforeSave() {\n if ($this->isNewRecord) {\n $this->password = md5($this->password);\n $this->createdTime = time();\n }\n return true;\n }\n</pre>\n聪明的你肯定看懂了这里的含义, $this->isNewRecord会判断该记录是新建的, 还是修改的, $this->password = md5($this->password)是把密码进行md5加密, $this->createdTime = time()会在新建数据的时候, 将当前时间给createdTime字段. 有一点需要注意的地方就是, 结尾一定要数return true来表示该方法执行顺利, 否则数据可是不会存入数据库哦.\n\n好了, 重新注册吧, 这时, 我们的数据已经可以顺利存入数据库里, 怎么, 你还不能顺利注册?! 赶紧从头开始看一遍吧.\n\n现在我们来添加login方法.首先在controller里创建login action, 内容如下:\n<pre lang="PHP">\n public function actionLogin() {\n $form = new LoginForm;\n if (isset($_POST[''LoginForm''])) {\n $form->attributes = $_POST[''LoginForm''];\n if ($form->validate())\n $this->redirect(Yii::app()->user->returnUrl);\n }\n\n $this->pageTitle = ''登陆'';\n\n $this->render(''login'', array(''user'' => $form));\n }\n</pre>\n跟我们修改User这个model的方法类似, 我们在protected/models里创建LoginForm模型, 作用是实现登录框, 并对登录的用户名和密码进行验证.\n<pre lang="PHP">\nclass LoginForm extends CFormModel {\n public $username;\n public $password;\n public $rememberMe;\n\n public function rules() {\n return array(\n array(''username, password'', ''required''),\n array(''password'', ''authenticate''),\n );\n }\n\n public function attributeLabels() {\n return array(\n ''username'' => ''用户名'',\n ''password'' => ''密码'',\n ''rememberMe'' => ''记住我'',\n );\n }\n\n public function authenticate($attribute,$params)\n {\n if(!$this->hasErrors()) {\n $identity = new UserIdentity($this->username, $this->password);\n $identity->authenticate();\n switch($identity->errorCode)\n {\n case UserIdentity::ERROR_NONE:\n $duration=$this->rememberMe ? 3600*24*30 : 0;\n Yii::app()->user->login($identity, $duration);\n break;\n case UserIdentity::ERROR_USERNAME_INVALID:\n $this->addError(''username'',''Username is incorrect.'');\n break;\n default:\n $this->addError(''password'',''Password is incorrect.'');\n break;\n }\n }\n }\n}\n</pre>\n解释2个地方, attributeLabels()方法的作用是, 给字段一个显示在页面上的别名, 比如说, ''user'' => ''用户名'', 当我们在页面使用<?php echo CHtml::activeLabel($form, ''username''); ?>的时候, 它显示的就是 用户名 而不再是 username了, 大家可以自己试一下. 另一个需要解释的地方就是authenticate方法了, 我们给password绑定了一个验证规则就是authenticate方法, 当用户提交了表单后, 系统就会使用这个方法来验证password适合能通过验证. 看里面的方法, 使用一个UserIdentity类来验证用户名和密码, 这时, 我们创建该类了.\n\n在protected/components目录下创建UserIdentity方法, 什么, 这个类已经有了, 那就别犹豫了, 改它吧. 内容如下:\n<pre lang="PHP">\nclass UserIdentity extends CUserIdentity {\n\n private $_id;\n private $_username;\n\n public function authenticate() {\n $user = User::model()->findByAttributes(array(''username'' => $this->username));\n if ($user === null) {\n $this->errorCode = self::ERROR_USERNAME_INVALID;\n } else if ($user->password !== md5($this->password)) {\n $this->errorCode = self::ERROR_PASSWORD_INVALID;\n } else {\n $this->_id = $user->id;\n $this->_username = $user->username;\n $this->setState(''id'', $user->id);\n $this->setState(''username'', $user->username);\n $this->errorCode = self::ERROR_NONE;\n }\n return !$this->errorCode;\n }\n}\n</pre>\n还不理解它吗, 其实很简单, 将用户名为$this->username的记录找出来, 并检查它的密码和用户输入的密码是否相同, 如果相同的话, 则设置2个值id和username. 还不理解吗? 以后慢慢就懂了.当用户通过验证后, 在任何地方使用Yii::app()->user->id就可以得到用户的id了, 多方便的.\n\n仿照register, 在protected/views/user目录下创建login.php试图文件, 内容如下:\n<pre lang="PHP">\n<?php echo CHtml::beginForm(); ?>\n\n<?php echo CHtml::errorSummary($user); ?>\n\n<p>\n <?php echo CHtml::activeLabelEx($user, ''username''); ?>\n <?php echo CHtml::activeTextField($user, ''username'', array(''size'' => 20, ''maxlength'' => 12)); ?>\n</p>\n\n<p>\n <?php echo CHtml::activeLabelEx($user, ''password''); ?>\n <?php echo CHtml::activePasswordField($user, ''password'', array(''size'' => 20, ''maxlength'' => 12)); ?>\n</p>\n\n<p>\n <label> </label>\n <?php echo CHtml::submitButton(''登陆''); ?>\n</p>\n\n<?php echo CHtml::endForm(); ?>\n</pre>\n回到浏览器里, 访问http://localhost/index.php?r=user/login去登录吧.\n\n我们已经有了注册和登录方法了, 剩下的就是登出了, 人家都说进门容易出门难, 嘿, yii里出去是很容易的, 在controller里添加actionLogout()方法, super easy的, 内容如下:\n<pre lang="PHP">\n public function actionLogout() {\n Yii::app()->user->logout();\n $this->redirect(Yii::app()->user->returnUrl);\n }\n</pre>\n怎么样, 够简单吧, 这样, 我们的用户操作模块就算完成了. 下一节开始, 我们将如何创建一个admin模块来添加category和article, 我知道这和别的教程顺序不一样, 但是我们确实需要程序自己来帮我们添加栏目和文章, 而不是从数据库里添加, 不是吗?', 1, '2009-08-01 14:40:23', '2009-08-01 14:40:23', 0, 4, 'test');
INSERT INTO `entries` (`id`, `title`, `content`, `categoryId`, `createdTime`, `modifiedTime`, `viewNum`, `commentNum`, `slug`) VALUES
(44, '使用Yii开发简单文章系统之四–Model操作', '前面三节讲了如何建立项目, 如何设置项目和如何注册和登录. 里面涉及了一些Model和Controller层的操作, 但是没有仔细讲过如何使用它们, 接下来两讲将分别讲述Model层和Controller层的操作, 在以后的课程中, 再遇到这些操作, 只会挑重点的讲了.\n\n这一讲主要讲M层的操作.\n首先, 是对M层的一些设置, 这里有个几个重要的函数, 前面已经介绍过了, 这里再做个详细的介绍:\n<ul>\n <li>tableName - 设置Model所对应的表名</li>\n <li>rules - 设置Model里各字段的验证规则</li>\n <li>relations - 设置关联规则</li>\n <li>attributeLabels - 设置各字段的别名</li>\n <li>safeAttributes - 设置可以修改属性的字段</li>\n <li>beforeValidate和afterValidate - 字段验证前和验证后执行的函数, 需要返回true值</li>\n <li>beforeSave和afterSave - 记录存储前和存储后执行的函数, 需要返回true值</li>\n</ul>\n<!--more-->\n其次, Yii里的ORM使用的是AR, 有几个主要的操作, 分别是:\n<ul>\n <li>save - 操作数据</li>\n <li>update - 修改数据</li>\n <li>delete - 删除数据</li>\n <li>validate - 验证数据</li>\n</ul>\n\n读取记录时, 有以下几个方法:\n<ul>\n <li>findByPk - 通过主键查找记录, 结果为单条记录</li>\n <li>findByAttribute - 通过属性查找记录, 结果为单条记录</li>\n <li>findAllByAttributes - 通过属性查找数据, 结果为记录集</li>\n <li>findAll - 通过CDbCriteria对象查找数据, 结果为记录集 *</li>\n</ul>\n\n查找方法接收的参数有2种, 没有星号的, 接受数组作为参数, 有星号的接收CDbCriteria对象作为参数, 使用对象的时候, 可以提供更多的查找条件, 下面给出一个实例:\n<pre lang="PHP">\n$criteria = new CDbCriteria; // 创建CDbCriteria对象\n$criteria->condition = ''title LIKE %'' . ''php'' . ''%''; // 设置查询条件\n$criteria->order = ''createdTime DESC''; // 设置排序条件\n$criteria->limit = 10; // 限定记录的条数\n$criteria->select = ''id,title,content''; // 设置结果所包含的字段\n\n$articles = Article::model()->findAll($criteria); //结果为数组, 其中每个元素为记录对象\n</pre>\n\n再次, Yii对关联数据默认采用LazyLoad的加载形式, 即需要时才读取. 这样, 当我们不需要关联数据的时候, Yii是不会帮我们去读取的, 大大加快了反应的速度. 但是也有一些时候, 我们是需要关联数据的, 比如说读取文章的时候, 我们是需要文章所属的分类的, 如果使用LazyLoad的形式, 就要有多少条, 查询多少次, 效率非常低下, 这时就需要EagerLoad了, 即一次把关联表的数据全部读出.\n比如:\n<pre lang="PHP">\n$articles = Article::model()->with(''category'')->findAll();\n</pre>\n使用with将关联表的数据一次全部读出. 关联表的设置在Model里的relation里设置.\n比如:\n<pre lang="PHP">\npublic function relations() {\n return array(\n ''category'' => array(self::BELONGS_TO, ''Category'', ''categoryId''),\n );\n}\n</pre>\n非常的清晰明了.', 1, '2009-08-03 12:58:16', '2009-08-03 12:58:16', 0, 0, 'test'),
(45, '使用Yii开发简单文章系统之五–Controller操作', '最近比较忙, 项目快上线了, 每天不停的改bug, 调试, 博文基本没动, 群里很多朋友都在等我的Yii开发系列的文章, 在这里向大家说声抱歉了, 感谢大家的支持, 这个系列一定会结束的, 只是会需要些时间, 希望大家继续关注.\r\n\r\n本讲主要分析Yii的controller的操作, 我们先来看一下Controller里都有哪些属性供我们使用:\r\n<ul>\r\n <li>$pageTitle - 设定该页面的title</li>\r\n <li>$layout - 设定该action所使用的layout</li>\r\n</ul>\r\n\r\n使用它们的方法很简单, $this->title = "欢迎来到本博客";, 这样就够了.\r\n<!--more-->\r\n下面再来看一下controller提供的方法有哪些:\r\n<ul>\r\n <li>render(string $view, array $data=NULL, boolean $return=false) - 渲染一个页面, $view为要渲染的页面, $data为传递到页面的参数</li>\r\n <li>redirect(mixed $url, boolean $terminate=true, integer $statusCode=302) - 跳转页面到某个action, $url为要跳转的地址, $url为string的时候, 则跳到该地址, $url为数组的时候, 则跳到该数组指向的地址</li>\r\n</ul>\r\n\r\n这2个方法是在action中常用的方法了. 当然, controller里不只这2个属性和方法, 还有很多, 可以查阅api得到详细列表.\r\n\r\n这里要详细介绍一个比较特殊的方法, 那就是accessRules方法, 这是yii所使用的默认权限检查方法了, 我们来看一个例子:\r\n<pre lang="PHP">\r\n public function accessRules()\r\n {\r\n return array(\r\n array(''allow'', // allow all users to perform ''list'' and ''show'' actions\r\n ''actions''=>array(''list'',''show''),\r\n ''users''=>array(''*''),\r\n ),\r\n array(''allow'', // allow authenticated user to perform ''create'' and ''update'' actions\r\n ''actions''=>array(''create'',''update''),\r\n ''users''=>array(''@''),\r\n ),\r\n array(''allow'', // allow admin user to perform ''admin'' and ''delete'' actions\r\n ''actions''=>array(''admin'',''delete''),\r\n ''users''=>array(''admin''),\r\n ),\r\n array(''deny'', // deny all users\r\n ''users''=>array(''*''),\r\n ),\r\n );\r\n }\r\n</pre>\r\n上面一个有4个检查权限的数组, 检查权限的时候, 从上至下的检查, 首先检查''users''=>array(''*'')这一个数组, 这个数组里的actions, 所有的用户都可以访问, *表示所有用户. 再看第二个, ''users''=>array(''@''), 这个数组的actions, 只有登陆用户才可以访问, 对了, @表示登陆用户. 那么第三个呢? 嘿嘿, 这个就更好理解了, ''users''=>array(''admin'')表示只有用户名为admin的用户才可以访问这里面的actions. 怎么样, yii的基于用户名的权限管理够简单吧.', 1, '2009-09-01 13:40:21', '2009-09-01 13:40:21', 0, 1, 'test'),
(46, 'jQuery操作xml', '最近项目需要使用xml来传递数据, 于是看了一下怎么用jQuery来操作xml, 看了后顿时发现, 原来jQuery的真谛也在于此, 这个, 我们一会再说.先看一个xml的结构:\r\n<pre lang="XML">\r\n<?xml version="1.0" encoding="ISO-8859-1" ?>\r\n<results>\r\n <articleNum>62</articleNum>\r\n <articles>\r\n <article>\r\n <headline>PHP ...</headline>\r\n <time>Aug 29 2009 4:19PM</time>\r\n <content>Home » Technology » Computer Programming » PHP Programming » PHP Shortcuts © Don Waterfield ...</content>\r\n <url>/visit?id=1776287</url>\r\n </article>\r\n <article>\r\n <headline>Web Developer ( Flash, AS2/3, CSS, HTML, PHP ) - ...</headline>\r\n <time>Aug 29 2009 1:50AM</time>\r\n <content>Salary £20000 - £35000 Industry IT Services Category Web Developer Type Permanent Reference ...</content>\r\n <url>/visit?id=1751693</url>\r\n </article>\r\n <article>\r\n <headline>A Guide to Linux Programming with ...</headline>\r\n <time>Aug 27 2009 3:29AM</time>\r\n <content>This is the first article in a series for programming with PHP in Linux. This article will provide ...</content>\r\n <url>/visit?id=1662378</url>\r\n </article>\r\n <article>\r\n <headline>What is PHP? - Tips on what others are looking ...</headline>\r\n <time>Aug 25 2009 7:20AM</time>\r\n <content>** ** ** Copy Article ** - Category Feed Article Summary: PHP (PHP: Hypertext Processor) is a ...</content>\r\n <url>/visit?id=1563122</url>\r\n </article>\r\n </articles>\r\n</result>\r\n</pre>\r\n<!--more-->\r\n我们要取出里面的articleNum这个标签的值, 怎么做呢, 其实很简单\r\n<pre lang="javascript">\r\n$(document).ready(function(){\r\n alert($(xml).find(''articleNum'').text());\r\n});\r\n</pre>\r\n不知道大家看明白没? 我们可以像操作document tree一样去操作xml, 这也就是我发现的jQuery的真谛, 就是jQuery的解析, 实际上就是DOM的解析! 明白了这点, 我们就会发现操作xml很容易了吧.\r\n上面那个xml里, 我把所有的值写进标签里了, 如果要读标签的属性, 怎么做呢, 方法跟读取html标签的属性一样简单\r\n<pre lang="javascript">\r\n$(document).ready(function(){\r\n alert($(xml).find(''articleNum'').attr(''xxx''));\r\n});\r\n</pre>\r\n简直无敌了. 现在, 我们也可以使用jQuery提供的方法添加和删除节点了.\r\n\r\n最后一个小问题, 就是一个节点下可能有很多子节点, 我们怎么遍历呢? 继续以上面的xml为例, 请大家看下面的代码:\r\n<pre lang="javascript">\r\n$(document).ready(function(){\r\n $(xml).find(''articles > article'').each(function(){\r\n alert($(this).find(''headline'').text());\r\n });\r\n});\r\n</pre>\r\n怎么样, 够简单吧. 现在, 操作xml会变得异常的简单了!', 1, '2009-09-01 13:48:00', '2009-09-01 13:48:00', 0, 2, 'test'),
(47, 'jQuery插件 - shiehTooltip (气泡弹出框)', '最近项目要用到气泡弹出框, 尝遍了市面上的, 没一个能让我满意的, 没办法, 自己动手吧.\r\n\r\n下面放出整个的源码, 在这里只说一下怎么使用它\r\n\r\n1.第一步当然是导入它了\r\n<pre lang="html">\r\n<script type="text/javascript" src="jquery.shiehTooltip.js"></script>\r\n</pre>\r\n<!--more-->\r\n2.需要弹出的元素要加上class和title属性\r\n<pre lang="html">\r\n<img class="mark" src="question.png" title="这是弹出框的内容" />\r\n</pre>\r\n\r\n3.在ready函数中写入\r\n<pre lang="javascript">\r\n$(document).ready(function(){\r\n $(''.mark'').shiehTooltip();\r\n});\r\n</pre>\r\n\r\n4.That''s it ! Enjoy it !\r\n\r\n附:\r\n目前我只做了一个选项, 就是弹出框的显示方式, 如果不传任何参数的话, 是用的普通的显示方式, 加上参数style的话, 可以选择用淡入淡出的方式, 比如\r\n<pre lang="javascript">\r\n$(document).ready(function(){\r\n $(''.mark'').shiehTooltip({style="fade", speed:"slow"});\r\n});\r\n</pre>\r\nspeed有2个可选项slow和fast.\r\n\r\n<a href=''http://davidshieh.cn/wp-content/uploads/2009/09/tooltip.rar''>点击下载源码</a>', 1, '2009-09-03 17:00:19', '2009-09-03 17:00:19', 0, 5, 'test'),
(48, '打造轻量高效Linux系统', '以前一直使用Gnome作为桌面系统, 后来慢慢的视觉疲劳了, 于是决定换掉它, 既然换, 就干脆换一个轻量级的桌面系统, 于是下面的组合出现了!\r\n\r\n先说我使用的各个组件\r\n1.窗口管理 -- openbox, 轻量又好用, 简约而不简单\r\n2.登录管理器 -- slim, DM中比较轻量的一款了\r\n3.文件管理器 -- pcmanfm, nautilus的替代品\r\n4.panel -- tint2, 以前一直用fbpanel, 今天才发现一个比它更好看和好用的\r\n5.背景更换 -- feh, 由于没有rox这样的桌面管理软件, 所以还是需要自己设定下背景的(朋友说可以用pcmanfm来管理桌面的, 不过我还没有尝试)\r\n6.系统监视 -- conky, 没的说, 定制性最强的系统监视软件了\r\n7.终端 -- sakura, 以前一直用gnome-terminal, 后来有尝试xterm, 但是不支持鼠标右键, 而且配置比较复杂, 这里找到一个替代品, 可以完全替代gnome-terminal了\r\n<!--more-->\r\n下面是我现在系统的截图, 嘿嘿, 非常的简洁明了, 工作效率也极高, 希望大家能喜欢, 哈哈!\r\n\r\n<a href="http://davidshieh.cn/wp-content/uploads/2009/09/capture.jpg"><img src="http://davidshieh.cn/wp-content/uploads/2009/09/capture-300x168.jpg" alt="Openbox" title="Openbox" width="300" height="168" class="aligncenter size-medium wp-image-267" /></a>\r\n\r\n欢迎板砖~', 1, '2009-09-14 22:41:21', '2009-09-14 22:41:21', 0, 11, 'test'),
(49, 'ShiehTooltip 1.1', '上次放出了ShiehTooltip的1.0版本, 不知道有没有人用过, 嘿嘿, 我是把它用到了我现在的项目中, 感觉还不错, 但是里面有一个bug, 就是当要显示气泡的元素在一个scrollbar的容器里, 弹出的气泡就会出现位置不对的情况, 这次就修改了这个问题, 放出1.1版本, 欢迎大家使用和提出宝贵意见!\r\n\r\n<script type="text/javascript" src="http://davidshieh.cn/files/jquery-1.3.2.min.js"></script>\r\n<script type="text/javascript" src="http://davidshieh.cn/files/jquery.shiehTooltip.js"></script>\r\n<script type="text/javascript">\r\n$(document).ready(function(){\r\n $(''.mark'').shiehTooltip({style:"fade", speed:"slow"});\r\n});\r\n</script>\r\n<style type="text/css">\r\n.mark {cursor: pointer;}\r\n.toolTip {\r\n width: 212px;\r\n padding-top: 27px;\r\n overflow: hidden;\r\n display: none;\r\n position: absolute;\r\n z-index: 255;\r\n background: transparent url(''http://davidshieh.cn/files/images/tipTop.png'') no-repeat top;\r\n}\r\n.toolTipBody {\r\n background: transparent url(''http://davidshieh.cn/files/images/tipMid.png'') repeat-y;\r\n padding: 0 20px 10px 20px;\r\n text-align:left;\r\n font-size:15px;\r\n}\r\n.toolTipFoot {\r\n background: transparent url(''http://davidshieh.cn/files/images/tipBtm.png'') no-repeat bottom;\r\n height: 32px;\r\n}\r\n</style>\r\n演示: <img src="http://davidshieh.cn/files/images/question-mark.png" class="mark" title="欢迎使用ShiehTooltip!" />\r\n\r\n<<a href=''http://davidshieh.cn/wp-content/uploads/2009/09/tooltip-1.rar''>点击下载ShiehTooltip-ver1.1</a>', 1, '2009-09-19 18:43:42', '2009-09-19 18:43:42', 0, 2, 'test'),
(50, '工作两年杂想', '不知不觉已经工作了2个年头了, 由不顺变的慢慢顺利平稳起来, 也算事业上的起色了. 从一开始不喜欢IT业, 到现在一心扑在IT业上, 也是我心理的一个重大变化吧.\r\n\r\n从事PHP的工作已经有1年多了, 刚开始的时候, 确实很稚嫩, 想法也很简单, 真的有种不知者无畏的感觉, 觉得只要自己努力, 什么都能搞定. 工作的时间越多, 越发现自己不知道的实在太多了, 什么都能搞定也是不可能的了. 记得以前有人给程序员分级, 最初级的程序员是不知道自己不会, 再往上一级是知道一点, 再上一级是知道很多, 最上级是知道自己不会. 刚开始的我, 就是那个最初级的程序员了.\r\n\r\n最近的这一年, 成长的应该是非常快了, 学习到了很多的知识, 而且把这些知识都运用到了实际的工作当之, 算是一种学以致用了吧. 也接触了很多人, 很多还是初学者, 从他们身上也看到了自己以前的影子, 貌似人都是从这一步走过来的吧.\r\n\r\n接下来的一年里, 希望自己能够在"业务"上更加熟练, 提高自己的代码水准(注意不是水平), 更好的磨练自己的耐心, 工作上, 也越来越顺利吧.', 1, '2009-09-23 00:18:04', '2009-09-23 00:18:04', 0, 4, 'test'),
(51, '博客迁移失败~好友链接全部丢失!!!', '唉, 太笨了~迁移博客的时候没有把所有的资料都保存~请看到的好友把你们的博客地址都留言给我~我把你们再加进来~真是不好意思了~\r\n\r\nP.S. 最后重申一次, 是浪点的服务器整体迁移~不是我个人想要迁移主机的...', 1, '2009-10-09 13:43:40', '2009-10-09 13:43:40', 0, 11, 'test'),
(52, 'Gentoo上通过Nginx+Fastcgi部署Django', '这篇文章讲的是如何在Linux上通过nginx+fastcgi的方式部署Django, 本人使用的Linux是Gentoo.\r\n\r\n首先安装nginx, 这步比较简单, 记得在nginx里加入use=fastcgi即可.\r\n\r\n然后安装flup, 这步也比较简单, 不用多说什么了. 什么, 你问这是干什么的, 呃...这是一个python的fcgi守护程序, 所以, 使用fastcgi部署Django的童鞋, 老老实实装上它吧.\r\n<!--more-->\r\n最后就是nginx的配置了, 贴出一下配置文件供大家参考:\r\n<pre lang="conf">\r\n server {\r\n listen 80;\r\n server_name localhost;\r\n\r\n access_log /var/log/nginx/localhost.access_log main;\r\n error_log /var/log/nginx/localhost.error_log info;\r\n\r\n location / {\r\n fastcgi_pass 127.0.0.1:3003; #fastcgi的ip和端口号\r\n fastcgi_param REQUEST_METHOD $request_method;\r\n fastcgi_param QUERY_STRING $query_string;\r\n fastcgi_param CONTENT_TYPE $content_type;\r\n fastcgi_param CONTENT_LENGTH $content_length;\r\n fastcgi_pass_header Authorization;\r\n fastcgi_intercept_errors off;\r\n fastcgi_param PATH_INFO $fastcgi_script_name; #django必须使用PATH_INFO而不是SCRIPT_NAME, 这点尤为重要\r\n }\r\n\r\n location ^~ /site_media/ {\r\n alias /path/to/your/site_media/; \r\n }\r\n }\r\n</pre>\r\n\r\n启动Django的方法:\r\npython manage.py runfcgi method=threaded host=127.0.0.1 port=3003 --settings=settings\r\n这里的port必须是nginx配置文件里的fastcgi的port, 末尾的--settings=settings必须加上, 否则很多设置就加载不上了.\r\n\r\n好了, 重启下服务器, 享受Django吧.\r\n\r\nP.S. 嘿嘿, 我就知道你会遇到问题, admin不能用是吧, 这里给出一个解决方案.\r\n在项目的根目录下将django的admin下的media目录链接过来即可, 给出一个例子:\r\nln -s /usr/lib/python2.6/site-packages/django/contrib/admin/media/ media\r\n\r\n如果大家还遇到了什么问题, 欢迎大家留言与我讨论!', 1, '2009-10-14 00:36:36', '2009-10-14 00:36:36', 0, 5, 'test'),
(53, 'Gentoo下安装OSS v4', '以前的linux都是使用alsa作为声卡的驱动, 现在alsa已经成为历史了, 因为有优秀的oss供我们使用, 我们不再需要alsa了. 相比于alsa, oss的优势在于音质更好, 而且解决了声卡独占的问题, 谁也不需要一个程序就把声卡全部霸占了.\r\n\r\n好了, 废话不多说了, 开始oss的安装. 在gentoo下安装oss需要有2个先决条件, 一是内核中没有编译进任何alsa或者其它声卡方面的东西, 二是必须要装有layman. 安装layman请参考 <a href="http://en.gentoo-wiki.com/wiki/Overlay">这篇文章(Gentoo Layman Wiki)</a>.\r\n\r\n前面的工作都准备好以后, 我们使用layman -a oss-overlay来导入oss的包, 然后使用emerge -av oss来装oss4.1, 装好后, 使用/etc/init.d/oss start来启动oss, 最好将oss加入到启动进程中, 这样已经就可以不用手动启动oss了, 命令为rc-update add oss default.', 1, '2009-10-23 09:58:10', '2009-10-23 09:58:10', 0, 4, 'test'),
(54, 'David-Paste, 大卫粘贴0.2beta上线', '最近一直没有时间来写博客, 一个原因是懒了, 另一个就是, 一直在做大卫粘贴, 现在已经大概做出了一个雏形, 并放在空间上供大家使用了, 地址是<a href="http://david-paste.cn/" target="_blank">大卫粘贴</a>, 欢迎大家使用, 并提出宝贵意见.\r\n\r\n大卫粘贴的上线, 离不开头太晕老兄的大力支持, 和Robin同学的强力美工支持, 在此特别感谢两位好朋友, 谢谢.', 1, '2009-10-24 22:29:17', '2009-10-24 22:29:17', 0, 2, 'test'),
(55, 'Django强大的URL机制', '最近使用Django开发了大卫粘贴系统, 了解到了Django内嵌的强大的URL机制. 它的强大在于2个方便, 一个是灵活的url配置, 另外一个就是url的可逆机制.下面, 我们就来了解下Django的URL机制.\r\n\r\n1. 灵活的配置\r\n大家都知道, Django的url使用的正则匹配的方式, 这种方式有好也有坏, 好的地方是, 可以匹配出任何你想要的url, 不好的地方就是, 任何一个url都需要手工的去配置, 不能根据Model或者App进行自适配, 就像一般的MVC框架一样, 同一个controller下都有统一的url规则.\r\n<!--more-->\r\n<strong>基本规则</strong>\r\n一条简单的url配置如下:\r\n<pre lang="python">\r\n(r''^register/$'', ''pastesite.pastebin.views.register''),\r\n</pre>\r\n当用户在浏览器输入http://localhost:8000/register/的时候, Django会把请求转到pastesite这个站点的pastebin这个app的views.py里的register方法, 怎么样, 非常的清晰明了吧.\r\n<strong>参数传递</strong>\r\n让我们再来看看稍微复杂点的url规则:\r\n<pre lang="python">\r\n(r''^user/(?P<username>w+)/$'', ''pastesite.pastebin.views.user''),\r\n</pre>\r\n在这个规则里, http://localhost:8000/user/kingheaven/会找到user这个方法, 并把kingheaven传给变量username, 这样, 在user这个方法里, 就可以使用username这个变量了, user方法的定义必须是这样的, def user(request, username).\r\n实际上, 通过url往view里传参数, 还有另外一种方式, 看下面的url规则:\r\n<pre lang="python">\r\n(r''^articles/(d{4})/(d{2})/(d+)/$'', ''news.views.article_detail''),\r\n</pre>\r\n在这个url规则里, 地址http://localhost:8000/articles/2009/10/1912/会把2009, 10和1912按照顺序传递给article_detail方法, article_detail方法的定义如下, def article_detail(request, year, month, article_id), 这样就够了, 怎么样, 也很简单吧.\r\n<strong>导入其它的url规则</strong>\r\nDjango允许你导入另外一个url文件, 来使你的app更加独立. 每个app都是用自己的urls配置文件, 然后在整站的urls配置一下, 使所有app的urls全部生效, 看下面的规则:\r\n<pre lang="python">\r\n(r''^paste/'', include(''pastesite.pastebin.urls'')),\r\n</pre>\r\n这样, 所有paste/开头的请求, 都会转到pastesite/pastebin/urls.py去找到合适的url去匹配了.\r\n\r\n2.逆转URL\r\n这里借用了逆转裁判的名字, 哈哈. Django的url机制包括了一个url的方向机制, 只要我们定制了一条url的规则, 就可以根据这个规则, 根据view方法的名字, 反向推回一个url.\r\n比如在model里, 我们定义一个get_absolute_url方法, 如下:\r\n<pre lang="python">\r\n @permalink\r\n def get_absolute_url(self):\r\n return (''pastesite.pastebin.views.show'', None,\r\n {''paste_id'': self.id})\r\n</pre>\r\n使用@permalink这个修饰器以后, return里可以写上url中对应的view方法的名字, 这样, get_absolute_url将会去urls.py里查找该view对应的url规则, 并生成该url, 同时, 可以传递该url需要的参数过去. 听上去有一些复杂, 让我们看一下刚才那个方法对应的url规则:\r\n<pre lang="python">\r\nurlpatterns = patterns(''pastesite.pastebin.views'',\r\n (r''^(?P<paste_id>d+)/$'', ''show''),\r\n)\r\n</pre>\r\n不知道大家看明白了吗, 通过这条url, 可以找到这个view; 通过get_absolute_url, 可以生成对应这个url规则的url. 也就是说, 你只需要改一处url的设置, 就可以使我们的url变化, 而不需要去程序去满足这个改变, 非常的方便.', 1, '2009-10-25 23:23:41', '2009-10-25 23:23:41', 0, 1, 'test'),
(56, 'Gentoo中使用英文locale+中文输入法(Fcitx)', '很多人都喜欢英文的系统, 但是又希望能够打中文, 于是便有了以下的方法, 哈哈\r\n\r\n首先修改/etc/env.d/02locale文件, 没有就创建, 改后内容如下:\r\n<pre lang="bash">\r\nLANG="en_US.UTF-8"\r\nLC_CTYPE="zh_CN.UTF-8"\r\n</pre>\r\n然后修改.xinitrc文件, 没有则创建, 改后内容如下:\r\n<pre lang="bash">\r\nexport LC_CTYPE=zh_CN.UTF-8 #貌似这一行可以不写, 因为locale中有设定\r\nexport GTK_IM_MODULE=xim\r\nexport XMODIFIERS=@im=fcitx\r\nfcitx &\r\n</pre>\r\n第三步很关键, 运行env-update && source /etc/profile, 哈哈, 很简单吧, 然后重新登录Gnome即可(不需要重启), 注意选择默认语言为英文.\r\n\r\n这里解释一个地方, 02locale中, LANG变量决定了系统使用的语言和编码, 而Fcitx输入法必须工作在zh_CN的LC_CTYPE下, 所以要设定LC_CTYPE="zh_CN.UTF-8", LC_CTYPE的意思是用什么来处理文字编码.', 1, '2009-11-05 15:52:34', '2009-11-05 15:52:34', 0, 0, 'test'),
(57, '使用lxml解析HTML', 'python下解析HTML的类库有很多, 经过我几天的尝试, 发现lxml是效率最高, 也是处理unicode最好的类库了.\r\n如果你也是用Gentoo的话, 那么使用emerge -av lxml就可以安装lxml了. lxml是依赖于libxml2的, 所以这个包必须是以装的. 一般linux上, 默认都已经装了这个库, 装之前看一眼就行了.\r\n<!--more-->\r\n解析HTML, 一般通过string的形式导入进去, 然后用html parser来解析, 看一下代码:\r\n<pre lang="python">\r\nimport lxml.html as H\r\nimport urllib2\r\n\r\npage = urllib2.urlopen("http://news.163.com/")\r\ndoc = H.document_fromstring("".join([i.strip(''\n\r'').rstrip().lstrip() for i in page.readlines()])) #这么做的目的是去掉多余的空格和换行\r\n\r\nprint H.tostring(doc) #可以看一下我们解析出来的东西, 内容是unicode编码的\r\n</pre>\r\n\r\n通过HTML parser解析的html节点, 一般有以下的方法:\r\n<ul>\r\n <li>find_class(class_name): 按照class的名字找节点, 结果是一个list, 没有则为空list</li>\r\n <li>get_element_by_id(id, default=None): 按照id的名字找节点, 结果是对象, 没有则为None</li>\r\n</ul>\r\n\r\n', 1, '2009-11-06 16:52:48', '2009-11-06 16:52:48', 0, 0, 'test'),
(58, '最近家中断网, 博客更新速度变慢', '最近家中断网了, 把我郁闷的啊, 家里又没有电视, 真是没地方打发时间.\r\n\r\n博客更新的速度也变慢了, 上班还有上班的事, 没有时间发博客. 现在就等搬进新房子了, 第一件事就是开通宽带, 哈哈, 咱搞IT的, 不能没有网络!', 1, '2009-11-06 17:03:35', '2009-11-06 17:03:35', 0, 1, 'test'),
(59, '最近真是烦心事情多啊', '最近真的很多烦心事, 房子在装修, 每周都要去看一下, 周末没有时间休息.\r\n\r\n房东实在可恶, 下定决心要换房子, 找个可以住2-3个月的即可.\r\n\r\n空间不支持Python, 需要找一个支持Python的空间或者VPS. Kangzj, 我就靠你找了~嘿嘿\r\n\r\n希望这些事情能在近期搞定.\r\n\r\nP.S. 最近买了个魔方, 可以慢慢磨练我的耐性了, 经过2天的锻炼, 已经可以完美的拼好一面了, 汗, 目前就这水平..正在努力提高中!', 1, '2009-11-09 11:45:15', '2009-11-09 11:45:15', 0, 2, 'test'),
(60, 'web.py代码结构', '最近用上了web.py, 这个东西实在灵活, 它提供的只是基本的东西, 想要扩展, 那就自己动手, 你想让它变成什么样, 都可以. 嘿嘿, 适合偏执狂使用. \r\n\r\n用了近一天的web.py, 对它有了个大概的了解, 现就我理解的web.py, 说说我的程序是如何设计结构的. \r\n\r\n首先是一个code.py文件, 里面放上程序的入口代码, 比如: \r\n\r\n #!/usr/bin/python \r\n #-*-coding:utf-8-*-\r\n\r\n import web\r\n\r\n urls = (\r\n ''/$'', ''index'',\r\n ''/register/$'', ''register'',\r\n ''/login/$'', ''login'',\r\n ''/logout/$'', ''logout'',\r\n )\r\n\r\n app = web.application(urls, globals())\r\n render = web.template.render(''templates/'', base = ''layout'', globals = {''session'':session})\r\n db = web.database(dbn="mysql", db="qingbao", user="root", pw="root")\r\n\r\n if __name__ == "__main__":\r\n app.run()\r\n\r\n这是一个web.py程序运行所必须的代码了, 也是最基础的代码了, 这里面了定义了一个app, 一个render和一个db, 如果需要session, 也可以把session写在这里. \r\n\r\n在我们的程序中, 可能会用到一些配置属性, 可以把它们都放进settings.py里, 然后在code.py里导入, 这样会让入口文件近可能的精简, 也易于阅读. 其实也可以考虑把app, render等属性放入到settings.py里, 方便管理和修改. 我的目的就是, 做到代码的分类, 改哪个部分的代码, 找哪个文件就可以了. \r\n\r\n在接下来的使用中, 我们也会发现我们会需要很多的form, 这时, 就可以使用一个forms.py来把form都放在里面, code.py里导入这些form即可, 比如说, 我的forms.py文件里有2个form: \r\n\r\n #!/usr/bin/python \r\n #--coding:utf-8--\r\n\r\n import web\r\n from web import form\r\n\r\n password_validate = form.regexp(r".{6,15}$", u"请输入6-15位的密码")\r\n email_validate = form.regexp(r".*@.*", u"请输入合法的email地址")\r\n\r\n register_form = form.Form(\r\n form.Textbox("email", email_validate, description=u"Email地址"), \r\n form.Password("password", password_validate, description=u"密码"),\r\n form.Password("password_confirm", description=u"密码确认"),\r\n form.Button("submit", type="submit", description=u"注册"),\r\n validators = [\r\n form.Validator("密码必须相同", lambda i: i.password == i.password_confirm)\r\n ]\r\n )\r\n\r\n login_form = form.Form(\r\n form.Textbox("email", email_validate, description=u"Email地址"),\r\n form.Password("password", password_validate, description=u"密码"),\r\n form.Button("submit", type="submit", description=u"登录"),\r\n )\r\n\r\n这样, 我在code.py里, 只要一句from forms import register_form, login_form就可以把我的form到导入进来了(这里尽量别用*, 因为其实我们并不需要forms.py里的validate变量, :-) )\r\n', 2, '2009-11-10 18:03:58', '2010-02-26 16:27:20', 5, 7, 'webpy-structure'),
(61, '我的Linux系统之伤', '使用linux已经有1年之久了, 期间换过很多发行版. 每个人都有自己的linux路线, 我的路线是, Redhat->Ubuntu->Debian->Suse(装了后没怎么用就删了)->Fedora(使用时间没超过一周)->CentOS(只能算尝试)->ArchLinux->Gentoo, 这个路线比较曲折.\r\n\r\n其中比较钟意的有Debian, Arch和Gentoo, 目前使用的是Gentoo. 对我来说, Debian足够稳定, 但是软件包比较老, Arch足够新, 但是又没Gentoo的portage灵活, Gentoo又新又灵活, 但是不厌其烦的升级+编译, 也让我开始有一些厌倦了.\r\n<!--more-->\r\n前两天看上了Sabayon, 感觉还不错, 今天试用了下, 非常的失望, 简直就是Gentoo里的Ubuntu啊, 安装程序本身就有bug, 点掉的东西依然会装上, 选择了xfce, 装上的却是Gnome, 中文支持也有很严重的问题, 字高矮不齐, 应该是字体选择的问题. 进入系统后, 由于Sabayon的源非常少, 所以只能用它的官方源, 在意大利, 速度只有30K上下, 实在不能忍受. Sabayon的包管理系统是Entropy, 也是由python写的, 工作原理与Portage相似, 只是Entropy安装的载体是二进制包, Portage是源码. 但是Entropy有个致命的弱点, 就是它的更新不支持断点续传, 如果你在更新到99%的时候掉线了, 或者由于任何原因断掉的话, 下一次的更新将是从头开始!!!这让人不能接受!!!\r\n\r\n其实Sabayon的本意也许是好的, 给想使用Gentoo, 又嫌编译麻烦的人, 创造一个接触Gentoo的好机会, 但是无奈现在它们的团队还不够成熟, 作出来的发行版离Ubuntu还相差甚远.\r\n\r\n其实, 我所说的这些, 总结成一句话就是, 我已经不知道该选择哪个linux了. Gentoo的portage系统很优秀, USE也很灵活, 让我爱不释手, 但是不停的编译让我有些许厌倦. Arch的包很新, 但是无奈软件仓库没有Gentoo大, aur又不能自定义USE来编译, 让人想爱又爱不起来. 唉, 无奈我已经习惯Gentoo的各种命令和各种配置文件的存放位置了, 看来习惯真的是很改掉的.\r\n\r\nP.S. 个人对几大Linux的试用总结:\r\n<strong>1.Debian</strong>\r\n一个非常优秀的Linux版本, 看看它的衍生版数量就知道它的优秀了. 强大的apt系统构建起了一个强大的Debian. 但是无奈Debian的发行版周期比较长, 软件包更新的速度也比较慢.\r\n<strong>2.Ubuntu</strong>\r\n非常适合新手的一个Linux版本, 简单易用. Ubuntu自带了太多的软件包和特效, 使得Ubuntu运行起来比其它的Linux都要慢一些, 所需要的配置甚至比Windows还要高, 让人有些望而止步.\r\n<strong>3.Fedora</strong>\r\n来自Linux世家的redhat, 继承了优良的血统, 拥有4大软件包管理系统之一的rpm包管理系统--yum, 另外三个分别是, Debian的apt, Arch的pacman和Gentoo的portage. 可惜Fedora只是redhat的一个试验田, 从来没有什么革命性的创新能够吸引所有人的眼球, 始终被Ubuntu打压着.\r\n<strong>4.Archlinux</strong>\r\n构建于LFS的Linux系统, 拥有良好的结构设计, 和FreeBSD一样, 系统级的配置都放在一个文件里, 方便修改. 同时拥有优秀的包管理系统pacman, 和KISS理念, 使得Arch慢慢成为Linux爱好者的最爱. 高定制性是Arch一直以来的卖点, 软件包的更新速度也让其它发行版汗颜. 没有版本的概念, 升级系统是无缝的, 可以从任何一个版本平稳升级到最新版.\r\n<strong>5.Gentoo</strong>\r\n高手的最爱, Geek的最爱. Gentoo的高定制性让所有使用者为之疯狂, 不同的USE可以打造出完全不同的Linux. 基于src的系统使得Gentoo可以永远使用最新的软件包, 但是无休止的编译也使得Gentoo被处于浪费资源和不环保的争辩中. 但是不得不承认, Portage是Linux界唯一可以和FreeBSD竞争的系统.', 1, '2009-11-19 00:25:18', '2009-11-19 00:25:18', 0, 9, 'test'),
(62, 'Gentoo下安装VirtualBox', '使用Portage安装有一点点麻烦, 需要设置一下modules和用户组, 让我们开始吧.\r\n\r\n<!--more-->\r\n\r\n<strong>第一步:</strong>\r\n<pre lang="bash">\r\nemerge virtualbox-bin\r\n</pre>\r\n这个包编译起来时间会很长, 使用binary就可以了.\r\n\r\n<strong>第二步:</strong>\r\n<pre lang="bash">\r\ngpasswd -a <USERNAME> vboxusers\r\n</pre>\r\n将自己加入vboxusers组\r\n\r\n<strong>第三步:</strong>\r\n重新登录, 嘎嘎, 这步最简单\r\n\r\n<strong>第四步:</strong>\r\n<pre lang="bash">\r\nmodprobe vboxdrv\r\n</pre>\r\n加载VirtualBox的module\r\n\r\n<strong>第五步:</strong>\r\n<pre lang="bash">\r\necho ''modules="${modules} vboxdrv"'' >> /etc/conf.d/modules\r\n</pre>\r\n这步是关键, 因为谁也不想每次启动后都手动加载vboxdrv, 对吧.\r\n\r\n现在, 开始享受你的VirtualBox吧, 哈哈.', 1, '2009-11-26 01:08:52', '2009-11-26 01:08:52', 0, 0, 'test'),
(63, '大卫粘贴使用量突破100!', '十一前后的时候, 我做了一个简单的代码粘贴网, 功能比较简单, 但是速度还是比较快的, 主流的语言也都支持了.\r\n\r\n现在上线已经有一个月了, 使用量终于突破100了!\r\n第101贴是: <a href="http://paste.david.me/paste/101/">http://paste.david.me/paste/101/</a>\r\n\r\n纪念一下!\r\n这里继续做广告, 如果你有一些代码需要给别人展示, 真的要考虑大卫粘贴, 又简单又好用, 访问地址 - <a href="http://paste.davidx.me">http://paste.davidx.me/</a>\r\n\r\nP.S. 现在上线的是大卫粘贴 0.2beta版, 0.3beta已经提上日程了, 无奈最近工作有些许忙, 透露一下, 0.3beta将采用web.py框架.', 2, '2009-11-27 00:40:58', '2010-02-08 17:08:56', 9, 4, 'david-paste-has-100-pastes'),
(64, '换上了iBus(修改)', '一直听朋友iBus输入法非常好, 但是我都坚持使用fcitx, 因为它实在太轻巧了。这两天上wave, 奇怪的事情发生了,用fcitx根本打不出完整的句子来, 总是重复输入我打的东西, 让我很是郁闷,于是决定换iBus。\r\n\r\n安装步骤一共有3步:\r\n第一步安装ibus\r\n<pre lang="bash">emerge ibus ibus-pinyin ibus-table ibus-table-wubi #我拼音和五笔都用</pre>\r\n第二步运行ibus-setup配置iBus\r\n<pre lang="bash">ibus-setup</pre>\r\n配置好以后,在.bashrc里加入如下的代码:\r\n<pre lang="bash">export GTK_IM_MODULE="xim"\r\nexport QT_IM_MODULE="xim"\r\nexport XMODIFIERS="@im=ibus"</pre>\r\n第三步是将iBus加入到开机启动程序中,命令为\r\n<pre lang="bash">ibus-daemon -d -x</pre>\r\n三步都完成了以后, 重新登录即可。如果重新登录后, 发现ibus的图标没有,可是使用下面的命令重新构建gtk的图标缓存:\r\n<pre lang="bash">gtk-update-icon-cache /usr/share/icons/hicolor/</pre>\r\nEnjoy iBus!\r\n\r\n<span style="color: #ff0000;">P.S. wave里不能输入整句的原因是使用chrome浏览器, 不是输入法的问题, 而且用了一段时间后, 发现iBus的反应速度没有fcitx快, 我又换回去了.</span>', 4, '2009-11-27 13:06:36', '2010-02-08 17:07:49', 12, 6, 'change-to-ibus-modified'),
(65, 'VIM配置文件', '以前把自己的配置文件发出来过, 博客迁移过以后, 文章找不着了, 现在重新发一次.\r\n\r\n<pre lang="conf" lang="1">\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" Created by David Shieh\r\n" E-mail : mykingheaven@gmail.com\r\n" blog : kingheaven.alwaysdata.net\r\n"\r\n" CreatedTime:2009-02-06 14:03\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 全局配置\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"关掉兼容模式\r\nset nocompatible\r\n\r\n"设置历史记录步数\r\nset history=400\r\n\r\n"开启文件类型判断插件\r\nfiletype plugin on\r\nfiletype indent on\r\n\r\n"当文件在外部被修改,自动更新该文件\r\nset autoread\r\n\r\n"激活鼠标的使用\r\nset mouse=a\r\n\r\n"设置'',''为leader快捷键\r\nlet mapleader = ","\r\nlet g:mapleader = ","\r\n\r\n"设置快速保存和退出\r\n"快速保存为,s\r\n"快速退出(保存)为,w\r\n"快速退出(不保存)为,q\r\nnmap <leader>s :w!<cr>\r\nnmap <leader>w :wq!<cr>\r\nnmap <leader>q :q!<cr>\r\n\r\n"设置快捷键为win方式的快捷键\r\nsource $VIMRUNTIME/mswin.vim\r\nbehave mswin\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 字体和颜色\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"开启语法\r\nsyntax enable\r\n\r\n"设置字体\r\nset guifont=dejaVu Sans MONO 10\r\n\r\n"设置配色\r\ncolorscheme desert\r\n\r\n"高亮显示当前行\r\nset cursorline\r\nhi cursorline guibg=#222222\r\nhi CursorColumn guibg=#333333\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 文件和备份 \r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"关闭自动备份\r\nset nobackup\r\nset nowb\r\n\r\n"关闭交换文件\r\nset noswapfile\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 折叠\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"开启折叠\r\nset nofen\r\nset fdl=0\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 文字处理\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"使用空格来替换tab\r\nset expandtab\r\n"设置所有的tab和缩进为4个空格\r\nset tabstop=4\r\nset shiftwidth=4\r\nset softtabstop=4\r\nset smarttab\r\n"不要在单词中断行\r\nset lbr\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 缩进\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"自动缩进(继承前一行的缩进)\r\nset ai\r\n\r\n"智能缩进\r\nset si\r\n\r\n"自动换行\r\nset wrap\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => Vim 界面\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"Turn on WiLd menu\r\nset wildmenu\r\n\r\n"显示标尺\r\nset ruler\r\n\r\n"设置命令行的高度\r\nset cmdheight=1\r\n\r\n"显示行数\r\nset nu\r\n\r\n"Do not redraw, when running macros.. lazyredraw\r\nset lz\r\n\r\n"设置退格\r\nset backspace=eol,start,indent\r\n\r\n"Bbackspace and cursor keys wrap to\r\nset whichwrap+=<,>,h,l\r\n\r\n"Set magic on\r\nset magic\r\n\r\n"关闭遇到错误时的声音提示\r\nset noerrorbells\r\nset novisualbell\r\n\r\n"显示匹配的括号([{和}])\r\nset showmatch\r\n\r\n"How many tenths of a second to blink\r\nset mat=2\r\n\r\n"高亮显示搜索的内容\r\nset hlsearch\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 编码设置 \r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"设置编码\r\nset encoding=utf-8\r\n"设置文件编码\r\nset fileencodings=utf-8\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => NerdTree 插件\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"设置NerdTree的快捷键为F10\r\nmap <F10> :NERDTreeToggle<CR>\r\n\r\n""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 状态栏的设置\r\n""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"开启状态栏\r\nset laststatus=2\r\n\r\n"显示当前目录的函数\r\nfunction! CurDir()\r\n let curdir = substitute(getcwd(), ''/Users/amir/'', "~/", "g")\r\n return curdir\r\nendfunction\r\n\r\n"设置状态栏的信息\r\nset statusline= %F%m%r%h %w CWD: %r%{CurDir()}%h Line: %l/%L:%c\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => Tag list (ctags)\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"不同时显示多个文件的tag,只显示当前文件的\r\nlet Tlist_Show_One_File = 1\r\n"如果taglist窗口是最后一个窗口,则退出vim\r\nlet Tlist_Exit_OnlyWindow = 1\r\n"在右侧窗口中显示taglist窗口\r\nlet Tlist_Use_Right_Window = 1\r\n\r\n"设置TagList的快捷键为F9\r\nmap <F9> :TlistToggle<CR>\r\nmap <leader>tag :TlistToggle<CR>\r\n\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n" => 标签控制\r\n"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\r\n"设置标签的快捷键\r\nmap <leader>te :tabedit\r\nmap <leader>tc :tabclose<cr>\r\nmap <leader>tm :tabmove\r\nmap <leader>tl :bn<cr>\r\nmap <leader>tr :bp<cr>\r\n</pre>', 5, '2009-12-01 11:03:26', '2010-02-08 17:04:52', 11, 0, 'vim-configuration'),
(66, '新版david-blog测试中', '花了两天的时间, 用web.py写了一个博客, 目前已经可以展示了, 访问地址是:\r\n<a href="http://blog.davidshieh.cn/" target="_blank">http://blog.davidshieh.cn/</a>.\r\n\r\n这几天我会继续开发, 争取把功能做的完善一些, 目前已经完成的功能有:\r\n1. 日志列表(首页)\r\n2. 日志分类\r\n3. 日志标签\r\n4. 查看留言\r\n5. 提交留言\r\n\r\n<!--more-->\r\n剩下的功能有:\r\n1. <span style="color: #ff0000;"><del datetime="2009-12-05T16:18:46+00:00">制作日志的rss (12月6日完成)</del></span>\r\n2. 继续美化页面\r\n3. <span style="color: #ff0000;"><del datetime="2009-12-05T16:18:46+00:00">应用缓存 (12月5日完成)</del></span>\r\n4. 给提交留言加上captcha验证码\r\n5. 后台添加发送邮件的功能(这个可以放到最后做)\r\n6. <span style="color: #ff0000;"><del datetime="2009-12-05T16:18:46+00:00">代码优化, 完善代码的结构(代码分类, 配置分离) (12月5日完成)</del></span>\r\n\r\n现在使用的版本, 给它定的版本号为0.1alpha, 当上面的功能基本完善了后, 版本将升级为0.2beta, 使用单数alpha, 双数beta的版本控制规则.\r\n\r\n<span style="color: #ff6600;">P.S. 如果要求的人比较多的话, 我可以把程序开源, 放在google code上.</span>', 1, '2009-12-04 15:03:44', '2009-12-04 15:03:44', 0, 0, 'test'),
(67, 'CentOS 下安装Memcached', '租的VPS没有memcached, 自然要自己安装了. 郁闷的是, CentOS里还没有memcached的包, 我又只好自己编译安装了.\r\n\r\n安装memcached, 首先要升级系统里的libevent, 一般都是用yum先把它删掉, 然后自己编译新的, 我没有删掉它, 直接装了新的.\r\n下载地址:\r\n<a href="http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz">http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz</a>\r\n这里用的是1.4.13的稳定版, 安装完成后, 使用\r\nln -s /usr/local/lib/libevent.1.4.so.2 /usr/lib\r\n在/usr/lib里创建新版libevent的软链接\r\n<!--more-->\r\n下面可以安装memcached了, 下载地址为:\r\n<a href="http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz">http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz</a>\r\n安装完成后, 使用\r\nln -s /usr/local/bin/memcached /usr/bin\r\n创建memcached的链接\r\n\r\n要让memcache开机即启动, 则需要将memcached里的scripts/memcached.sysv拷贝到/etc/init.d/里并改名为memcached\r\n然后使用/etc/init.d/memcached start即可启动memcache服务.\r\n', 7, '2009-12-04 17:52:59', '2010-02-08 17:04:29', 4, 0, 'install-memcached-on-centos'),
(68, 'Python-Memcached轻松使用', '安装完python-memcache后, 我们可以轻松的使用它来加速我们的程序了.只需要两步就可以完成操作, 嘿嘿.\r\n\r\n第一步是连接到我们的memcached服务器:\r\n<pre lang="python">\r\nimport memcache\r\nmc = memcache.Client([''127.0.0.1:11211''], debug=0)\r\n</pre>\r\n<!--more-->\r\n第二步就是调用API了:\r\n<pre lang="python">\r\nmc.set(''KEY_NAME'', ''VALUE'', 60) #添加一个数据进memcached, 并设置超时时间为60秒\r\nmc.get(''KEY_NAME'') #取出我们的数据, 如果数据不存在或者已经超时, 则值为None\r\nmc.delete(''KEY_NAME'') #将值从memcached中删除\r\n</pre>\r\n\r\n怎么样, 够简单吧, 尽情享受memcache带来的高性能吧!\r\n\r\n参考文档:\r\n1. <a href="http://oursimplehouse.blog.sohu.com/63588732.html">http://oursimplehouse.blog.sohu.com/63588732.html</a>\r\n2. <a href="http://www.tummy.com/Community/software/python-memcached/">http://www.tummy.com/Community/software/python-memcached/</a>', 2, '2009-12-04 18:03:26', '2010-02-08 17:03:57', 3, 0, 'python-memcached'),
(69, '自己制作RSS 2.0', '最近给我的David-Blog添加了RSS功能, 以后大家可以订阅我的博客了, 不过鉴于David-Blog还没有完全制作好, 想订阅的人可以先等一等了. 今天就讲一下自己制作RSS的过程.\r\n\r\n首先要知道, RSS没有想像的复杂, 它只是一个符合一定规则的XML文档, 只要遵循RSS2.0的规范, 创建一个RSS是非常简单的事情.\r\n\r\n下面我们来一步一步创建RSS文档:\r\n\r\n1. 创建一个xml文件\r\n \r\n <pre lang="xml">\r\n <?xml version="1.0" encoding="utf-8" ?>\r\n </pre>\r\n\r\n2. 声明这是一个rss文档, 并且符合2.0规范\r\n<pre lang="xml">\r\n<rss version="2.0">\r\n<channel>\r\n</pre>\r\n\r\n3. 写如自己的channel信息\r\n<pre lang="xml">\r\n<title>The title of my RSS 2.0 Feed</title> #channel的名字\r\n<link>http://www.example.com/</link> #channel的地址\r\n<description>This is my rss 2 feed description</description> #channel的描述\r\n<lastBuildDate>Mon, 12 Sep 2005 18:37:00 GMT</lastBuildDate> #最后一次更新该rss的时间, 注意, 时间格式一定要是这样的, 这是符合RFC 822规范的\r\n<language>zh-cn</language> #rss的语言, 中国人, 就写zh-cn啦\r\n</pre>\r\n\r\n4. 添加自己的item信息\r\n<pre lang="xml">\r\n<item>\r\n<title>Title of an item</title> #item的标题\r\n<link>http://example.com/item/123</link> #该item的地址\r\n<guid>http://example.com/item/123</guid> #这个不知道是什么, 总之填地址就对啦\r\n<pubDate>Mon, 12 Sep 2005 18:37:00 GMT</pubDate> #发布的日期, 同样要符合RFC 822规范\r\n<description>[CDATA[ This is the description. ]]</description> #该item的描述, 可以写入item的正文, 也可以写一部分\r\n</item> #多条item的时候, 循环添加就可以了\r\n</pre>\r\n\r\n5. 给RSS写一个结尾\r\n<pre lang="xml">\r\n</channel>\r\n</rss>\r\n</pre>\r\n\r\n完成上面的步骤, 一个RSS文件就创建完成了. 如果使用web.py的话, 可以把该格式写进一个xml文件中, 然后使用render来渲染一下就OK了.\r\n例子:\r\n<pre lang="python">\r\nweb.header(''Content-Type'', ''text/xml'') #注意, 指定header是必须的\r\nreturn render.index(code)\r\n</pre>\r\n\r\n这样, 一个完整的RSS2.0就创建完成了! Enjoy it~!\r\n\r\n参考文章:\r\n1. <a href="http://www.petefreitag.com/item/465.cfm">Howto Create an RSS 2.0 Feed</a>', 2, '2009-12-06 23:46:02', '2010-02-08 17:09:53', 7, 0, 'create-rss-2.0'),
(70, '新博客已经基本完成~本周将完成迁移', '如题, 新的博客已经制作差不多了, 欢迎大家访问\r\n<a href="http://blog.davidshieh.cn/">新博客</a>\r\n\r\n这个周就会完成迁移, 然后http://davidshieh.cn/将会跳转到新博客上, 欢迎大家一如既往的支持本人~', 1, '2009-12-10 01:18:38', '2009-12-10 01:18:38', 0, 2, 'test'),
(71, '杂谈', '最近忙于项目, 又没怎么写blog, 汇报下最近的进展好了.\r\n\r\n1.davidblog已经写的差不多了, 后台admin也完成了80%了, 等这2天事忙完了, 就正式切换过来\r\n2.davidpaste已经建项目了, 这次开发的是0.3alpha, 使用全新的架构, 不知道web.py+jinja2+SQLObject这样的组合如何\r\n\r\n以前, 都是问, 你使用的哪个版本的linux, 现在, 都是问, 2.6.32出了, 你用了没? 不知道这样的转变算不算技术水平的提升, 哈哈. 这让我想起同学的一句话, 前段时间同学来我这, 看我在linux里跑虚拟机, 里面跑windows, 说, NB啊, 原来都是虚拟机玩linux, 你这可好, 虚拟机里玩windows. 是啊, 最近的工作和生活都已经在linux下了, 只有需要娱乐的时候才会想到windows, 看看网络, 打打游戏, 上上QQ啥的.\r\n\r\n近期对davidblog做了一点架构上的改变, 觉得还是有必要记录下来的, 抽个空写篇日志. 现在就期待abitno的blog了, 哈哈. 到时候比比ror和web.py到底哪个做的好, 希望web.py不要输给ror, 不过论开发速度, web.py已经领先了.', 1, '2009-12-15 13:39:46', '2010-02-08 16:52:33', 6, 2, 'some-things');
INSERT INTO `entries` (`id`, `title`, `content`, `categoryId`, `createdTime`, `modifiedTime`, `viewNum`, `commentNum`, `slug`) VALUES
(72, '买了新的域名', '最近还是比较忙, david-blog程序更新的速度变慢了, 都没什么时间弄, 就是这样, 还是每天晚上1点多才能睡觉, 真不知道时间都干吗去了, 为什么不给我剩点?!\r\n\r\n现在个人不能注册.cn域名了, 我只好出去买国际域名了. 经过精挑细选, 已经把域名定在davidx上了, 于是去买.com的, 结果发现早就被人买了. 退而求其次, 买.net吧, 又觉得不好. 居然去买了davidlife.com, 我那个窘啊, 一个晚上就后悔了, 今天痛下决心, 买了davidx.me的, 花费$8.99, 心疼啊. 昨天买的davidlife.com才$1.99. (顺便做个小广告, kangzj的blog推荐有yahoo的域名注册, 第一年是$1.99, 非常之便宜, 续费比较贵, 没关系, 到期钱转出即可.) 其实出了这2个域名, 我还买了一个davidpaste.com, 这个域名还是比较成功的, 等我把david-blog弄好了, 就去更新david-paste, 然后就启动新域名, 还是.com的国际域名好!', 1, '2009-12-17 01:37:20', '2010-02-08 16:52:13', 9, 3, 'baught-new-domains'),
(73, 'Nginx+flup+spawn-fcgi部署web.py', '最近迷上了web.py, 哈哈, 拿它做了几个小东西, 话说这个东西真的非常好, 任何python的东西, 都可以非常轻松的和它结合起来. 一开始部署的时候, 确实遇到点问题, 经过昨天的一次部署, 彻底把spawn-fcgi部署web.py的方式搞定了.\r\n\r\n下面就来讲一个部署的过程:\r\n1.安装所有必须的软件包:\r\nnginx, spawn-fcgi, flup\r\n3者缺一不可, 尤其是flup, 最容易漏装\r\n2.配置nginx:\r\n<pre lang="conf">\r\nserver {\r\n listen 80;\r\n server_name xxx.xxx;\r\n\r\n access_log /home/icefox/XXX/access.log access;\r\n error_log /home/icefox/XXX/error.log info;\r\n\r\n location ~ ^/static/ {\r\n root /home/icefox/XXX;\r\n }\r\n\r\n location / {\r\n fastcgi_pass 127.0.0.1:8051;\r\n fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;\r\n fastcgi_param PATH_INFO $fastcgi_script_name;\r\n include fastcgi_params;\r\n }\r\n}\r\n</pre>\r\n记住fastcgi_pass的端口号, 进入下一步\r\n3. 使用spawn-fcgi启动fastcgi进程:\r\n<pre lang="bash">\r\nspawn-fcgi -C 5 -a 127.0.0.1 -p 8051 -u <username> -g <groupname> -f /path/to/your/web.py\r\n</pre>\r\n\r\n至此, 我们的web.py已经可以启动了, 部署web.py非常的轻松.', 7, '2009-12-21 16:48:08', '2010-02-08 16:43:08', 18, 4, 'deploy-webpy-with-nginx-flup-spawn-fcgi'),
(74, '近况', '最近事情有些多, 所以给自己不写博客找了个很好的理由. 呵呵, 自己写的blog程序遇到了一点技术问题, 所以可能需要一点时间去解决.\r\n\r\n最近帮公司做一个非常有难度的项目, 呵呵, 难度不是在于某个环节, 而是所有的东西都要我来, 从前台的js, 到后段的php, 到进程端的python, 全是我一个人来做, 确实有点扛不住, 思维的转换让我很难很快适应, 呵呵. 不过现在都做的差不多了, 就剩一点后续工作的处理了, 简单的原型DEMO就出来了.\r\n\r\n目前手里还有2个活, 还好难度都不大, 都可以顺利完成. 接下来需要做的事, 就是写书的事了, 我跟CPyUG社区的人打算写一本关于web.py的书, 不写不知道, 一写吓一跳, 哈哈, 写书不是容易的事, 写好书更不容易!\r\n\r\n最近一直在用web.py, 发现这个东西过于灵活, 以致于掌握不好, 就会迷茫于web.py, 所以必须下点功夫让程序的结构更完美, 呵呵, 努力吧.\r\n\r\n除了web.py, 最近还在看learning python 3rd edition, 嗯, 这本书确实不错, 讲了python的很多特性, 值得好好研究. Python确实是一个非常优秀的语言, 有着优秀的设计. 引用这个东西就比C里面的指针好理解和掌握多了, 而且效率还不低. 比起Java的垃圾回收机制, Python的引用计数机制确实优秀. 以前一直是Python最简单的东西, 现在往深里研究了, 发现很多东西还是得好好看看才能掌握, 这句是废话, 等我有了心得和成果, 一定和大家分享.', 1, '2009-12-29 00:01:39', '2010-02-08 16:41:33', 15, 5, 'recent-situation'),
(75, 'Python中变量的引用', '最近看Learning Python 3rd有些心得, 跟大家分享一下.\r\n\r\n在Python中, 任何变量里存储的数据并不是该数据的值, 而是该数据的引用. \r\n这句话可以了解为, 当你给变量a赋值3的时候, 并不是把3这个值传给变量, 而是把指向3的这个引用传给了a. 接着, 你用a=5给把变量a的值改成了5, 并不是把3改成5, 而是把指向3的引用改成了指向5的引用, 而3这个值仍然可能存在(用了可能, 因为别的变量可能也指向了3).\r\n\r\n这个概念比较抽象, 举几个例子, 大家可能就明白了.\r\n<pre lang="python">\r\na = 3\r\nb = a\r\nprint b #结果是3\r\na = 5\r\nprint b #结果仍然是3\r\n</pre>\r\n执行到b=a的时候, 实际上它们指向的都是同一个地址, 就是数值3所在的内存地址. 所以, 数值和字符串在Python中都是不可更改的数据类型. a=5更改了变量的值, 实际上是更改变量的引用, 原先的b的引用并没有改变.\r\n\r\n对于字符串, 结果是一样的, 但是对于list和dict, 结果就有点不同了.\r\n<pre lang="python">\r\na = [3, 5, 7]\r\nb = a\r\na[0] = 7\r\nprint b #结果是[7,5,7]\r\n</pre>\r\n结果为什么是这样呢, 其实可以这么理解: 当使用a = [3, 5, 7]赋值的时候, Python把[3, 5, 7]这个list的引用传给了a, 而在[3, 5, 7]这个list中, 每个值又都是引用过来, 就是说, 这里的3, 5, 7也不是值, 也是引用. 当使用a[0] = 7改变里面第一个值的引用的时候, 整个list的引用并没有改变, 所以print b的时候, 会看到改变的结果. dict也可以理解的.\r\n\r\n你可能会问, 如果我希望a和b不相干要怎么弄呢? 这里有2种方法:\r\n<pre lang="python">\r\n#第一种方法\r\na = [3, 5, 7]\r\nb = a[:] #相当于对[3, 5, 7]的一个copy了\r\na[0] = 7\r\nprint b #结果是[3, 5, 7]\r\n#第二种方法\r\nimport copy\r\nc = copy.copy(a)\r\na[0] = 7\r\nprint c #结果也是[3, 5, 7]\r\n</pre>\r\nlist可以使用[:]的方式作copy用, 但是dict就必须用copy函数了. copy模块中还有一个deepcopy函数, 作用是深层的copy, 即不论list中嵌套多少层list, 都会传值过去, 而不是引用, 这里给出一个例子.\r\n<pre lang="python">\r\nimport copy\r\na = [3, 6, [2, 6]]\r\nb = copy.copy(a)\r\nc = copy.deepcopy(a)\r\na[2].append(7)\r\nprint b #结果是[3, 6, [2, 6, 7]]\r\nprint c #结果是[3, 6, [2, 6]]\r\n</pre>\r\n\r\nPython中默认的垃圾回收机制是看引用计数才决定是否内存地址的, 当a=3, b=3这样的语句出现的时候, 3的引用计数就是2, 使用了a=4后, 3的引用计数就会减少到2, 当引用计数为0的时候, 这个内存就会自动被Python回收到. 这个机制保证了Python的高效和低内存占用.', 2, '2009-12-29 14:23:51', '2010-02-08 16:40:38', 14, 2, 'python-parameters'),
(76, '新博客上线了', '之前的blog被墙了, 自己就一直在用web.py写新的blog程序, 其间遇到了很多的问题, 也积累了很多web.py的小技巧, 以后会慢慢的放出来供大家参考.\r\n\r\n这次写出来的blog有些仓促, 问题应该也很多, 我已经开始准备下一版了, 目前的版本号我定的是0.3beta, 下一个版本, 由于我想使用sqlalchemy做ORM, 并使用python的一个代码高亮库, 所以会直接跳到1.0版本, 不过开发周期可能会长一点(也因为赶上过年了...).\r\n\r\n现在的blog内容用的是markdown语法, 以后将一直沿用. markdown的优势就是内容与样式的高度分离. 不管以后blog功能怎么更换, 内容不会改变, 只要使用markdown的解析方式, 显示的样式就不会变.', 1, '2010-02-09 09:44:37', '2010-02-09 09:44:37', 27, 2, 'new-blog-arrival'),
(77, '新年新任务', '新的一年其实已经来了, 但是按照中国人的习惯, 农历新年才是新的一年的开始, 所以这次借着新年的来临, 给自己定下几个小目标:\r\n\r\n1. 继续优化davidblog. 这次要做比较大的改动了, 心里已经有想法了, 嘿嘿, 到时大家就知道了\r\n2. 继续开发davidpaste. 前段时间事情多, 最近都快忙完了, 大卫粘贴不能再拖了.\r\n3. 写书. 这是和朋友一起计划的事情, 已经搁置了有段时间了, 不能再拖了.\r\n4. 参与一些开源项目. 这个我也是有想法的了, 得时机成熟了, 就会和大家说了.\r\n\r\n希望新的一年了, 上述目标都可以实现. 祝大家新年快乐!', 1, '2010-02-11 00:44:55', '2010-02-11 00:44:55', 14, 0, 'new-year-with-new-tasks'),
(78, '升级fcitx到3.6.3', 'Fcitx在牛年的最后一天, 升级到了3.6.3, 改变也不少, 但是最大的改变就是, 配置文件的路径.\r\n原先的配置文件路径是~/.fcitx/config, 现在换到了~/.config/fcitx/config, 作者给出的理由是:\r\n\r\n`\r\n 2009-11-29: Jarryson \r\n * 修改配置文件的路径,尽量靠近XDG标准 \r\n`\r\n\r\n我非常同意作者的理由, 但是也请你告知实际路径, 或者默认把以前的配置文件也拷过去啊. 网站上没有任何的提示, 我也是看了changelog才发现的, 而且changelog里也没有给出实际路径, 我是自己猜出来的...\r\n\r\n希望这篇文章能让大家收益吧!', 4, '2010-02-23 22:05:25', '2010-02-24 23:21:19', 45, 5, 'upgrade-fcitx-to-3.6.3'),
(79, '新的Python Shell-DreamPie', '最近发现了一个非常好用Python Shell -- DreamPie, 和大家分享下. \r\n下载地址如下: \r\n<a href="http://dreampie.sourceforge.net/download.html">点击到下载页面</a> \r\n如果你和我一样是在Gentoo下安装的话, 就下载Source Edition, 然后解压, 输入sudo python setup.py install, 非常标准的python类库安装方式. 这些都做完后, DreamPie就安装好了. \r\n输入dreampie或者到菜单里去打开DreamPie都可以启动它, Enjoy!', 2, '2010-02-26 16:10:08', '2010-02-26 16:16:27', 7, 0, 'dreampie-new-python-shell'),
(80, '使用SQL删除某字段重复的记录', '最近有个需求, 就是要删掉记录中, 所有某个字段重复的记录, 比如说, 5条记录的name字段都是david, 则删掉其中任何一个即可. Sql如下: \r\n\r\n #syntax#sql#/syntax#\r\n DELETE a \r\n FROM stores a, \r\n (SELECT * FROM stores GROUP BY name HAVING COUNT(1)>1) AS b \r\n WHERE a.name = b.name AND a.id > b.id;\r\n', 6, '2010-02-26 17:04:13', '2010-02-26 17:04:13', 15, 2, 'how-to-delete-records-with-duplicate-names'),
(81, 'WSGI规范翻译(未完成)', 'Contents \r\n * 摘要 \r\n * 原理和目标 \r\n * 规范预览 \r\n * 程序/框架 端 \r\n * 服务器/网关 端 \r\n * 中间件:在两端都可以用的组件 \r\n * 规范细节 \r\n * 环境变量 \r\n * 输入和错误流 \r\n * start_response()调用 \r\n * 处理Content-Length报头 \r\n * 缓存和流 \r\n * 中间件的处理(Middleware Handling of Block Boundaries) \r\n * write()调用 \r\n * Unicode问题 \r\n * 错误处理 \r\n * HTTP 1.1 捕捉(Expect)/继续 \r\n * 其它的HTTP特性 \r\n * 线程支持 \r\n * 接口(Implementation)/程序 注意 \r\n * 服务器扩展API \r\n * 程序配置 \r\n * URL重建 \r\n * 对2.2以下Python的支持 \r\n * 可选的平台特定的文件处理 \r\n * FAQ \r\n * 提议/讨论中 \r\n * 知识 \r\n * 参考 \r\n * 版权 \r\n\r\n# 摘要 #\r\n\r\n这篇文档描述了一个在WEB服务器端和Python WEB程序或框架间的标准接口, 可以使WEB程序更好的在WEB服务器间移植.\r\n\r\n# 原理和目标 #\r\n\r\nPython现在有一系列的WEB框架, 象Zope, Quixote, Webware, SkunkWeb, PSO和Twisted, 这里只是列举了几个. 这么多的选择对于Python的使用者来说, 是一个问题. 他们的选择对框架的选择会限制他们对服务器的选择, 或者正好相反.\r\n\r\n相比较而言, 尽管Java也有很多的WEB框架可以选择, 但是Java的Servlet API能够让它的程序在任何服务器运行.(翻译的不好, 意思就是只要使用Servlet API来写框架, 就可以在任何服务器上跑)\r\n\r\n这种在WEB服务器中的API的存在和广泛--不管这些服务器是用Python写的(比如说Medusa), 嵌入了Python(比如说mod_python), 又或者把Python当做网关协议(比如说CGI, FastCGI等), 都把框架的选择从服务器的选择中分离出来了, 让用户自行去选择它们中间的搭配, 同时也让框架和服务器的开发者更专注于他们更喜欢的领域.\r\n\r\n这篇规范, 因此, 提出了一个简单的, 同时适用于WEB服务器和WEB程序或框架的通用的接口: Python Web Server Gateway Interface (WSGI).\r\n\r\n但是这个小小的WSGI规范并没有规定现有的服务器的状态或者WEB程序的框架. 服务器和框架的作者和维护者必须支持WSGI.(翻译的不好)\r\n\r\n然而, 由于现有的服务器或框架支持WSGI, 对于要支持WSGI的作者来说, 有点急切. 这样, WSGI必须要很容易实施, 这样, 一个作者的起始调查才会变的低.(我自己也没太明白)\r\n\r\nThus, simplicity of implementation on both the server and framework sides of the interface is absolutely critical to the utility of the WSGI interface, and is therefore the principal criterion for any design decisions.\r\n\r\n注意, 然而, 这种简单性, 对于一个框架的作者来说, 和对于一个框架使用来说, 是不同的. WSGI向框架开发者展示了一个绝对没有虚饰的接口, 因为铃声和口哨象响应对象和cookie处理, 都应该在现有框架的处理上解决. 同样, WSGI的目标是一个服务器和程序, 或者服务器和框架间的简单通信, 而不是一个新的框架.\r\n\r\nNote also that this goal precludes WSGI from requiring anything that is not already available in deployed versions of Python. Therefore, new standard library modules are not proposed or required by this specification, and nothing in WSGI requires a Python version greater than 2.2.2. (It would be a good idea, however, for future versions of Python to include support for this interface in web servers provided by the standard library.)\r\n\r\nIn addition to ease of implementation for existing and future frameworks and servers, it should also be easy to create request preprocessors, response postprocessors, and other WSGI-based "middleware" components that look like an application to their containing server, while acting as a server for their contained applications.\r\n\r\nIf middleware can be both simple and robust, and WSGI is widely available in servers and frameworks, it allows for the possibility of an entirely new kind of Python web application framework: one consisting of loosely-coupled WSGI middleware components. Indeed, existing framework authors may even choose to refactor their frameworks'' existing services to be provided in this way, becoming more like libraries used with WSGI, and less like monolithic frameworks. This would then allow application developers to choose "best-of-breed" components for specific functionality, rather than having to commit to all the pros and cons of a single framework.\r\n\r\nOf course, as of this writing, that day is doubtless quite far off. In the meantime, it is a sufficient short-term goal for WSGI to enable the use of any framework with any server.\r\n\r\nFinally, it should be mentioned that the current version of WSGI does not prescribe any particular mechanism for "deploying" an application for use with a web server or server gateway. At the present time, this is necessarily implementation-defined by the server or gateway. After a sufficient number of servers and frameworks have implemented WSGI to provide field experience with varying deployment requirements, it may make sense to create another PEP, describing a deployment standard for WSGI servers and application frameworks.\r\n\r\n# 规范预览 #\r\n\r\nWSGI接口有两端: 服务器 或者 网关 端, 和 程序 或者 框架 端. 服务器端调用一个可以调用的对象, 这个对象来自程序端. 对于这个对象是自己提供的需求, 取决于服务器或者网关端. 通常认为一些服务器或者网关需要程序的部署者写一小端代码来创建一个服务器或者网关的实例, 同时提供这个程序的对象. 其它的服务器和网关可能使用配置文件或者其它方法来确定这个程序的对象是从哪来的或者怎么得到的.\r\n\r\n对于"纯"服务器/网关和程序/框架来说, 同样也有创建中间件的能力. 这些组件表现的就象它们的服务器一样, 同时可以用于提供扩展的API, 内容转换, 导航和其它功能.\r\n\r\n在这篇规范里, 我们将使用"callable"来表示一个函数,方法,类或者实例, 它必须有一个__call__方法. 这取决于服务器, 网关, 或者实现这个可调用的方法的程序如何选择它们的技术. 相反地, 一个处理"callable"的服务器, 网关, 或者程序不能够对这个"callable"的类型有任何依赖. Callable只能够被调用, 不能够自省.\r\n\r\n## 程序/框架 端 ##\r\n\r\nApplication对象是一个简单的callable对象, 同时能够接收2个参数.\r\n这里的"对象"不能理解成为需要一个实际的"对象"实例: 一个函数, 方法, 类,\r\n或者包含__call__方法的实例都可以认为是一个application对象.\r\nApplication对象必须能够被多次调用, 同时能够被服务器/网关调用多次.\r\n\r\n(注意:尽管我们称它为"application"对象,\r\n但是这不意味着application的开发者就必须使用WSGI作为API!程序开发者继续使用现有的,\r\n高级的框架来开发他们的程序. WSGI只是一个用来开发服务器或者框架的工具,\r\n不是直接开发应用的)\r\n\r\n这里有2个application对象的例子: 一个是函数, 一个是类的:\r\n\r\n #syntax#python#/syntax#\r\n def simple_app(environ, start_response):\r\n """Simplest possible application object"""\r\n status = ''200 OK''\r\n response_headers = [(''Content-type'',''text/plain'')]\r\n start_response(status, response_headers)\r\n return [''Hello world!\\n'']\r\n\r\n\r\n class AppClass:\r\n """Produce the same output, but using a class\r\n\r\n (Note: ''AppClass'' is the "application" here, so calling it\r\n returns an instance of ''AppClass'', which is then the iterable\r\n return value of the "application callable" as required by\r\n the spec.\r\n\r\n If we wanted to use *instances* of ''AppClass'' as application\r\n objects instead, we would have to implement a ''__call__''\r\n method, which would be invoked to execute the application,\r\n and we would need to create an instance for use by the\r\n server or gateway.\r\n """\r\n\r\n def __init__(self, environ, start_response):\r\n self.environ = environ\r\n self.start = start_response\r\n\r\n def __iter__(self):\r\n status = ''200 OK''\r\n response_headers = [(''Content-type'',''text/plain'')]\r\n self.start(status, response_headers)\r\n yield "Hello world!\\n"\r\n\r\n\r\n', 1, '2010-03-04 16:50:14', '2010-03-04 16:50:19', 24, 2, 'python-web-server-gateway-interface-zh_CN');
-- --------------------------------------------------------
--
-- 表的结构 `entry_tag`
--
CREATE TABLE IF NOT EXISTS `entry_tag` (
`entryId` int(11) NOT NULL,
`tagId` int(11) NOT NULL,
KEY `entryId` (`entryId`,`tagId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- 转存表中的数据 `entry_tag`
--
INSERT INTO `entry_tag` (`entryId`, `tagId`) VALUES
(3, 9),
(3, 10),
(4, 7),
(4, 8),
(5, 1),
(5, 6),
(60, 1),
(60, 4),
(63, 1),
(63, 16),
(64, 14),
(64, 15),
(65, 13),
(67, 11),
(67, 12),
(68, 1),
(68, 11),
(69, 1),
(73, 2),
(73, 3),
(73, 4),
(73, 5),
(75, 1),
(76, 17),
(77, 17),
(78, 18),
(79, 1),
(80, 19),
(81, 1);
-- --------------------------------------------------------
--
-- 表的结构 `links`
--
CREATE TABLE IF NOT EXISTS `links` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(70) NOT NULL,
`url` varchar(255) NOT NULL,
`createdTime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
--
-- 转存表中的数据 `links`
--
INSERT INTO `links` (`id`, `name`, `url`, `createdTime`) VALUES
(1, 'web.py官网', 'http://webpy.org/', '2009-12-02 16:26:36'),
(2, 'Python官网', 'http://python.org/', '2009-12-02 16:27:00'),
(3, '新蜂Linux', 'http://xxb.me/', '2009-12-10 01:06:43');
-- --------------------------------------------------------
--
-- 表的结构 `pages`
--
CREATE TABLE IF NOT EXISTS `pages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`slug` varchar(255) NOT NULL,
`content` longtext NOT NULL,
`createdTime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
--
-- 转存表中的数据 `pages`
--
-- --------------------------------------------------------
--
-- 表的结构 `tags`
--
CREATE TABLE IF NOT EXISTS `tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`entryNum` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;
--
-- 转存表中的数据 `tags`
--
INSERT INTO `tags` (`id`, `name`, `entryNum`) VALUES
(1, 'Python', 7),
(2, 'spawn-fcgi', 1),
(3, 'flup', 1),
(4, 'webpy', 2),
(5, 'Nginx', 1),
(6, 'PIL', 1),
(7, 'Apache', 1),
(8, 'virtualhost', 1),
(9, 'PHP', 1),
(10, 'datetime', 1),
(11, 'Memcached', 2),
(12, 'CentOS', 1),
(13, 'Vim', 1),
(14, 'iBus', 1),
(15, 'Gentoo', 1),
(16, 'david-paste', 1),
(19, 'SQL', 1),
(18, 'fcitx', 1);