-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1074 lines (653 loc) · 40.4 KB
/
index.html
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
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>virgil's blog</title>
<meta name="author" content="leehong">
<meta name="description" content="最近很久没有更新博客了,最近学习了很多的东西,本应该记录下来,但是一直觉得自己学习的东西不能够很好的表达出来,就一直放着了. 昨天是北京railsgirl活动,报名参加志愿者.活动归来,有很多的感受和收获.首先呢,作为志愿者,很失职,之前没有很好的准备,之前没有经验,不知道去了之后怎么做,怎么开始 …">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://leehong.github.com/">
<link href="/favicon.png" rel="icon">
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="/javascripts/modernizr-2.0.js"></script>
<script src="/javascripts/ender.js"></script>
<script src="/javascripts/octopress.js" type="text/javascript"></script>
<link href="/atom.xml" rel="alternate" title="virgil's blog" type="application/atom+xml">
<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
<link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-35193226-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body >
<header role="banner"><hgroup>
<h1><a href="/">virgil's blog</a></h1>
<h2>keep it simple and stupid</h2>
</hgroup>
</header>
<nav role="navigation"><ul class="subscription" data-subscription="rss">
<li><a href="/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:leehong.github.com" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul class="main-navigation">
<li><a href="/">首页</a></li>
<li><a href="/blog/archives">文章</a></li>
<li><a href="/about">关于我</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div class="blog-index">
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/12/16/zhou-liu-railsgirlhuo-dong-gan-shou/">周六railsgirl活动感受</a></h1>
<p class="meta">
<time datetime="2012-12-16T20:51:00+08:00" pubdate data-updated="true">Dec 16<span>th</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p>最近很久没有更新博客了,最近学习了很多的东西,本应该记录下来,但是一直觉得自己学习的东西不能够很好的表达出来,就一直放着了.</p>
<p>昨天是北京railsgirl活动,报名参加志愿者.活动归来,有很多的感受和收获.首先呢,作为志愿者,很失职,之前没有很好的准备,之前没有经验,不知道去了之后怎么做,怎么开始.我带的两个girl呢,一点编程经验都没有,一开始我就让开始用rails 开始写项目,但是她们根本不明白怎么回事,为什么需要这样做,这样做的道理是什么,然后哦我拼命的给她们介绍,但我发现我根本解释不清楚.后来我就不断的找相关资料进行解释,但她们还是不明白.这里面有几个问题,一是我没有很好的准备;二是我基础不够扎实,很多基础性的东西解释不清楚;三是语音组织性差.都是我的问题,所以很自责,很愧疚,对不起两个girl,以至于现在自己都很失落,很内疚.希望以后能够帮助到她们.还有加强自己的不足.</p>
<p>活动结束之后,peter 林生 邱亮 还有一个忘记叫什么了,一起吃饭,除了我和林生,他们都是有过退学经历的人,但是他们的现在都过的很好,很happy,精神上的知足.然后就谈到现在ruby社区问题,我们都是使用ruby工作,我们有义务和责任在国内推广ruby,让更多的人使用ruby,了解ruby,发展ruby.聊天的内容还有有分享/兴趣/生活观念/还有社会观念,收获很多,这是精神上的收获,人格上的升华.从他们的精神状态和生活的经历传递给我很多的正能量,很幸愿能够认识他们.</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/11/17/guan-yu-rake/">Rake介绍</a></h1>
<p class="meta">
<time datetime="2012-11-17T00:33:00+08:00" pubdate data-updated="true">Nov 17<span>th</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p>rake是一个用ruby开发的代码构建工具,以任务的方式创建和运行脚本.非常非常的有用,在我们项目中需要不同环境切换等等,用rake来管理大大提高效率.
<a href="http://docs.rubyrake.org/user_guide/index.html">rake用户手册</a></p>
<p>就用一些小demo来学习吧,动手是最好最有用的方式,再简单的demo也要动手去做,let’s go.首先在项目目录下新建一个Rakefiles文件.然后添加如下代码:</p>
<pre><code> desc "describe you rake task"
task :one do
p "first task"
end
</code></pre>
<p> 然后用rake one 命令,就看到你想要看到的结果了,这里task是Rake最重要的方法。它的方法定义是:task(args, &block)。任务体是一个block.</p>
<p> 依赖关系:在一个task执行之前,需要其它的task执行</p>
<pre><code> task :one do
p "first task"
end
task :two => :one do
p "second task"
end
</code></pre>
<p>运行 rake two,结果自己试试。。</p>
<p>rake文件里有很多的任务时,你需要关注它们的命名冲突问题,因为task的命名需要是唯一的。这时候命名空间(namespace)就是一个自然的解决方案。你可以为上面的2个任务定义一个叫做install的命名空间</p>
<pre><code> namesapce :install do
task :one do
p "sdsds"
end
...
end
</code></pre>
<p>运行rake –tasks就可以看到rake的结构,运行方式是rake install:one的方式。</p>
<p>在一个task中调用其它的task,使用Rake::Task[“task_name”].invoke 方法。</p>
<pre><code> task :four do
Rake::Task["one"].invoke
p "four rask"
end
</code></pre>
<p>其实这和依赖是一样的,写法不一样而已,它也等于</p>
<pre><code> task :four => :one do
p "four rask"
end
</code></pre>
<p>可以为Rake增加一个默认任务,这样可以简单地用Rake命令来触发这个默认任务,</p>
<pre><code> task :deault =>[:one]
</code></pre>
<p>import(“loadpath”)
这样的语句导入各个子任务即可,不同的任务写到不同的文件里面就不会一团糟了。而且,import 同 Ruby 自己的 require 不一样,import 并不是立即进行导入的,而是在整个 Rakefile 执行结束之后才全部导入,因此,可以在任意的地方写 import ,而不用担心依赖关系,需要共享的变量之类的只要在主 Rakefile 中定义了即可</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/10/29/ubuntugeng-xin/">Ubuntu更新</a></h1>
<p class="meta">
<time datetime="2012-10-29T08:55:00+08:00" pubdate data-updated="true">Oct 29<span>th</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p>由于最近某党召开大会,导致于网速大降,在更新过程中不知道怎么就死掉了,然后出现了声音没了,再次更新提示dpkg 被中断,您必须手工sudo dpkg –configure -a 解决此问题,然后我就只好听话的sudo dpkg –configure -a 一下,结果在设置的过程中再次卡死,无赖,只有google了,然后大神就告诉我sudo apt-get dist-upgrade,果然就搞定了.然后我郁闷了,为什么就会出现遮掩的情况呢?平时就都是upgrade就ok了么?这次怎么就挂掉了呢?原来apt-get upgrade源升级,会产生一些依赖,必须dis-upgrade来升级一下.</p>
<h3>顺便附上来源于ubuntu社区<a href="http://wiki.ubuntu.org.cn/Apt%E5%92%8Cdpkg%E5%BF%AB%E9%80%9F%E5%8F%82%E8%80%83">Apt和dpkg快速参考</a></h3>
<pre><code> apt-cache search # ------(package 搜索包)
apt-cache show #------(package 获取包的相关信息,如说明、大小、版本等)
sudo apt-get install # ------(package 安装包)
sudo apt-get install # -----(package - - reinstall 重新安装包)
sudo apt-get -f install # -----(强制安装?#"-f =
--fix-missing"当是修复安装吧...)
sudo apt-get remove #-----(package 删除包)
sudo apt-get remove - - purge # ------(package
删除包,包括删除配置文件等)
sudo apt-get autoremove --purge # ----(package
删除包及其依赖的软件包+配置文件等(只对6.10有效,强烈推荐))
sudo apt-get update #------更新源
sudo apt-get upgrade #------更新已安装的包
sudo apt-get dist-upgrade # ---------升级系统
sudo apt-get dselect-upgrade #------使用 dselect 升级
apt-cache depends #-------(package 了解使用依赖)
apt-cache rdepends # ------(package
了解某个具体的依赖?#当是查看该包被哪些包依赖吧...)
sudo apt-get build-dep # ------(package 安装相关的编译环境)
apt-get source #------(package 下载该包的源代码)
sudo apt-get clean && sudo apt-get autoclean #
--------清理下载文件的存档 && 只清理过时的包
</code></pre>
<p>suapt-get install
下载 以及所有倚赖的包裹,同时进行包裹的安装或升级。如果某个包裹被设置了 hold (停止标志,就会被搁在一边(即不会被升级)。更多 hold 细节请看下面。</p>
<p>apt-get remove [–purge]
移除 以及任何倚赖这个包裹的其它包裹。
–purge 指明这个包裹应该被完全清除 (purged) ,更多信息请看 dpkg -P。</p>
<p>apt-get update
升级来自 Debian 镜像的包裹列表,如果你想安装当天的任何软件,至少每天运行一次,而且每次修改了
/etc/apt/sources.list 后,必须执行。</p>
<p>apt-get upgrade [-u]
升级所以已经安装的包裹为最新可用版本。不会安装新的或移除老的包裹。如果一个包改变了倚赖关系而需要安装一个新的包裹,那么它将不会被升级,而是标志为 hold。apt-get update 不会升级被标志为 hold 的包裹 (这个也就是 hold 的意思)。请看下文如何手动设置包裹为 hold。我建议同时使用 ‘-u’ 选项,因为这样你就能看到哪些包裹将会被升级。</p>
<p>apt-get dist-upgrade [-u]
和 apt-get upgrade 类似,除了 dist-upgrade 会安装和移除包裹来满足倚赖关系。因此具有一定的危险性。</p>
<p>apt-cache search
搜索满足 的包裹和描述。</p>
<p>apt-cache show
显示 的完整的描述。</p>
<p>apt-cache showpkg
显示 许多细节,以及和其它包裹的关系。</p>
<p>dselect
console-apt
aptitude
gnome-apt
APT 的几个图形前端(其中一些在使用前得先安装)。这里 dselect 无疑是最强大的,也是最古老,最难驾驭。</p>
<p>普通 Dpkg 用法
dpkg -i
安装一个 Debian 包裹文件,如你手动下载的文件。</p>
<p>dpkg -c
列出 的内容。</p>
<p>dpkg -I
从 中提取包裹信息。</p>
<p>dpkg -r
移除一个已安装的包裹。</p>
<p>dpkg -P
完全清除一个已安装的包裹。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。</p>
<p>dpkg -L
列出 安装的所有文件清单。同时请看 dpkg -c 来检查一个 .deb 文件的内容。</p>
<p>dpkg -s
显示已安装包裹的信息。同时请看 apt-cache 显示 Debian 存档中的包裹信息,以及 dpkg -I 来显示从一个 .deb 文件中提取的包裹信息。</p>
<p>dpkg-reconfigure
重新配制一个已经安装的包裹,如果它使用的是 debconf (debconf 为包裹安装提供了一个统一的配制界面)。你能够重新配制 debconf 它本身,如你想改变它的前端或提问的优先权。例如,重新配制 debconf,使用一个 dialog 前端,简单运行:</p>
<p>dpkg-reconfigure –frontend=dialog debconf (如果你安装时选错了,这里可以改回来哟:)</p>
<p>echo ” hold” | dpkg –set-selections
设置 的状态为 hlod (命令行方式)</p>
<p>dpkg –get-selections “”
取的 的当前状态 (命令行方式)</p>
<p>支持通配符,如:
Debian:~# dpkg –get-selections <em>wine</em>
libwine hold
libwine-alsa hold
libwine-arts hold
libwine-dev hold
libwine-nas hold
libwine-print hold
libwine-twain hold
wine hold
wine+ hold
wine-doc hold
wine-utils hold</p>
<p>例如:
大家现在用的都是 gaim-0.58 + QQ-plugin,为了防止 gaim 被升级,我们可以采用如下方法:</p>
<p>方法一:
Debian:~# echo “gaim hold” | dpkg –set-selections
然后用下面命令检查一下:
Debian:~# dpkg –get-selections “gaim”
gaim hold
现在的状态标志是 hold,就不能被升级了。</p>
<p>如果想恢复怎么办呢?
Debian:~# echo “gaim install” | dpkg –set-selections
Debian:~# dpkg –get-selections “gaim”
gaim install
这时状态标志又被重置为 install,可以继续升级了。</p>
<p>同志们会问,哪个这些状态标志都写在哪个文件中呢?
在 /var/lib/dpkg/status 里,你也可以通过修改这个文件实现 hold。</p>
<p>有时你会发现有的软件状态标志是 purge,不要奇怪。
如:事先已经安装了 amsn,然后把它卸了。
apt-get remove –purge amsn
那么状态标志就从 install 变成 purge。</p>
<p>方法二:
在/etc/apt 下手动建一个 preferences 文件
内容:
Package: gaim
Pin: version 0.58*
保存</p>
<p>dpkg -S
在包裹数据库中查找 ,并告诉你哪个包裹包含了这个文件。(注:查找的是事先已经安装的包裹)do apt-get check #——-检查是否有损坏的依赖
apt-get install
下载 以及所有倚赖的包裹,同时进行包裹的安装或升级。如果某个包裹被设置了 hold (停止标志,就会被搁在一边(即不会被升级)。更多 hold 细节请看下面。</p>
<p>apt-get remove [–purge]
移除 以及任何倚赖这个包裹的其它包裹。
–purge 指明这个包裹应该被完全清除 (purged) ,更多信息请看 dpkg -P。</p>
<p>apt-get update
升级来自 Debian 镜像的包裹列表,如果你想安装当天的任何软件,至少每天运行一次,而且每次修改了
/etc/apt/sources.list 后,必须执行。</p>
<p>apt-get upgrade [-u]
升级所以已经安装的包裹为最新可用版本。不会安装新的或移除老的包裹。如果一个包改变了倚赖关系而需要安装一个新的包裹,那么它将不会被升级,而是标志为 hold。apt-get update 不会升级被标志为 hold 的包裹 (这个也就是 hold 的意思)。请看下文如何手动设置包裹为 hold。我建议同时使用 ‘-u’ 选项,因为这样你就能看到哪些包裹将会被升级。</p>
<p>apt-get dist-upgrade [-u]
和 apt-get upgrade 类似,除了 dist-upgrade 会安装和移除包裹来满足倚赖关系。因此具有一定的危险性。</p>
<p>apt-cache search
搜索满足 的包裹和描述。</p>
<p>apt-cache show
显示 的完整的描述。</p>
<p>apt-cache showpkg
显示 许多细节,以及和其它包裹的关系。</p>
<p>dselect
console-apt
aptitude
gnome-apt
APT 的几个图形前端(其中一些在使用前得先安装)。这里 dselect 无疑是最强大的,也是最古老,最难驾驭。</p>
<p>普通 Dpkg 用法
dpkg -i
安装一个 Debian 包裹文件,如你手动下载的文件。</p>
<p>dpkg -c
列出 的内容。</p>
<p>dpkg -I
从 中提取包裹信息。</p>
<p>dpkg -r
移除一个已安装的包裹。</p>
<p>dpkg -P
完全清除一个已安装的包裹。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。</p>
<p>dpkg -L
列出 安装的所有文件清单。同时请看 dpkg -c 来检查一个 .deb 文件的内容。</p>
<p>dpkg -s
显示已安装包裹的信息。同时请看 apt-cache 显示 Debian 存档中的包裹信息,以及 dpkg -I 来显示从一个 .deb 文件中提取的包裹信息。</p>
<p>dpkg-reconfigure
重新配制一个已经安装的包裹,如果它使用的是 debconf (debconf 为包裹安装提供了一个统一的配制界面)。你能够重新配制 debconf 它本身,如你想改变它的前端或提问的优先权。例如,重新配制 debconf,使用一个 dialog 前端,简单运行:</p>
<p>dpkg-reconfigure –frontend=dialog debconf (如果你安装时选错了,这里可以改回来哟:)</p>
<p>echo ” hold” | dpkg –set-selections
设置 的状态为 hlod (命令行方式)</p>
<p>dpkg –get-selections “”
取的 的当前状态 (命令行方式)</p>
<p>支持通配符,如:
Debian:~# dpkg –get-selections <em>wine</em>
libwine hold
libwine-alsa hold
libwine-arts hold
libwine-dev hold
libwine-nas hold
libwine-print hold
libwine-twain hold
wine hold
wine+ hold
wine-doc hold
wine-utils hold</p>
<p>例如:
大家现在用的都是 gaim-0.58 + QQ-plugin,为了防止 gaim 被升级,我们可以采用如下方法:</p>
<p>方法一:
Debian:~# echo “gaim hold” | dpkg –set-selections
然后用下面命令检查一下:
Debian:~# dpkg –get-selections “gaim”
gaim hold
现在的状态标志是 hold,就不能被升级了。</p>
<p>如果想恢复怎么办呢?
Debian:~# echo “gaim install” | dpkg –set-selections
Debian:~# dpkg –get-selections “gaim”
gaim install
这时状态标志又被重置为 install,可以继续升级了。</p>
<p>同志们会问,哪个这些状态标志都写在哪个文件中呢?
在 /var/lib/dpkg/status 里,你也可以通过修改这个文件实现 hold。</p>
<p>有时你会发现有的软件状态标志是 purge,不要奇怪。
如:事先已经安装了 amsn,然后把它卸了。
apt-get remove –purge amsn
那么状态标志就从 install 变成 purge。</p>
<p>方法二:
在/etc/apt 下手动建一个 preferences 文件
内容:
Package: gaim
Pin: version 0.58*
保存</p>
<p>dpkg -S
在包裹数据库中查找 ,并告诉你哪个包裹包含了这个文件。(注:查找的是事先已经安装的包裹)</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/10/23/admasterfu-shi/">AdMaster复试</a></h1>
<p class="meta">
<time datetime="2012-10-23T08:50:00+08:00" pubdate data-updated="true">Oct 23<span>rd</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p>本来该上周一复试的,由于老爹生病了,回家看看.请求HR就到这周一了,很感谢能给我这个机会,面试我的是<a href="http://weibo.com/marscheng">程显峰</a>,北京anMaster的总裁.但我当时不知道,可能是有点紧张,更多的是注意问的问题.我觉得可能是我面试问的最好的.感觉不像是面试的,更多像指导.主要有下面几个问题,也是我很困扰的问题.</p>
<p>1.喜欢做什么.
2.该怎么去学习.
3.工作方式和环境.
4.最近看那些书.</p>
<p>对于第一条,还不是很明确;第二条,还需要不断的追寻;第三条,自由\开放\团结就可以了.希望能加入AdMaster.</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/10/10/ruby-chinaju-hui/">Ruby-china聚会</a></h1>
<p class="meta">
<time datetime="2012-10-10T01:38:00+08:00" pubdate data-updated="true">Oct 10<span>th</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p>fsword来北京出差,建议大家聚聚聊聊,正好也没有什么事,就去凑个热闹,7点多我就直接从国家图书馆杀了过去,在一个小巷子里面,不太好找,幸好提前查了一下地图,去的时候还没有人到,我第一个,后来林生和xds2000到了,xds2000得知在redhat工作,小小的膜拜一下吧,也想某天能够进这样的外企感受一下,后来笑来老师带着他的助理到了,陆陆续续的人都来了,总共11个人吧.大家自我介绍,然后大家吃着羊肉,聊着天.</p>
<p>聊天的主题是怎么去学习,那些分享视频的让新手很容易的就开始学习,少走弯路,少掉进坑里,评论xds2000做的视频里英语发音不标准,以后的视频会好好的审查,这是一个难得的机会啊,笑来老师说的最多的就是怎么教好别人,因为他是一个老师,要做一件事就要做好.
这让我很感动,不想现在的很多老师,你学到知识学不到,不关我事,没有一点责任心.他的那种执着的精神值的学习,他也40岁,事业有成,按道理不用学习什么rails,没有什么多大的意义多很多人来说,但是他说他爱学习,他决定什么事都是自己动手自己干.很受启发,很希望能够拜在他的门下学习.</p>
<p>时间过的很快,不知不觉就到了10点半了,大家就撤了,郁闷的是我上的地铁是半程车,不能到北苑,郁闷至极.只有打车回去了,和一老外美女拼车,她听不懂英文,只说到西直门要多少钱,司机在那说70,比手势,但她不懂,他也为很贵,不坐,在司机的比划,然后问我多少钱,我用很我那仅有的口语跟她解释,终于上车,走人了,在车上她一股劲在骂 fucking china,很奇怪的是我差不多都听懂了,中途问了她是那的,她还打电话跟她朋友说遇到一个英语很不好的人,我伤心啊,感叹那时候没有好好的学…</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/10/09/guan-yu-shi-yong-devise/">关于使用devise</a></h1>
<p class="meta">
<time datetime="2012-10-09T01:08:00+08:00" pubdate data-updated="true">Oct 9<span>th</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p><a href="https://github.com/plataformatec/devise">devise</a>是rails的一个gem,rails 的gem的好处就是各种便利,即使你不知道它的内在原理,你也可以很好的使用,只要你按照doc操作.关于devise的好处就不用说了,使用它之后不用不用在关心帐号的各种处理了,只要你按照它的步骤操作,一分钟就搞定了,给我们带来了很大的便利.</p>
<p>怎么使用devise就不详细说了,官方和现在的资料已经很仔细了,我要说的是这个方法after_sign_up_path_for ,这个方法里面你对制定的帐号登陆之后跳转的到指定的path,例如:</p>
<pre><code> private
def after_sign_in_path_for(resource)
这里进行处理
if resource.is_a?(User)
这里指定的path
else
super
end
end
</code></pre>
<p>对应的登出也有这样的一个方法</p>
<pre><code> private
def after_sign_out_path_for(resource_or_scope)
这里一般是跳到首页了
end
</code></pre>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/10/06/linuxchang-yong-de-8ge-ming-ling/">Linux常用的8个命令</a></h1>
<p class="meta">
<time datetime="2012-10-06T23:36:00+08:00" pubdate data-updated="true">Oct 6<span>th</span>, 2012</time>
</p>
</header>
<div class="entry-content"><h3>来源:<a href="http://www.aqee.net/8-linux-commands-every-developer-should-know/">外刊IT评论网</a></h3>
<h3>英文来源:<a href="http://blog.jayfields.com/2012/08/8-linux-commands-every-developer-should.html">8 Linux Commands Every Developer Should Know</a></h3>
<hr />
<p>每个程序员,在职业生涯的某个时刻,总会发现自己需要知道一些Linux方面的知识。我并不是说你应该成为一个Linux专家,我的意思是,当面对linux命令行任务时,你应该能很熟练的完成。事实上,学会了下面8个命令,我基本上能完成任何需要完成的任务。</p>
<p>注意:下面的每个命令都有十分丰富的文档说明。这篇文章并不是来详尽的展示每个命令的各种功用的。我在这里要讲的是这几个最常用的命令的最常见用法。如果你对linux命令并不是很了解,你想找一些这方面的资料学习,那这篇文章将会给你一个基本的指导。
让我们从处理一些数据开始。假设我们有两个文件,分别记录的订单清单和订单处理结果。</p>
<pre><code> order.out.log
8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
order.in.log
8:22:20 111, Order Complete
8:23:50 112, Order sent to fulfillment
8:24:20 113, Refund sent to processing
</code></pre>
<ul>
<li><h3>cat</h3></li>
</ul>
<p>cat – 连接文件,并输出结果</p>
<p>cat 命令非常的简单,你从下面的例子可以看到。</p>
<pre><code> jfields$ cat order.out.log
8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
</code></pre>
<p>就像它的说明描述的,你可以用它来连接多个文件。</p>
<pre><code> fields$ cat order.*
8:22:20 111, Order Complete
8:23:50 112, Order sent to fulfillment
8:24:20 113, Refund sent to processing
8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
</code></pre>
<p>如果你想看这些log文件的内容,你可以把它们连接起来并输出到标准输出上,就是上面的例子展示的。这很有用,但输出的内容可以更有逻辑些。</p>
<ul>
<li><h3>sort</h3></li>
</ul>
<p>sort – 文件里的文字按行排序</p>
<p>此时sort命令显然是你最佳的选择。</p>
<pre><code> jfields$ cat order.* | sort
8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:22:20 111, Order Complete
8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99
8:23:50 112, Order sent to fulfillment
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:24:20 113, Refund sent to processing`
</code></pre>
<p>就像上面例子显示的,文件里的数据已经经过排序。对于一些小文件,你可以读取整个文件来处理它们,然而,真正的log文件通常有大量的内容,你不能不考虑这个情况。此时你应该考虑过滤出某些内容,把cat、sort后的内容通过管道传递给过滤工具。</p>
<ul>
<li><h3>grep</h3></li>
</ul>
<p>grep, egrep, fgrep – 打印出匹配条件的文字行</p>
<p>假设我们只对Patterns of Enterprise Architecture这本书的订单感兴趣。使用grep,我们能限制只输出含有Patterns字符的订单。</p>
<pre><code> jfields$ cat order.* | sort |grep Patterns
8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
</code></pre>
<p>假设退款订单113出了一些问题,你希望查看所有相关订单——你又需要使用grep了。</p>
<pre><code> jfields$ cat order.*| sort | grep| ":\d\d 113, "
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:24:20 113, Refund sent to processing
</code></pre>
<p> 你会发现在grep上的匹配模式除了“113”外还有一些其它的东西。这是因为11 以匹配上书目或价格,加上额外的字符后,我们可以精确的搜索到我们想要的
现在我们已经知道了退货的详细信息,我们还想知道日销售和退款总额。但我心Patterns of Enterprise Architecture这本书的信息,而且只关心数量和价现在要做到是切除我们不关心的任何信息。</p>
<ul>
<li><h3>cut</h3></li>
</ul>
<p>cut – 删除文件中字符行上的某些区域</p>
<p>又要使用grep,我们用grep过滤出我们想要的行。有了我们想要的行信息,我们就可以把它们切成小段,删除不需要的部分数据。</p>
<pre><code> jfields$ cat order.* | sort | grep Patterns
8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99
8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99
jfields$ cat order.* | sort | grep Patterns | cut -d"," -f2,51, 39.99
-1, 39.99
</code></pre>
<p> 现在,我们把数据缩减为我们计算想要的形式,把这些数据粘贴到Excel里立刻就能得到结果了。
cut是用来消减信息、简化任务的,但对于输出内容,我们通常会有更复杂的形式。假设我们还需要知道订单的ID,这样可以用来关联相关的其他信息。我们用cut可以获得ID信息,但我们希望把ID放到行的最后,用单引号包上。</p>
<ul>
<li><h3>sed</h3>
<p>sed – 一个流编辑器。它是用来在输入流上执行基本的文本变换。</p>
<p>下面的例子展示了如何用sed命令变换我们的文件行,之后我们在再用cut移除无用的信息</p>
<pre><code>jfields$ cat order.* | sort | grep Patterns \
| sed s/"[0-9\:]* \([0-9]*\)\, \(.*\)"/"\2, '\1'"/
1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '111'
1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '113'
l mp-jfields01:~ jfields$ cat order.* | sort | grep Patterns \
| sed s/"[0-9\:]* \([0-9]*\)\, \(.*\)"/"\2, '\1'"/ | cut -d"," -f1,4,5
1, 39.99, '111'
1, 39.99, '113'
</code></pre>
<p>我们对例子中使用的正则表达式多说几句,不过也没有什么复杂的。正则表达式做了下面几种事情</p>
<pre><code>1、 删除时间戳
2、 捕捉订单号
3、 删除订单号后的逗号和空格
4、 捕捉余下的行信息
</code></pre></li>
</ul>
<p>里面的引号和反斜杠有点乱,但使用命令行时必须要用到这些。
一旦捕捉到了我们想要的数据,我们可以使用 \1 & \2 来存储它们,并把它们输出们想要的格式。我们还在其中加入了要求的单引号,为了保持格式统一,我们还加逗号。最后,用cut命令把不必要的数据删
现在我们有麻烦了。我们上面已经演示了如何把log文件消减成更简洁的订单形式我们的财务部门需要知道订单里一共有哪些书。</p>
<ul>
<li><h3>uniq</h3>
uniq – 删除重复的行
下面的例子展示了如何过滤出跟书相关的交易,删除不需要的信复的信息。
<pre><code>jfields$ cat order.out.log | grep "\(Kindle\|Hardcover\)" | cut -d"," -f3 | sort | uniq -c
1 Joy of Clojure
2 Patterns of Enterprise Architecture
</code></pre></li>
</ul>
<p>看起来这是一个很简单的任务。
这都是很好用的命令,但前提是你要能找到你想要的文件。有时候你会发现一些文件藏在很深的文件夹里,你根本不知道它们在哪。但如果你是知道你要寻找的文件的名字的话,这对你就不是个问题了。</p>
<ul>
<li><h3>find</h3></li>
</ul>
<p>在上面的例子中我们处理了order.in.log和order.out.log这两个文件。这两个文件放在我的home目录里的。下面了例子将向大家展示如何在一个很深的目录结构里找到这样的文件。</p>
<pre><code> jfields$ find /Users -name "order*"
Users/jfields/order.in.log
Users/jfields/order.out.log
</code></pre>
<p>find命令有很多其它的参数,但99%的时间里我只需要这一个就够了。
简单的一行,你就能找到你想要的文件,然后你可以用cat查看它,用c但文件很小时,你用管道把它们输出到屏幕上是可以的,但当文件大,你也许应该用管道把它们输出给less命令。</p>
<ul>
<li><h3>less</h3>
<p>less – 在文件里向前或向后移动</p>
<p>让我们再回到简单的 cat | sort 例子中来,下面的命令就是将经过合并、排序后的内容输出到less命令里。在 less 命令,使用“/”来执行向前搜索,使用“?”命令执行向后搜索。搜索条件是一个正则表达式</p>
<pre><code>jfields$ cat order* | sort | less
</code></pre></li>
</ul>
<p> 如果你在 less 命令里使用 /113.<em>,所有113订单的信息都会高亮。你也可</em>112,所有跟订单112相关的时间戳都会高亮。最后你可以用来退出le
linux里有很丰富的各种命令,有些是很难用的。然而,学会了前面说的,你已经能处理大量的log分析任务了,完全不需要用脚本语言写程序来处理它们。</p>
<p> 06 Oct 2012 </p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2012/10/01/wo-de-xin-bo-ke/">我的新博客</a></h1>
<p class="meta">
<time datetime="2012-10-01T20:14:00+08:00" pubdate data-updated="true">Oct 1<span>st</span>, 2012</time>
</p>
</header>
<div class="entry-content"><p>新博客弄好了,之前用jekyll搭建的blog还是没有octopress强大啊,很感谢<a href="https://github.com/imathis">imathis</a>的贡献…</p>
<p>博客的主题是参考别人的设置的CSS的,具体大家可以google,没有什么难度,还有就是文章的分类,这个在plugins目录下的category_generate.rb修改,就是想里面的方法替换掉</p>
<pre><code> def write_category_index(category_dir, category)
index = CategoryIndex.new(self, self.source, category_dir, category)
index.render(self.layouts, site_payload)
index.write(self.dest)
# Record the fact that this page has been added, otherwise Site::cleanup will remove it.
self.pages << index
# Create an Atom-feed for each index.
feed = CategoryFeed.new(self, self.source, category_dir, category)
feed.render(self.layouts, site_payload)
feed.write(self.dest)
# Record the fact that this page has been added, otherwSite::cleanup will remove it.
self.pages << feed
end
然后就是修改_config.yml配置文件,octopress官方文档说的很清楚了,然后就是豆瓣个人秀,去自己的豆瓣开发者个人中心,然后_include/asides目录下添加douban.html,然后在_config.yml的default_asides里面加入douban.html就ok了.其它的sides都按照这样的步骤.
就这样博客就搭建好了,关于octopress的教材网上很多的,我就粗略的介绍一下 :)....
</code></pre>
</div>
</article>
<div class="pagination">
<a href="/blog/archives">Blog Archives</a>
</div>
</div>
<aside class="sidebar">
<section>
<h1>关于我</h1>
<p>大家好,我叫virgil,欢迎来到我的博客.喜欢code,热衷于开源,希望和大家一起共同的进步希望大家多多的指导…
邮箱:<img src="http://leehong.github.com/images/email.gif" />
</section>
<section>
<h1>最近文章</h1>
<ul id="recent_posts">
<li class="post">
<a href="/blog/2012/12/16/zhou-liu-railsgirlhuo-dong-gan-shou/">周六railsgirl活动感受</a>
</li>
<li class="post">
<a href="/blog/2012/11/17/guan-yu-rake/">rake介绍</a>
</li>
<li class="post">
<a href="/blog/2012/10/29/ubuntugeng-xin/">ubuntu更新</a>
</li>
<li class="post">
<a href="/blog/2012/10/23/admasterfu-shi/">AdMaster复试</a>
</li>
<li class="post">
<a href="/blog/2012/10/10/ruby-chinaju-hui/">ruby-china聚会</a>
</li>
</ul>
</section>
<section>
<h1>分类</h1>
<ul id="category-list"><li><a href='/blog/categories/another'>another (3)</a></li><li><a href='/blog/categories/linux'>linux (2)</a></li><li><a href='/blog/categories/octopress'>octopress (1)</a></li><li><a href='/blog/categories/rails'>rails (1)</a></li><li><a href='/blog/categories/ruby'>ruby (1)</a></li></ul>
</section>
<section>
<h1>GitHub Repos</h1>
<ul id="gh_repos">
<li class="loading">Status updating…</li>
</ul>
<a href="https://github.com/leehong">@leehong</a> on GitHub
<script type="text/javascript">
$.domReady(function(){
if (!window.jXHR){
var jxhr = document.createElement('script');
jxhr.type = 'text/javascript';
jxhr.src = '/javascripts/libs/jXHR.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jxhr, s);
}
github.showRepos({
user: 'leehong',
count: 0,
skip_forks: true,
target: '#gh_repos'
});
});
</script>
<script src="/javascripts/github.js" type="text/javascript"> </script>
</section>