Today I got the error message below when I wanted to use cscope with vim.
Error detected while processing /home/yl/.vim/plugin/cscope_maps.vim:
line 42:
E568: duplicate cscope database not added
Press ENTER or type command to continue
Then finally find the working solution here
https://blogs.oracle.com/natarajan/entry/avoiding_duplicate_cscope_database_error
To fix this issue, you will need to simply edit the file "~/.vim/plugin/cscopemenu.vim" (or whatever your plugin is named) and edit the line :
set cscopeverbose
to
set nocscopeverbose
You can also do the same by doing this by adding this line "set nocscopeverbose " to your ~/.vimrc file as well.
Wednesday, February 26, 2014
Thursday, July 25, 2013
Talking in GDB Protocol - How to support Software Breakpoint
Recently I have been working on a OS project and my job is to build debugging support. More specifically, I am writing a GDB stub for an OS. I will not talk about the OS itself here but only some details of my work writing this GDB stub.
Here we are debugging a "remote" target with GDB. Unlike debugging local programs, GDB talks the remote target (the OS to be debugged) to via network/serial port connection, in a language called GDB Protocol. In this protocol, GDB send requests to the remote target to do various things, like read/write register/memory, insert/remove breakpoint/watchpoint, single step, resume execution (after single step or breakpoint), etc.
There are many articles talking about how to write a GDB stub. And you can easily find sample code, for example, remtoe.c on Linux. I am not going to repeat these things. Today I want to talk specifically about how to support software breakpoint.
If you want to play with GDB protocol, simply type in GDB prompt "set debug remote 1" so the packets sent/received will be shown on screen.
Let's assume that we want to break at a certain address. The basic idea of software breakpoint is to replace the instruction at this address with a breakpoint instruction, i.e. "INT 3" for x86 or "BRKT" for ARM. When the control flow executes to this address, the breakpoint instruction will bring you to breakpoint handler (actually an exception handler). Now GDB can interact with stub to debug the target, i.e. examine memory, insert watchpoint, etc. When the user types "continue" or "step" in GDB, the control flow on target should resume from the breakpoint.
But how to resume? Of course we should put the original instruction at breakpoint back and jump to that address. Then the breakpoint is gone and we will not break at here again. However we usually expect breakpoint to persist. After playing with GDB for a while, here is what GDB does with breakpoint:
1. GDB remembers all the breakpoints.
2. When target halts (e.g. hits a breakpoint), GDB sends 'z' commands ("remove breakpoint") to tell stub to remove all active software breakpoints. This might be so that when you examine instructions, you will see the normal ones, rather than inserted breakpoint instructions. Note that when execution is later resumed, the normal instruction at this breakpoint will be executed, rather than the breakpoint instruction (otherwise you will jump to breakpoint handler again when you try to resume).
3. When user requests to insert a software breakpoint, GDB does not immediately send 'Z' command ("insert breakpoint").
4. When user requests to continue, GDB tells stub to single step to the next instruction. Then GDB sends 'Z' commands to insert newly requested breakpoints and temporarily removed breakpoints. This way, the breakpoint we recently hit is recovered and thus software breakpoints will persist.
5. I think GDB does not care how the stub implements single step. It simply tell the stub to single step. If hardware single step is not supported, you will need to implement software single step. Hope the above description may help someone working on GDB stub like me. Good luck with yours!
Here we are debugging a "remote" target with GDB. Unlike debugging local programs, GDB talks the remote target (the OS to be debugged) to via network/serial port connection, in a language called GDB Protocol. In this protocol, GDB send requests to the remote target to do various things, like read/write register/memory, insert/remove breakpoint/watchpoint, single step, resume execution (after single step or breakpoint), etc.
There are many articles talking about how to write a GDB stub. And you can easily find sample code, for example, remtoe.c on Linux. I am not going to repeat these things. Today I want to talk specifically about how to support software breakpoint.
If you want to play with GDB protocol, simply type in GDB prompt "set debug remote 1" so the packets sent/received will be shown on screen.
Let's assume that we want to break at a certain address. The basic idea of software breakpoint is to replace the instruction at this address with a breakpoint instruction, i.e. "INT 3" for x86 or "BRKT" for ARM. When the control flow executes to this address, the breakpoint instruction will bring you to breakpoint handler (actually an exception handler). Now GDB can interact with stub to debug the target, i.e. examine memory, insert watchpoint, etc. When the user types "continue" or "step" in GDB, the control flow on target should resume from the breakpoint.
But how to resume? Of course we should put the original instruction at breakpoint back and jump to that address. Then the breakpoint is gone and we will not break at here again. However we usually expect breakpoint to persist. After playing with GDB for a while, here is what GDB does with breakpoint:
1. GDB remembers all the breakpoints.
2. When target halts (e.g. hits a breakpoint), GDB sends 'z' commands ("remove breakpoint") to tell stub to remove all active software breakpoints. This might be so that when you examine instructions, you will see the normal ones, rather than inserted breakpoint instructions. Note that when execution is later resumed, the normal instruction at this breakpoint will be executed, rather than the breakpoint instruction (otherwise you will jump to breakpoint handler again when you try to resume).
3. When user requests to insert a software breakpoint, GDB does not immediately send 'Z' command ("insert breakpoint").
4. When user requests to continue, GDB tells stub to single step to the next instruction. Then GDB sends 'Z' commands to insert newly requested breakpoints and temporarily removed breakpoints. This way, the breakpoint we recently hit is recovered and thus software breakpoints will persist.
5. I think GDB does not care how the stub implements single step. It simply tell the stub to single step. If hardware single step is not supported, you will need to implement software single step. Hope the above description may help someone working on GDB stub like me. Good luck with yours!
Labels:
breakpoint,
debug,
GDB,
GDB Protocol,
GDB stub,
software breakpoint
Wednesday, August 8, 2012
Thursday, February 2, 2012
Monday, November 21, 2011
2011.11.20
1.解决实验室打印机不能在fedora下双面打印的问题。
重新安装打印机,在选择驱动程序的时候,选择CUPS+xxx(忘记名字)。
2.安装tex-live package。
将sty文件拷贝到/usr/share/texmf/tex/latex/pkg_name/
运行texhash,使得tex-live能够识别新的package
重新安装打印机,在选择驱动程序的时候,选择CUPS+xxx(忘记名字)。
2.安装tex-live package。
将sty文件拷贝到/usr/share/texmf/tex/latex/pkg_name/
运行texhash,使得tex-live能够识别新的package
Thursday, November 17, 2011
2011.11.17
Fedora 15 installation issues:
1.Stall on bootup.
Fedora tries to bring up wireless connection and blocks there.
Solution: disable wireless on bootup
How-To:
1.Diagnose.
Edit grub booting options, delete "rhgb" and "quiet" to disable graphics in booting. So we can see what is happening during booting.
The result is that fedora hangs when trying to bring up wireless connection. (It should do this in background but it didn't.)
2.Enter single mode to fix.
Edit grub booting options, add "single" to enter single mode.
Go to /etc/sysconfig/network-scripts and find any wireless config file.
Edit those config files, modify to "ONBOOT=no".
2.Go Issue
Can't find certain package in Go, and after compilation binary won't run.
Solution:
Make sure $GOOS and $GOARCH are correct.
ethos/etn and ethos/types should be built and installed separately.
1.Stall on bootup.
Fedora tries to bring up wireless connection and blocks there.
Solution: disable wireless on bootup
How-To:
1.Diagnose.
Edit grub booting options, delete "rhgb" and "quiet" to disable graphics in booting. So we can see what is happening during booting.
The result is that fedora hangs when trying to bring up wireless connection. (It should do this in background but it didn't.)
2.Enter single mode to fix.
Edit grub booting options, add "single" to enter single mode.
Go to /etc/sysconfig/network-scripts and find any wireless config file.
Edit those config files, modify to "ONBOOT=no".
2.Go Issue
Can't find certain package in Go, and after compilation binary won't run.
Solution:
Make sure $GOOS and $GOARCH are correct.
ethos/etn and ethos/types should be built and installed separately.
Monday, May 23, 2011
Browser automatically requesting favicon.ico
I wrote a http server using Google's GO Language. However the problem I confronted is not related to the language itself.
I think in certain situations, browsers automatically request favicon.ico as a little icon in the address bar. But my http server fails to properly handle this situation and causes itself to stuck.
It is not the same if I use nc to send request. Simply use "nc IP PORT" to connect, and then:
GET /test.html HTTP/1.0
and hit Enter two times
nc just sends and receives raw data, thus no automatic icon request. So my http server works in such situation with bug in it.
I think in certain situations, browsers automatically request favicon.ico as a little icon in the address bar. But my http server fails to properly handle this situation and causes itself to stuck.
It is not the same if I use nc to send request. Simply use "nc IP PORT" to connect, and then:
GET /test.html HTTP/1.0
and hit Enter two times
nc just sends and receives raw data, thus no automatic icon request. So my http server works in such situation with bug in it.
Tuesday, April 12, 2011
Defer, Panic, Recover: New features in GoLang
Defer can push a function call into a LIFO queue, and the function calls in this queue will execute then the surrounding function returns. Defer is perfect for cleaning procedures (like closing files after opening). Arguments are evaluated now, but deferred functions are called later.
Panic will stop the control flow of function and return immediately. Panic will trigger the execution of function calls that are previously deferred.
Wednesday, January 12, 2011
Tuesday, November 23, 2010
Go Language - 函数格式
func (p *myType) save(title string) (*page, os.Error) {
//do something here
p.value := 100
}
1.p *myType。这个类似于C++里的类的用法。save函数是类myType的一个method,在save函数里调用其成员值的时候就使用p.value这样的形式。
2.title string表示函数的参数及其类型。
3.*page, os.Error是函数的返回值。GoLanguage允许多个返回值。
//do something here
p.value := 100
}
1.p *myType。这个类似于C++里的类的用法。save函数是类myType的一个method,在save函数里调用其成员值的时候就使用p.value这样的形式。
2.title string表示函数的参数及其类型。
3.*page, os.Error是函数的返回值。GoLanguage允许多个返回值。
Monday, November 22, 2010
vim配置
配置文件位置
~/.vimrc
syntax on
自动缩进
set cindent
显示行号
set number
记住上次编辑位置
autocmd BufReadPost *\ if line("'\"") > 0 && line("'\"") <= line("$") | \ exe "normal g`\"" | \ endif
bash中使用if语句判断字符串是否匹配正则表达式
if [[ $var =~ 正则表达式 ]]; thenecho 'find it'fi
需要注意的是
1.两个[]
2.=~前后都有空格
3.正则表达式形式省略了//
Wednesday, January 13, 2010
Friday, September 19, 2008
“双规”似乎有违法之嫌
1.私设公堂
在公检法系统之外审问嫌犯(当然了,是党员嫌犯,而且是违反了党章的),本身就是对法律的亵渎,尽管双规之后嫌犯往往是被移交给公检法系统了。
2.非法拘禁
在我国,除了公检法,没有人有权扣押其他公民。被双规者往往没有与家人和律师通信的权利,也就是说他们是被孤立的囚禁在被双规的地点的。
3.可能存在包庇
因为没有根据,所以不敢妄自下定论。只是怀疑某些有足够背景的人可以逃避种种惩罚
在公检法系统之外审问嫌犯(当然了,是党员嫌犯,而且是违反了党章的),本身就是对法律的亵渎,尽管双规之后嫌犯往往是被移交给公检法系统了。
2.非法拘禁
在我国,除了公检法,没有人有权扣押其他公民。被双规者往往没有与家人和律师通信的权利,也就是说他们是被孤立的囚禁在被双规的地点的。
3.可能存在包庇
因为没有根据,所以不敢妄自下定论。只是怀疑某些有足够背景的人可以逃避种种惩罚
Sunday, August 31, 2008
对政治制度的一点感触
首先说明一点,世界是多样的,有所谓“民主国家”,也有所谓“专制国家”。
先说一下文化冲突的问题。有人说过,文化的冲突是不可调和的。当英国人看到清政府驻英大使踩着奴才的脊背上马时,感到这是对人权的极大侵犯。因为在他们的价值观里,人应该是平等的。然而当英国人提出抗议的时候,奴才反而骂道:“老子愿意,你管的着吗?”两个人都没有错,在他们各自文化的价值世界中,他们做的都是对的。在英国,人人平等;在清朝,做奴才可以出人头地。
再说一下朝鲜。朝鲜现在跟中国改革开放之前的样子是类似的,人民对党和政府具有极大的热情和支持,有时甚至堪称狂热。西方人视为空气的所谓“言论自由”基本上认为在朝鲜是不存在的:设想一下,假如有人说朝鲜当局做出的某个决定是不对的,他将受到周围人多大的舆论压力,而且他可能还会被国家安全局之类部门找去“谈话”。但是朝鲜人活的还是挺幸福的,虽然生活上很窘迫,但是因为他们对党和领导人坚定的信仰,他们心里大概还是幸福的吧。
再说中国,客观的说,中国的言论自由跟西方标准的言论自由还是有很大差距的,即不能批评中央政府,地方政府有时也会打压对自己不利的言论。有过地方领导指示警察局拘捕在网上议政的公民的事件,因为议政的内容是批评这位领导的。另外,还看到以为国内的博主发表一篇讨论刘翔退赛事件中的经济学原理的文章,被搜狐的博客管理员和谐掉了。等等等等……
但是我们不能单一的看待国内对于言论的限制,言论的管制也是有其有利一面的。我们附近的韩国、泰国,都因为没有对言论加以限制,导致国内发生了对中央政府的抗议,对其政局的稳定造成了很大的冲击。国内也发生过一些抗议,最常见的是省政府、市政府等门口举着横幅的失地农民,这种抗议一般对稳定影响不大,政府也没有予以打压。但是发生在齐鲁石化的静坐抗议事件,消息显然被当局进行了掩盖,Google的搜索结果显示出了“根据当地法律法规,部分搜索结果未予显示”的字样。这表示出,政府显然不希望事件扩大化,即希望抗议局限于齐鲁石化,而不是扩大到更大的范围内。对于这样的做法,我还是基本同意的。类似的事件在我身边也发生过,同样是搜索引擎根据地方政府的要求屏蔽了部分搜索结果,目的可能是希望在事件的调查结果出来之前尽可能少的人知道,从而抑制谣言。
尽管言论管制有其有利的一面,我们还是要警惕这种管制被滥用。滥用言论管制最直接的后果是,人人自危,国民对政治闭口不谈,或是只敢按照当局设定的舆论导向说话。这样显然不利于社会主义民主化建设,因为民主跟科学类似,是需要百家争鸣的。倘若政府不能接受民间的反对言论,那么我们将回到“三个凡是”的时代。
说的顺序有点乱,呵呵,观者包涵一下吧。
由于文化之间,还有政治制度之间的差别,西方人对我们的政治感受的了解实际上是有或多或少的偏见的,即认为我们需要像他们的社会一样的“民主”“言论自由”。加之对于中国的情况的了解本身是有偏差的(由于长期受西方媒体有色眼镜的影响,这算是恶性循环吧),他们可能将自己看做是来“解放”中国的人,对中国的评论有时会是瞎指手画脚。
今天先睡了,以后接着写
先说一下文化冲突的问题。有人说过,文化的冲突是不可调和的。当英国人看到清政府驻英大使踩着奴才的脊背上马时,感到这是对人权的极大侵犯。因为在他们的价值观里,人应该是平等的。然而当英国人提出抗议的时候,奴才反而骂道:“老子愿意,你管的着吗?”两个人都没有错,在他们各自文化的价值世界中,他们做的都是对的。在英国,人人平等;在清朝,做奴才可以出人头地。
再说一下朝鲜。朝鲜现在跟中国改革开放之前的样子是类似的,人民对党和政府具有极大的热情和支持,有时甚至堪称狂热。西方人视为空气的所谓“言论自由”基本上认为在朝鲜是不存在的:设想一下,假如有人说朝鲜当局做出的某个决定是不对的,他将受到周围人多大的舆论压力,而且他可能还会被国家安全局之类部门找去“谈话”。但是朝鲜人活的还是挺幸福的,虽然生活上很窘迫,但是因为他们对党和领导人坚定的信仰,他们心里大概还是幸福的吧。
再说中国,客观的说,中国的言论自由跟西方标准的言论自由还是有很大差距的,即不能批评中央政府,地方政府有时也会打压对自己不利的言论。有过地方领导指示警察局拘捕在网上议政的公民的事件,因为议政的内容是批评这位领导的。另外,还看到以为国内的博主发表一篇讨论刘翔退赛事件中的经济学原理的文章,被搜狐的博客管理员和谐掉了。等等等等……
但是我们不能单一的看待国内对于言论的限制,言论的管制也是有其有利一面的。我们附近的韩国、泰国,都因为没有对言论加以限制,导致国内发生了对中央政府的抗议,对其政局的稳定造成了很大的冲击。国内也发生过一些抗议,最常见的是省政府、市政府等门口举着横幅的失地农民,这种抗议一般对稳定影响不大,政府也没有予以打压。但是发生在齐鲁石化的静坐抗议事件,消息显然被当局进行了掩盖,Google的搜索结果显示出了“根据当地法律法规,部分搜索结果未予显示”的字样。这表示出,政府显然不希望事件扩大化,即希望抗议局限于齐鲁石化,而不是扩大到更大的范围内。对于这样的做法,我还是基本同意的。类似的事件在我身边也发生过,同样是搜索引擎根据地方政府的要求屏蔽了部分搜索结果,目的可能是希望在事件的调查结果出来之前尽可能少的人知道,从而抑制谣言。
尽管言论管制有其有利的一面,我们还是要警惕这种管制被滥用。滥用言论管制最直接的后果是,人人自危,国民对政治闭口不谈,或是只敢按照当局设定的舆论导向说话。这样显然不利于社会主义民主化建设,因为民主跟科学类似,是需要百家争鸣的。倘若政府不能接受民间的反对言论,那么我们将回到“三个凡是”的时代。
说的顺序有点乱,呵呵,观者包涵一下吧。
由于文化之间,还有政治制度之间的差别,西方人对我们的政治感受的了解实际上是有或多或少的偏见的,即认为我们需要像他们的社会一样的“民主”“言论自由”。加之对于中国的情况的了解本身是有偏差的(由于长期受西方媒体有色眼镜的影响,这算是恶性循环吧),他们可能将自己看做是来“解放”中国的人,对中国的评论有时会是瞎指手画脚。
今天先睡了,以后接着写
Saturday, August 30, 2008
麦当劳、肯德基潜在的逃税能力简析
仅以麦当劳分析,二者的情况很大程度上是类似的。一下的分析是非常粗略的,因为我们得到的数据是很有限的。
麦当劳在北京拥有近100家店面,据熟人介绍,每家店面的日流水金额,大的店面如西单店之类大约是10万元,一般的店面为2-3万元。在每天营业的高峰期(也就是行业内称为的餐期),店面内的顾客一直要排长队。这就是为什么他的店面需要每天出动押运车来提走现金收入。
按照我国法律,麦当劳属于服务业,营业税税率是5%。假如以每店3万元的日流水计算,每店的每日应收营业税税额为30000*5%=1500元,北京100家店的税款应为15万元。营业税属于地税局的征收范围,与国税局无关。地税局对营业税的征收额度的认定主要是两个方面,一是企业上报的营业额,二是地税局对这个营业额的认可(即是否认为企业上报的营业额是可信的)。企业自然希望少报营业额,而地税局对于企业上报营业额的认可很大程度上是取决与税务人员的主观因素的。在中国,目前在法制的框架下很大程度上还是人治的,凭借麦当劳强大的公关能力,要想取得税务局人员的放水也不难。
但是,假如企业开局了发票,情况就不同了,它必须承认开局发票的营业收入。也就是说,上报收入的弹性部分就是开具发票的金额与其实际营业金额的差值。然而这大队的顾客一般是不会主动索要发票的(这当然是麦当劳所希望看到的),而店员也不会主动提供发票。也就是说其收入几乎都是弹性的,想报多少就是多少(前提是别太夸张)。
假设要求开具发票的顾客占到5%(实际上恐怕不一定达到这个数字),那么其日应交税额的弹性部分就是15万元*95%=14.25万元。每年是14.25*365.25=5204.8125万元(按照365.25天计算是考虑到闰年)。也就是说,仅北京的麦当劳每年最多可以逃税5千多万。加上肯德基,并且我们假设肯德基的情况跟麦当劳一样,二者加起来最多可以在北京逃税1亿多。
假设我们再考虑其它税种,如企业所得税等。企业所得税的税率是20%。如果我们按照最坏的假设,即麦当劳按照最低收入和最高成本上报纳税额,那么其可逃的企业所得税=隐瞒的收入*税率。但是实际情况很可能不是这样的,虽然对于餐饮业来说,其各项成本之和应该占总收入的不超过五分之一,否则其不赚钱,也就是说其实际成本约为总收入的20%,高于5%的营业税纳税比例。由于上报的收入应该超过成本(否则麦当劳早该关门啦),那么其在上报企业所得税的时候应该上报收入不少于实际收入的20%。那么营业税潜在逃税能力必须重新计算,即按照20%的比例计算上报金额,重新计算之后的营业税逃税金额最大值为4383万元,麦当劳加上肯德基的总金额认为是8766万元。此处的企业所得税逃税能力我不是很清楚,希望网友能够帮助补全。
PS:强调一下,本文的根据是十分有限的,分析时经常是以最坏的假设来计算的,所以麦当劳和肯德基的实际逃税金额(if they ever 逃税),可能是低于上述数字的。本文不表示作者认为麦当劳与肯德基有任何实际的逃税行为,文中分析仅仅是从学术的角度探讨一种可能性,而这种逃税的可能性对于中国本土的饮食企业也是存在的,文章例举企业仅为行业典型代表,作者无恶意攻击之意图。
麦当劳在北京拥有近100家店面,据熟人介绍,每家店面的日流水金额,大的店面如西单店之类大约是10万元,一般的店面为2-3万元。在每天营业的高峰期(也就是行业内称为的餐期),店面内的顾客一直要排长队。这就是为什么他的店面需要每天出动押运车来提走现金收入。
按照我国法律,麦当劳属于服务业,营业税税率是5%。假如以每店3万元的日流水计算,每店的每日应收营业税税额为30000*5%=1500元,北京100家店的税款应为15万元。营业税属于地税局的征收范围,与国税局无关。地税局对营业税的征收额度的认定主要是两个方面,一是企业上报的营业额,二是地税局对这个营业额的认可(即是否认为企业上报的营业额是可信的)。企业自然希望少报营业额,而地税局对于企业上报营业额的认可很大程度上是取决与税务人员的主观因素的。在中国,目前在法制的框架下很大程度上还是人治的,凭借麦当劳强大的公关能力,要想取得税务局人员的放水也不难。
但是,假如企业开局了发票,情况就不同了,它必须承认开局发票的营业收入。也就是说,上报收入的弹性部分就是开具发票的金额与其实际营业金额的差值。然而这大队的顾客一般是不会主动索要发票的(这当然是麦当劳所希望看到的),而店员也不会主动提供发票。也就是说其收入几乎都是弹性的,想报多少就是多少(前提是别太夸张)。
假设要求开具发票的顾客占到5%(实际上恐怕不一定达到这个数字),那么其日应交税额的弹性部分就是15万元*95%=14.25万元。每年是14.25*365.25=5204.8125万元(按照365.25天计算是考虑到闰年)。也就是说,仅北京的麦当劳每年最多可以逃税5千多万。加上肯德基,并且我们假设肯德基的情况跟麦当劳一样,二者加起来最多可以在北京逃税1亿多。
假设我们再考虑其它税种,如企业所得税等。企业所得税的税率是20%。如果我们按照最坏的假设,即麦当劳按照最低收入和最高成本上报纳税额,那么其可逃的企业所得税=隐瞒的收入*税率。但是实际情况很可能不是这样的,虽然对于餐饮业来说,其各项成本之和应该占总收入的不超过五分之一,否则其不赚钱,也就是说其实际成本约为总收入的20%,高于5%的营业税纳税比例。由于上报的收入应该超过成本(否则麦当劳早该关门啦),那么其在上报企业所得税的时候应该上报收入不少于实际收入的20%。那么营业税潜在逃税能力必须重新计算,即按照20%的比例计算上报金额,重新计算之后的营业税逃税金额最大值为4383万元,麦当劳加上肯德基的总金额认为是8766万元。此处的企业所得税逃税能力我不是很清楚,希望网友能够帮助补全。
PS:强调一下,本文的根据是十分有限的,分析时经常是以最坏的假设来计算的,所以麦当劳和肯德基的实际逃税金额(if they ever 逃税),可能是低于上述数字的。本文不表示作者认为麦当劳与肯德基有任何实际的逃税行为,文中分析仅仅是从学术的角度探讨一种可能性,而这种逃税的可能性对于中国本土的饮食企业也是存在的,文章例举企业仅为行业典型代表,作者无恶意攻击之意图。
开博
本来想的是注册一个Google的博客,结果发现原来这就是传说中的blogspot
当初还担心Google的博客是不是会被GFW屏蔽什么的,但是就完全的相信了所谓的blogspot
欢迎大家来瞧瞧,呵呵
希望跟大家讨论一下政治经济方面的问题
当初还担心Google的博客是不是会被GFW屏蔽什么的,但是就完全的相信了所谓的blogspot
欢迎大家来瞧瞧,呵呵
希望跟大家讨论一下政治经济方面的问题
Subscribe to:
Posts (Atom)