存档

‘心得笔记’ 分类的存档

Google各种服务的IPv6 Hosts地址

2012年4月26日  16,238 views 6 条评论

之前本博客写过一篇可以通过修改本地Hosts文件来访问Google +的文章,陆陆续续获得了1w+的点击量。不过后来因为没有一直更新IP,貌似现在那些IP都已经不好用了,所以今天我又去网上淘了一套Google服务IPv6的Host地址。

刚刚试了一下,效果非常理想,G+、Docs、Drive、Youtube都无障碍访问。为了防止以后找不到这些数据了,现将Host内容附录于下。在此感谢文档原作者Versus Clyne。

原文档地址:https://docs.google.com/Doc?docid=0ARhAbsvps1PlZGZrZG14bnRfNjFkOWNrOWZmcQ

本站镜像页面(防止docs访问不了):http://test.codeup.org/Google-hosts-IPv6.htm

Hosts文件

鉴于拷贝下文比较费事,我将我本地的Host文件附在这里,大家可以直接下载替换。

hosts文件存放位置:

Windows:%SystemRoot%\system32\drivers\etc\          例如C:\Windows\system32\drivers\etc

Linux:/etc

  hosts (301.5 KiB, 2,751 hits)

Hosts文件内容

#Google和各种网站的IPv6服务hosts

#利用IPv6技术翻墙,保证Google服务可用,校园网用户使用IPv6应该不收取上网费用(至少我们学校如此)

#最下方有各种网站的IPv6 hosts列表

#欢迎转载,请注明来源,以便网友及时更新,谢谢

#本文的发布地址:http://docs.google.com/View?id=dfkdmxnt_61d9ck9ffq

#本文的共享链接:http://docs.google.com/Doc?docid=0ARhAbsvps1PlZGZrZG14bnRfNjFkOWNrOWZmcQ

#有新的Google地址需要添加?请在这里提交或在线编辑,帮助完善此列表,谢谢~

#欢迎穿越传阅

# 5/7 v*.lscache*.l.google.com IP 地址变更(youtube 视频储存服务器除外,谁有日本 yt 的 IP 告诉我- -),由日本东京改为澳洲悉尼,速度我测试变快了
# 5/10 更新 v*.lscache*.c.google.com 感谢 JL Hwung 的提供
# 7/12 《电脑报》你威武!(2010年7月12日G14版第四列)
# 您正在查看的版本更新于 2012-04-25;详细更新日志请见 http://code.google.com/p/ipv6-hosts/source/list (RSS 链接

#顺便提供能够解析出 Google IPv6 地址的 DNS 服务器 (其 ISP 已加入 Google over IPv6 计划),这样不需要修改 hosts,只需改变本机 DNS 设置就可以自动解析出 IPv6 地址,由HE提供:2001:470:20::2 ordns.he.net (ipv6) 74.82.42.42 (ipv4,在内地可能会遭污染,可以和本 hosts 文件配合使用 by www.lostriver.net)

#最近好像有0.5不停的在举报本文有不适宜内容(滥用行为),然后接连收到10余封google发来的本文审核通过可以发表的邮件,建议大家备份一下本文,免得某些人把本文404,reset什么的之类- -

#用文本编辑器打开hosts文件,将以下内容复制进去,保存即可(hosts 文件没有后缀)

#Windows 用户可以以管理员身份直接运行 notepad “%SystemRoot%\system32\drivers\etc\hosts” 进行编辑

#Linux 用户在终端中执行 sudo gedit /etc/hosts 即可开始编辑

#关闭某个IPv6的转发请在那一行的最前面添加#号,启用请去除最前面#号,每行中间的#号是为了区分地址和注释,不用理睬- -

阅读全文…

【细节决定成败】switch篇

2012年4月15日  1,850 views 没有评论

前几天在给埃及局点提供补丁时犯了个低级错误,在switch的一个case中忘了写break语句,造成功能在大部分情况下都是正常的,只有个别场景出现了很诡异的问题,通过函数入参日志还看不出任何问题。

由于switch的各case之间肯定是非常相似的,所以这种问题造成的后果不一定能够立即体现出来,因为执行了下一个case中的逻辑后返回的结果很有可能也是正确的。

这种错误是非常低级的,低级到我都不太好意思写在这里了。但是这种错误又感觉很容易发生,这已经不是我第一次犯这种错误了。之前在做PMS插件时也发生过一次,那次也是功能在部分情况下很正常,只在一种很特殊的场景下会有问题。上次也是定位了很久才发现是个如此低级的问题。已经在同一个地方跌倒了两次,那么绝对不能再有第三次……

今天稍微总结了一下犯这种错误的原因,主要分成两个场景:

1、新写一个switch语句,在写完一个case后直接开始逻辑处理,如果这个case下的逻辑比较复杂,很有可能在写完逻辑后就忘了写break语句了。

2、修改原有的switch语句,有时候修改某个case语句,直接把此case下的所有语句都干掉重写,这时候很容易把break语句一起干掉了。然后在写新的逻辑时就很有可能只关注新的逻辑而遗漏了这个break语句。

之前犯错的两次分别就是以上两种场景,说白了就是只关注case下的逻辑而忽略了switch语句的本身。现在我能想到的预防措施就是要向括号配对一样检查case与break的配对情况,每写一个case语句后首先把break加上。

与此类似的还有if else,有时候也会存在if下逻辑复杂,写完后忘记else分支的情况。为预防此种情况,在写完if语句后必须将else语句先写下来,哪怕else下是个空语句。

分类: 心得笔记 标签: , , ,

【笔记迁移】C++Primer笔记 2010/9/8

2012年2月29日  1,974 views 没有评论

13章复制控制


智能指针类的实现是通过使用计数类来管理指针成员的。计数类将指针成员再次封装,并含有一个计数器来记录有多少个对象包含这个指针成员。需要注意的是要将使用计数类的类设为友元。同时在计数类的友元类中要转换对指针的操作为对计数类的对象的操作。在复制的时候,首先将左操作数的计数类对象减一(如果计数器减一后为零,则删除对象),然后将右操作数的计数类对象赋值给做操作数,这样左右操作数共用同一个计数器类的对象,同一个指针只有一个计数器类的对象。析构函数中也要对计数类的计数器进行操作(减一,为零则删除)。

让智能指针负责删除共享对象,可以避免悬垂指针的出现。

class U_Ptr{
    friend class HasPtr;
    int *ip;
    size_t use;
    U_Ptr(int *p):ip(p),use(1){}
    ~U_Ptr(){delete ip;}
};//这是一个计数类的示例。

智能指针


值型类给指针成员提供值语义将对指针的操作变为对指针所指向的值的操作,复制值型对象时,会得到一个不同的新副本,对副本所做的改变不会反映在原有对象上,反之亦然。
这样就解决了所有因共享对象而产生的一系列的问题,但是同时也不可以使用共享对象了。


复制构造函数,赋值操作符,析构函数 这三者是紧密联系的,如果定义了其中一个,一般也要定义剩余的两个。这三个函数时“复制控制”函数的主要部分,
他们定义了复制、赋值或撤销该类型对象的含义,对特殊的成员进行管理。
定义复制控制函数最为困难的部分通常在于认识到他们的必要性。分配内存或其他资源的类几乎总是需要定义复制控制函数来管理所分配的资源。


14章重载操作符与转换


内置逻辑与(&&)和内置逻辑或(||)操作符使用短路求值,如果重新定义该操作符,丢失操作符的短路求值特征。


如果要将类用作关联容器键类型,则应定义<操作符和==操作符,因为许多算法假定这些操作符石存在的。例如sort算法使用<操作符,而find算法使用==操作符。
如果定义了==操作符,相应的也应该定义不等操作符!=。而如果定义了<或某个关系操作符,则应将全部四个关系操作符都定义(>,>=,<,<=)。

//重载了某个操作符,则应将其相关的其他操作符也要重载


成员与非成员操作符重载:

  • 成员操作符重载有一个默认的参数即当前对象的this指针,这是默认的左操作数,所以复制运算符=重载时只需要一个右操作数作为参数既可。ClassType& operator = (const ClassType&);
  • 当左操作数不是当前类的对象时,我们就必须使用非成员实现方式,例如输出操作符<<的左操作数应该是ostream对象。ostream& operator<< (ostream& out,const ClassType& s);//二元操作符重载时第一个参数为左操作数,第二个参数为右操作数。

一般非成员实现时要在类中显式声明此重载函数

成员与非成员


成员或非成员实现 :

  • 赋值(=)、下标([])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些定义为非成员函数将在编译时出错。
  • 改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减和解引用,通常应定义为成员函数。
  • 对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为普通非成员函数。

成员与非成员


当重载输出操作符的时候所做的格式或应尽量的少尤其不要输出换行符,如果需要对输出进行格式化,我们应该让用户自己来控制输出细节。

阅读全文…

【笔记迁移】C++Primer笔记 2010/9/6

2012年2月29日  3,060 views 3 条评论

13章复制控制


编写自己的复制构造函数时,必须显式复制需要复制的任意成员。显示定义的复制构造函数不会进行任何自动复制。


即使对象赋值给自己,赋值操作符的正确工作也非常重要。保证这个行为的通用方法是显式检查对自身的赋值。最需要注意的是在赋值的时候做操作数的删除操作,如果不进行检查,
可能会出现先删除之后又将已经删除掉的数据赋值给做操作数,造成数据丢失。


【笔记迁移】C++Primer笔记 2010/9/12

2012年2月27日  1,657 views 没有评论

C++Primer笔记 2010/9/12


15章面向对象编程


继承和构造函数:在派生类的构造函数中不能通过初始化列表直接初始化继承成员的值,但是可以在初始化列表中包含基类的构造函数来初始化基类对象。派生类构造函数总是默认的先执行基类的构造函数然后再执行派生类的初始化列表,然后是派生类构造函数函数体。 在多重继承中,派生类只能初始化直接基类,因为直接基类对它的基类已经有了处理,所以派生类只需要对自己的直接基类进行初始化就可以了。
继承, 构造函数


继承和复制控制:派生类和基类的复制控制是分开的,当使用默认的复制控制函数的时候,首先调用基类的默认复制构造函数,然后调用派生类的复制构造函数。但是一旦派生类定义了自己的复制构造函数,那么该定义将完全覆盖默认定义,在此复制构造函数中必须显式调用基类的复制构造函数,否则将会调用基类的默认构造函数对基类对象进行初始化,这会出现令人难以理解的配置:它的基类部分将保存默认值,它的自有成员部分将是另一对象的副本。

示例:

class base{};
class child : public base{
    child(const child&amp; d):base(d)/* other member initialization */{}
}

继承, 复制构制造函数


继承和赋值操作符:赋值操作符必须防止自身赋值,这是首先要注意的。如果派生类显式定义了自己的赋值操作符,那么必须显式调用基类的赋值操作符来为基类对象赋值。
继承, 赋值操作符


继承和析构函数:派生类不需要注意基类的析构函数,编译器总是显示调用派生类对象的基类部分的析构函数,调用顺序与构造顺序相反。
继承, 析构函数


虚析构函数:为了能够在删除动态绑定指针时调用正确的析构函数,可以将基类的析构函数设为虚函数,这样删除时将调用动态绑定的真实对象的析构函数。基类析构函数几乎总是需要定
义为虚析构函数。而且虚析构函数和其他析构函数一样,如果层次中根类的析构函数为虚函数那么派生类的析构函数也将是虚函数,无论是否有显式定义。

析构函数, 虚函数


局部作用域中声明的函数不会重载全局作用域中定义的函数,派生类中定义的函数也不重载基类中定义的成员。所以说重载只会发生在同级作用域中,是一种横向操作。
如果不在派生类中定义此函数,那么可以使用派生类对象调用所有基类中此函数的重载版本,但是如果在派生类中定义了此函数名的函数,不管函数原型是否相同,都无法再通过派生类对象访问这些重载版本了。如果派生类希望使用自己定义的一个版本的此函数,同时又使用基类所定义的所有重载版本(这些版本的函数,函数原型各不相同)那么要么在派生类中重新定义所有的重载版本,要么为重载成员提供using声明。一个using声明只能指定一个名字,不带形参表。例如:在派生类中添加using base::out;就可以在派生类中重载基类的out成员了。

重载, 作用域, using


【笔记迁移】C++Primer笔记 2010/9/11

2012年2月26日  1,974 views 没有评论

15章 面向对象编程


引用和指针的静态类型(在编译时可知的引用类型或指针类型)与动态类型(指针或引用所绑定的对象的类型,这是仅在运行时可知的)可以不同,这是C++用以支持多态性的基石。


使用作用域限定符可以覆盖虚函数机制并强制函数调用使用虚函数的特定版本。
示例:

Item_base *baseP = &child;
double d = baseP ->Item_base::net_price(42);

这段代码将强制调用Item_base中定义的net_price版本,不会随baseP指针实际指向的对象而变化。
派生类虚函数调用基类版本时,必须显式使用作用于限定符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将会是一个自身调用,从而导致无穷递归。
虚函数


虚函数的默认实参的值由调用该函数的类型定义,与对象的动态类型无关。 在同一虚函数的基类版本和派生类版本中使用不同的默认实参几乎一定会引起麻烦。如果通过基类的引用或指针调用虚函数,但实际执行的是派生类中定义的版本(引用或指针所指对象实际为派生类对象),这时就可能会出现问题,此时,为虚函数的基类版本定义的默认实参将传递给派生类定义的版本,
而派生类版本是用不同的默认实参定义的。

虚函数, 默认实参


所有的基类与派生类的关系应该遵循 派生类应反映与基类的“是一种(is a)”关系。
继承


派生类可以恢复继承成员的访问级别。例如类A private实现继承类B,类B中有Public成员size,那么,在类A的public部分中增加using声明即可。
示例:

class A :private B{
public:
using B::size;
}

派生类可以恢复继承成员的访问级别,但是不能使访问级别比基类中原来指定的更严格或更宽松。
使用class保留字派生时默认具有private继承,使用struct时默认具有public继承,但是使用默认继承是非常罕见的,不论何时都应显式指明继承的派生保护级别。
继承, 访问级别


继承与静态成员:如果基类定义了static成员,则整个继承层次中只有这一个这样的成员。无论从基类派生出了多少个派生类,所有这些类在访问static成员时所访问的是同一个成员。
继承, static


基类与派生类的转换:派生类可以转换为基类但仅仅局限于引用与指针还有用派生类对象对基类对象进行初始化,初始化时派生类的自有部分被忽略。
从基类到派生类没有自动的转换,就算是基类的指针指向派生类对象,当用这个指针给派生类指针赋值时也会出现编译错误,因为编译器无法只掉动态的绑定是否安全,只能通过静态类型来盘判断操作是否安全,如果此操作真的安全,那么可以使用static_cast强制编译器进行转换,或者使用dynamic_cast申请在运行时检查。

继承, 转换


分类: 心得笔记 标签: , , ,