流水笔记

面向免费零食和饮料的编程

C++中的虚函数

直接上代码

[code]

include <iostream>

include <stdlib.h>

using namespace std;

class Base { public: virtual void virtualFunc() { cout << "BaseVirtualFunc" << endl; } void func() { cout << "BaseFunc" << endl; } void call() { virtualFunc(); func(); } };

class Derive : public Base { public: void virtualFunc() { cout << "SubClassVirtualFunc" << endl; } void func() { cout << "SubClassFunc" << endl; } };

int main(int argc, char argv[]) { Derive d; d.call(); /————————-output————————-/ /SubClassVirtualFunc                                     / /BaseFunc                                                / /——————————————————–*/ system("PAUSE"); }

[/code]

WebKit 网页装载流程

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
[code]
FrameLoader.cpp
2048: RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, substituteData);
2051: load(loader.get());
2083: void FrameLoader::load(DocumentLoader* newDocumentLoader)
(
2085: ResourceRequest& r = newDocumentLoader->request();
2086: addExtraFcd ieldsToMainResourceRequest(r);
)
2110: loadWithDocumentLoader(newDocumentLoader, type, 0);
2013: void FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType type, PassRefPtr<FormState> prpFormState)
2130~2156: policyChecker()->checkNavigationPolicy()
3533: void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState> formState, bool shouldContinue)
3596~3599:
if (formState)
m_client->dispatchWillSubmitForm(&PolicyChecker::continueLoadAfterWillSubmitForm, formState);
else
continueLoadAfterWillSubmitForm();
3093: void FrameLoader::continueLoadAfterWillSubmitForm()
3119: if (!m_provisionalDocumentLoader->startLoadingMainResource(identifier))
DocumentLoader.cpp
717: bool DocumentLoader::startLoadingMainResource(unsigned long identifier)
720: m_mainResourceLoader = MainResourceLoader::create(m_frame);
727: if (!m_mainResourceLoader->load(m_request, m_substituteData)) {
MainResourceLoader.cpp
525: bool MainResourceLoader::load(const ResourceRequest& r, const SubstituteData& substituteData)
544: if (loadNow(request)) {
492: bool MainResourceLoader::loadNow(ResourceRequest& r)
520: m_handle = ResourceHandle::create(r, this, m_frame.get(), false, true);
ResourceHandle.cpp (locate at WebCore/platform/network)
46: PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, ResourceHandleClient* client, Frame* frame, bool defersLoading, bool shouldContentSniff)
64: if (newHandle->start(frame))
(the start function depends on platform, take QT as example)
ResourceHandleQt.cpp
119: bool ResourceHandle::start(Frame* frame)
141: d->m_job = new QNetworkReplyHandler(this, QNetworkReplyHandler::LoadMode(d->m_defersLoading));
QtNetworkReplyHandler.cpp
130: QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode loadMode)
168: start();
414: void QNetworkReplyHandler::start()
(
420: QNetworkAccessManager* manager = d->m_frame->page()->networkAccessManager();
433: m_reply = manager->get(m_request);
437: m_reply = manager->post(m_request, postDevice);
476: connect(m_reply, SIGNAL(finished()), this, SLOT(finish()), SIGNAL_CONN);
->229: void QNetworkReplyHandler::finish()
-->252: client->didFinishLoading(m_resourceHandle);
485: connect(m_reply, SIGNAL(readyRead()), this, SLOT(forwardData()), SIGNAL_CONN);
->357: void QNetworkReplyHandler::forwardData()
-->398: client->didReceiveData(m_resourceHandle, data.constData(), data.length(), data.length() /*FixMe*/);
489: connect(m_reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)), SIGNAL_CONN);
->402: void QNetworkReplyHandler::uploadProgress(qint64 bytesSent, qint64 bytesTotal)
-->411: client->didSendData(m_resourceHandle, bytesSent, bytesTotal);
484: connect(this, SIGNAL(processQueuedItems()), this, SLOT(sendQueuedItems()), SIGNAL_CONN);
->509: void QNetworkReplyHandler::sendQueuedItems()
)
(Qt implements ResourceHandleClient for class WebCoreSynchronousLoader in ResourcehandleQt.cpp)
restart from 398: client->didReceiveData(m_resourceHandle, data.constData(), data.length(), data.length() /*FixMe*/);
ResourceLoader.cpp
248: void ResourceLoader::didReceiveData(const char* data, int length, long long lengthReceived, bool allAtOnce)
260: addData(data, length, allAtOnce);
MainResourceLoader.cpp
143: void MainResourceLoader::addData(const char* data, int length, bool allAtOnce)
146: frameLoader()->receivedData(data, length);
FrameLoader.cpp
2174: void FrameLoader::receivedData(const char* data, int length)
2176: activeDocumentLoader()->receivedData(data, length);
DocumentLoader.cpp
288: void DocumentLoader::receivedData(const char* data, int length)
292: commitLoad(data, length);
272: void DocumentLoader::commitLoad(const char* data, int length)
280: frameLoader->committedLoad(this, data, length);
FrameLoader.cpp
3350: void FrameLoader::committedLoad(DocumentLoader* loader, const char* data, int length)
(depend on platform, take Qt as example)
FrameLoaderClientQt.cpp
741: void FrameLoaderClientQt::committedLoad(WebCore::DocumentLoader* loader, const char* data, int length)
751: fl->addData(data, length);
FrameLoader.cpp
1544: void FrameLoader::addData(const char* bytes, int length)
1549: write(bytes, length);
889: void FrameLoader::write(const char* str, int len, bool flush)
949: tokenizer->write(decoded, true);
HTMLTokenizer.cpp
1624: void HTMLTokenizer::write(const SegmentedString& str, bool appendData)
1633~1648: try to execute script
1684: while (!m_src.isEmpty() && (!frame || !frame->redirectScheduler()->locationChangePending())) {
(
1760: processToken();
1913: PassRefPtr<Node> HTMLTokenizer::processToken()
1941: n = m_parser->parseToken(&m_currentToken);
HTMLParser.cpp
230: PassRefPtr<Node> HTMLParser::parseToken(Token* t)
224: inline bool HTMLParser::insertNodeAfterLimitBlockDepth(Node* n, bool flat)
352: bool HTMLParser::insertNode(Node* n, bool flat)
n->attach();
404: m_document->frame()->loader()->dispatchDocumentElementAvailable();
)
FrameLoader.cpp
3985: void FrameLoader::dispatchDocumentElementAvailable()
3987: m_frame->injectUserScripts(InjectAtDocumentStart); (script!!)
3988: m_client->documentElementAvailable(); (depend on platform)
[/code]

2010.4.28 Webkit

1
2
3
4
5
6
今天都在看Webkit源码,总结一下:<br>
核心的两部分应该是WebCore和JavascriptCore,大致上来说,WebCore负责HTML和CSS及图片等资源的解 析,JavascriptCore负责Javascript脚本的解析和执行。JavascriptCore还没看,主要是看了WebCore部分。<br>
WebCore既然叫Core,其实就只有很Core的东西,也就是很单纯的解析。至于说如何获取数据,如何把页面显示出来,甚至如何处理与用户之间的交 互等功能就不是它来做的,而是让一些不那么Core的模块来做。而且这些模块都是平台相关的,win下有win下的实现,qt下有qt下的实现,gtk下 有gtk下的实现。又或者说其实Webkit并不是浏览器,而仅仅是一个引擎。<br>
浏览器的一个经典应用场景是用户给出一个URL(直接输入或者点击链接或者JavaScript解析等方式)。然后浏览器外壳调用FrameLoader 来装载页面。FrameLoader首先检查一些条件(policyCheck()),如URL是否非空、URL是否可达,用户是否取消等等。然后通过 DocumentLoader启动一个MainResourceLoader来装载页面。<br>
MainResource调用network模块中的接口来下载页面内容(ResourceHandle),实际上这里的Resourcehandle已 经是平台相关的内容了,比如在Qt里面,会有ResourceHandleQt来控制,然后调用QtNetworkReplyHandler来处理 HTTP请求(GET, POST等)。接收到数据以后,会有回调函数,告诉MainResourceLoader数据已经接收到了。然后一路返回到FrameLoader开始调 用HTMLTokenizer解析HTML文本。解析过程中,如果遇到Javascript脚本的话,也会调用Javascript引擎(Webkit中 的JavascriptCore,chrome中的V8)来解析。数据被解析完了以后,成了一个一个的node。然后通过 FrameLoaderClient调用外部的壳把内容显示出来。
。。。好像什么都没说清楚。。。

2010.4.27 PLC、西厢、股票

果然没有理论的支持还是做不成事情的,今天看了一下PLC的书,恍然大悟豁然开朗,很多疑问迎刃而解。 首先PLC有一种很奇怪的执行方式,就是主程序块(OB1)并不是只执行一次,而是以一个恒定的间隔循环执行,这就解释了为什么CtrlValve里面DB101到DB110所有数据块里面的内容都是相同的,原来那只是个初始值。 然后PIW之类的P是有深意的,它表示直接读取当前的信号(而不是在程序块执行之间保存到影像寄存器里面的值)。 然后累加器AC呢,S7-300只有两个(ACCU0,ACCU1),而S7-200和S7-400都有4个(ACCU0~ACCU3)。 然后对于一条指令,是一种操作码+操作数的形式,操作码自然就是L,A,=,==I之类的东西了。但操作数还是很有讲究的,可以有地址和数据两种方式。而地址又分为两种,一种是绝对地址(Memory Address),另一种是符号地址(Symbol Address)(符号地址还没看,据说在书中12~13章有详细介绍)。绝对地址呢,又分为直接寻址和间接寻址两种方式,直接寻址就是类似“I3.0”这样的形式,就是I区中第3个字节第0位了。间接寻址又很有讲究,比如S7-200中就跟C语言差不多,有&和*两种符号,自然就是取地址取当前地址对应的值作为地址对应的值(。。。反正就是那个意思了)。S7-300/400就简单很多了,可以用I[I10]之类的,意思就是把I10的值拿出来(比如是20),然后取I20的值。书里有个例子,是说

[code] L P#22.2 T LD10 A I[LD10] A I0.0 = Q0.1 [/code]

看起来好像很复杂很牛的样子,其实就是

[code] A I22.2 A I0.0 = Q0.1 [/code]

的意思。 然后还有S7-300/400寄存器间接寻址的内容也没看。 然后今天跟万师兄谈了一下,发现某PLC系统结构非常清晰,没有整理的必要,于是现在任务暂时变成全方位理解CtrlValve的代码。貌似这160行的代码基本上就够我整个研究生论文了。。。

然后今天收到一封邮件,说是西厢计划比较好用的版本出来了,于是下了下来,装上张生,还是很不错的,至少twitter、facebook等等都能正常访问,wordPress虽然慢了一点,但也还能忍。恩,西厢还是很牛的一个东西。

然后今天股票很悲剧,操作失误把国航全卖了,然后南航差2分没买上(结果彪了6个点)。啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

2010.4.26 PLC、WebKit、社当考试

首先详细分析一下SIMATIC 300(1)的代码(不写点东西的话总容易分神。。。) 显然是先从OB1开始的了,OB1就是俗称的”Main Program Sweep (Cycle)” 首先Call的是StationSendPC函数,也就是FC13(内含DB2–PCRev),学名是

1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“

[code] AN I 16.0 = DBX 144.0 [/code]

的结构,但AN是和上一个RLO and not,似乎就是每一个AN都是和上一个类似代码段的RLO and not一下,也就是说结果是逐个依赖的样子(我说的是什么呢???)。 (号外——补充一个注释:LAR1 P#M100.0 //Load AR1 with a 32-bit pointer constant.) 然后是泵运行状态,代码如下:

[code] L P#20.0 //取基址 LAR1 L P#162.0 LAR2 L 11 Lop1: NOP 0 T #TmpNum A I [AR1,P#0.0] = DBX [AR2,P#0.0] AN I [AR1,P#0.0] = DBX [AR2,P#0.1] +AR1 P#0.2 //输入间隔2 +AR2 P#1.0 //数据块间隔1字节 L #TmpNum LOOP Lop1 [/code]

好吧,其实我没看懂,所以直接贴上来。。。

1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“
1
2
<div class='bogus-wrapper'><notextile><figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>” 从站设备原始数据传入DB2“</span></code></pre></td></tr></table></div></figure></notextile></div>
1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“

Web Template Framework, 它provides commonly used functions all over the WebKit codebase. 然后检查发现FrameLoader似乎是整个WebCore的入口,外壳(GTK、QT、Chrome等等)就是调用FrameLoader来载入网页 的,然后FrameLoader目前有一个问题,就是载入网页的时候需要一个外壳(这依赖太纠结了。。。),FrameLoader有几个看起来很 kernel的函数,首先是createWindows,就是新建一个窗口(标签页)的时候调用的吧。然后是各种load,就是载入URL了。

暂时就看了这么多。。。

下午考试,社会主义与当代中国,太纠结了。10道论述题,每道题都是写着歇着突然发现“咦,好像问的不是这个”,怎么办?划掉重写?太浪费时间了。。。试 图转回来?要能转回来就不会写错了。。。然后就像“算了,反正老师未必会看,看了也未必知道我在说什么,知道也可能会同情我写了那么多字”,反正大概应该 可能也许不会挂就是了,然后就开始写下一题了。

晚上突然发现最近几周都忘了下Mentalist,我就说怎么总觉得少看了一部美剧,但具体有想不起来,Lie To Me已经停播,Chuck好像出的话基本都下了,然后今天终于想起是Mentalist,一搜,居然差3集没看,真是哇哈哈哈哈哈哈哈哈哈哈哈

1
” 从站设备原始数据传入DB2“
1
” 从站设备原始数据传入DB2“

新的设置测试

新版搜狗浏览器虽然加入了不少东西,但外观实在太山寨了。。。

联想的乐phone也是,虽然功能似乎不错,但UI怎么看怎么山寨

2010.4.24 PLC及聚餐及曼联

历经千辛万苦,终于把SIMATIC(为什么那么像赛门铁克呢???)里面的源码弄出来了。不得不说 Vim除了适合显摆以外,功能还是异常强大的,尽管现在还只是略懂,不过已经足以完成大部分文本处理的任务了。遗憾的是:%s/{pattern} /{substring}/g全局替换似乎不能用中文(或者更准确的说,VIM在命令状态下不能输入中文,有机会要尝试解决一下)。

继续补充昨天内容:

  • PI原来是Process Input的意思(ABB变频器和S7-300DP通讯里面说到——《设计文档(简略)》,PS.似乎找不到传说中的SFC15,只有SFC20和 SFC14)。因此据猜测,PIW应该是Process Input Word的意思了吧。
  • 还有什么DBX 145.0这样的东西就是对应于当前打开的那个DB(OPN XXX中的XXX)中的第145.0(实际上应该就是145个位)。因为在《设计文档(简略)》中有这么一句

[code] RECORD :=P#DB20.DBX 6.0 BYTE 6 [/code]

说的似乎是从DB20中第6位开始读6个BYTE

  • OB其实是Organization Block的意思。
  • DB自然就是Data Block了
  • FC指的是Function
  • FB是Function Block(跟FC有什么区别呢???)
  • SFC是System Function
  • VAT是Variable Table,储存各种各样的变量。如下图(程序中各种各样的”PCSend”.PCSend[2])这种要你命三 千的含义都能从这里查到(说起来,DBX是不是任意位数呢?类似DBW、DBB)

另外赞一下VirtualBox的无缝模式,个人感觉完胜VirtualPC(没用过。。。)、VMWare(没用过最新版。。。)两个收费版

中午聚餐,计有LMY、LHD、XQ、LZJ、CKY、LWJ和我共七人于江湖味道(为什么二楼看起来挺高雅的,一楼却怎么看都像大排档呢,搞到我被大家 狂喷),价格便宜量又足,还是不错的。席间爆料说我曾经发过暧昧短信。。。我怎么不记得了 席间诸位工作了的同仁都无甚八卦热情,更多的是讨论租房等现实问题。我和LZJ两位烟酒僧对角默坐,无言以对,很是悲凉。

晚上突然发现新浪有曼联直播,还是曼联VS热刺这种重头戏,显然是要看的。不过新浪视频居然只支持IE,只支持IE也就忍了,居然一开就把带宽全占了,网 都上不了。不过尽管如此,我还是排除万难,坚持看完全场,并在看直播过程中成功吧SIMATIC代码导出来。 鉴于曼联赢了,心情甚好,点评一下:

  1. 潇洒哥真不潇洒
  2. 小马哥很牛,上场就来个助攻,虽然只是捣了个脚
  3. nani似乎没以前那么喜欢突突突了,表现还是可以的
  4. Bale真牛,曼联当年没搞到手浪费了
  5. 王老吉同志很好,梅开二度
  6. 卡里克挺好的一个同志,怎么就成隐身卡了。。。
  7. 鲁小胖的小孩感觉怎么那么胖呢
  8. 他池为了马竞,似乎不会给面子了

OVER,开始看片

Grep帮助

Usage: grep [OPTION]… PATTERN [FILE] … Search for PATTERN in each FILE or standard input. Example: grep -i ‘hello world’ menu.h main.c

Regexp selection and interpretation: -E, –extended-regexp PATTERN is an extended regular expression -F, –fixed-strings PATTERN is a set of newline-separated strings -G, –basic-regexp PATTERN is a basic regular expression -P, –perl-regexp PATTERN is a Perl regular expression -e, –regexp=PATTERN use PATTERN as a regular expression -f, –file=FILE obtain PATTERN from FILE -i, –ignore-case ignore case distinctions -w, –word-regexp force PATTERN to match only whole words -x, –line-regexp force PATTERN to match only whole lines -z, –null-data a data line ends in 0 byte, not newline

Miscellaneous: -s, –no-messages suppress error messages -v, –invert-match select non-matching lines -V, –version print version information and exit –help display this help and exit –mmap use memory-mapped input if possible

2010.4.23 PLC

源码类汇编吧。一句一句看不难懂,不过整体来看不知道什么意思。。。都是读几个数,比较一下/加加减减一下/处理一下,然后存到某个位置 一些程序指令含义(猜测或者从文档中找到):

  • OPN: open a data block
  • RND: round(float to int)
  • A: and
  • AN: and not(取反以后,再and)
  • ==I: 判断是否相等(前面两个运算结果)
  • =: 输出(突然想到,这个和T有什么区别呢?)
  • L: Load
  • T: Transfer
  • 对于一下PIW、DIW、IB之类的东西,最后一个是B的话表示Byte,D的话表示Double,W的话表示Word,(中间I表示 Input??)
  • #开头的表示临时变量吧(不在寄存器或者什么里面)?

Python创建透明PNG图片

有两点需要注意的,一个是图片只有在保存成PNG格式之后 才会透明,另一个是颜色只能用”#FF00FF”这种格式,而不能用0XFF00FF(即只能 是字符串,否则不透明,很诡异)

1 import Image, ImageFont, ImageDraw 2 3 im = Image.new(‘RGBA’, (120, 50), (0, 0, 0, 0)) 4 dr = ImageDraw.Draw(im) 5 font = ImageFont.truetype(‘MONACO.TTF’, 30) 6 dr.text((10, 10), ‘hello’, font = font, fill = ‘#00FF00’) 7 im.save(‘test.png’, ‘PNG’)