2010年1月11日

征集各位朋友的博客地址

Hi,

我的同学/亲人/朋友们,如果你们看到这篇文章,麻烦将您的博客地址发给我

这样我就可以没事的时候去看看

现在工作的确挺忙的,但是我还是会忙里偷闲的拿Google Reader去看看别人的博客、IT新闻等等

所以告诉我 你的博客地址吧,thx ~

2009年12月31日

20种语言打印出来的“祝大家新年快乐”

powerBuilder:messagebox("祝大家新年快乐")
C:printf("祝大家新年快乐");
C++ : cout<<"祝大家新年快乐";
QBasic : Print "祝大家新年快乐"
Asp : Response.Write "祝大家新年快乐"
PHP : echo "祝大家新年快乐";
JScript: alert("祝大家新年快乐")
VBScript:MsgBox "祝大家新年快乐"
Jscript:document.write("祝大家新年快乐")
Delphi: ShowMessage('祝大家新年快乐!');
VB: Msg("祝大家新年快乐!")
VC: MessageBox("祝大家新年快乐!");
shell: echo 祝大家新年快乐
perl: print '祝大家新年快乐'
java: System.out.println("祝大家新年快乐");

C#:System.Console.WriteLine("祝大家新年快乐!")
COBOL:DISPLAY '祝大家新年快乐!
Python:print("祝大家新年快乐!")
AS:Alert.show("祝大家新年快乐!")

--
以上是我Copy别人的,下面的是Google今年推出的Go语言的

Go语言:fmt.Printf("祝大家新年快乐!")

2009年12月27日

闲聊手机开发

哇,突然发现自己已经有40多天没更新博客了

今天看了几篇Android App开发的教程,Android目前已经出了2.01版,UI已经很炫了。因为一些需要,前几天下载了Android源代码,看了看;后来编译下,结果发现我的Dell Notebook已经落伍很多了,编译用了很久(大概是网上说的时间的两倍);之后启动emulator之后,非常慢...。(Mac, Mac,我期待淘汰这个Dell的日子)

手机开发和PC上开发一个不同之处就是,需要先在模拟器上运行,之后再拿到真机上调试,而有的时候这两者的运行情况会不同的。然后就需要重新烧录app,当然有的时候甚至要重新烧录整个系统。烧录的过程往往比较费时的。

想到以前做实习的时候开发iPhone的App,开发工具也是非常好用调试很方便的。良好的开发工具会给Developer一个很好的感觉,然后他们会愿意尝试Hello word,进而深入。

当然很重要的还有及时更新的教程。Android和iPhone的那是非常非常多的。

Android推荐一个IBM的教程《用Eclipse 开发 Android应用程序

iPhone的教程我觉得还是官方的视频比较好。(目前iTune U上可以免费下载了一个iPhone Programming课程的所有视频,这可是Apple专门在Stanford开设的课程,都是Apple Engineer授课~)

2009年11月15日

Tor的安装以及使用中的问题

下载Tor

给Tor的邮箱地址发一封邮件,主题"help",正文空,邮箱地址为gettor@torproject.org
等会会给你回一封邮件,让你选Tor的类型,这里选择免安装版本(这个版本带有一个firefox,pidgin,vidalia,都已经配置好了),直接回复tor-im-browser-bundle即可
等会你就会收到一封带附件的邮件,25M左右,注意用GMAIL会比较好,我这里是用的Gmail

Tor 提示 connecting to a relay directory failed(no route to host)的解决方法


下载完后启动,遇到这个问题了,因为ISP已经屏蔽了Tor,这么解决:
vidalia 控制面板的状态是:connecting to a relay directory failed(no route to host)

这是因为ISP阻挡了对tor网络的连接,只需找到网桥添加进去即可。以下为解决方法。
https://www.gmail.combridges@torproject.org发一封内容为get bridges的邮件,主题随意。

接下来你会收到一封系统回信。

Here are your bridge relays:
bridge 24.138.9.251:443
bridge 85.176.10.100:442
bridge 87.118.105.203:443

在Vidalia 的 Network settings(网络设置)页面,选中 "My ISP blocks connections to the Tor network"(我的 ISP 阻挡了对 Tor 网络的连接)项,一次一个的将网桥地址(只须复制地址和端口就可以)加入设置中,即将网桥地址粘帖到"Add a Bridge"(添加一个网桥)框中,点击 "+"。

重启tor,一切ok,这样你的Tor就可以用了。

我使用中发现速度是比较慢的,然后有的时候会有连不上的情况,多试几次,还要经常换bridge...

2009年11月12日

Google的Go语言: Python和C++相结合的全新编程语言

开发者的一个重大新闻:Google刚刚发布了一个开源的编程语言,它叫做Go。
Google公司表示,Go是实验性的,它具有像C++这样的编译语言的性能和安全,以及Python这样的动态语言的速度。
Go的官方吉祥物是一个叫做Gordon的北美地鼠

以下是Google在其博客描述Go的帖子:

Go尝试结合Python这样动态语言的开发速度以及C或C++这样编译语言的性能和安全。
到目前为止,在Go的实验中,普通的编译在瞬间完成,甚至大的二进制文件编译也是短短的几秒钟。
而编译的代码的运行速度已经接近C语言。Go就是为了速度而设计。
我们希望Go能成为是一个伟大的系统级编程语言,支持多线程和全新的轻量级的面向对象设计,像真正的关闭,反映了一些很酷的功能。

欲了解更多详情,请访问www.golang.org

立马来开始Go吧,这里是Hello world实例程序。

package main
import fmt "fmt"
func main() {
   fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界n");
}

PS:我注册了一个Go的域名,www.go-lang.cn

2009年10月30日

以下编程中问题,你符合多少?

整理自《代码大全2》的"重构",这些问题我们应该都会遇到,加粗的是我自己觉得比较常见的

  1. 代码重复——提一个函数出来吧,Don't Repeat Yourself!
  2. 冗长的子程序——最好不要超过一屏
  3. 循环过长或嵌套过深——创建子程序
  4. 内聚性太差的类——拆分为多个类吧
  5. 类的接口未能提供层次一致的抽象——不要草率的修改当初的设计
  6. 拥有太多的参数——子程序的接口显然没设计好
  7. 类的内部修改往往被局限于某个部分——是不是改拆分为两个类了
  8. 变化导致对多个类的相同修改——这组类需要重新组织了
  9. 对继承体系的同样修改
  10. case语句需要做相同的修改——是否该换位继承了?
  11. 同时使用的相关数据并未以类的方式进行组织——是否该组成一个类了?
  12. 成员函数使用其他类的特征比使用自身类的特征还要多——把这个子程序挪走吧
  13. 过多使用基本数据类型——有的时候应该创建类了吧
  14. 某个类无所事事——功能转移,然后删掉它吧
  15. 一系列传递流浪数据的子程序——子程序的接口是一致的么?
  16. 中间人对象无事可做——去掉它吧
  17. 某个类同其他类关系过于亲密——封装!
  18. 子程序命名不恰当——赶紧改名吧
  19. 数据成员被设置为共有——藏起来吧
  20. 某个派生类仅使用了基类的很少一部分成员函数——is-a换成has-a的关系
  21. 注释被用于解释难懂的代码——不要为拙劣的代码编写文档,应当重写代码
  22. 使用了全局数据——改成通过子程序访问吧
  23. 子程序调用前使用了设置代码(setup code),或在调用后使用了首位代码——子程序的接口体现了正确的抽象?(修改子程序的参数)
  24. 程序中的一些代码似乎是在将来的某个时候才会用到的——也许是画蛇添足!

标签:

迅雷威猛--破墙那点事

昨日写了篇博客,用Gmail发布的,但是今天去刷博客,发现还没有显示,所以决定登录博客看看怎么回事。

博客服务用的是Blogger,众所周知的原因,Blogger已经被GFW和谐N天了

去找翻墙软件吧,记得以前用过“无**览”,去Google,发现搜到的页面聊聊无几,而且基本上这些页面都打不开,最终费尽千辛万苦,还是找到了一个最新的的官方地址。

毫无疑问,官方地址一定是被访问不了的。

忽然想到迅雷无敌的资源搜集 and P2P功能

Copy进去,居然可以 :)

PS. 显然最近墙的功力大增,好多网站都不行了,记得以前Down个“无**览”啥的,是那么轻而易举,哎,时代不同了

UPDATE:
让它配合Firefox的插件Gladder一起使用,效果非常好,很方便,自由的穿梭与在墙内和墙外~~

以下截图:

当然要事先设置好Firefox的代理“HTTP代理填 127.0.0.1 端口  9666”,其它同样

标签:

2009年10月29日

大码大全2

第一次看到这本书是去年实习的时候,在那家公司的图书馆里(其实是一个书柜,技术书还是挺多的)

很厚的一本书,看了看名字,第一印象:它是一本手册,因为有一个"大全"在它的名字里,于是没怎么去看

后来在网上看到一些书评,都是夸它的好,这才后悔当时没抓住机会看看这本"大全"

不久前在网上下了电子书,哇,800多页,已经看了好些天,目前进展一半吧

虽然还没看完,我已经忍不住要说说它了

1.的确是一本"大全",关于编程方方面面都有提到,买一本是好的,但是不买的话,至少去看看电子版吧

2.内容太多,看了也记不住,只有平时遇到了书中提到的情况,才能有深刻体会的,看书的时候才会和作者产生共鸣的,所以这是本适合经常翻翻的书

3.尽量去学作者的方法吧,那可是大师的经典之作

PS.《代码大全2》PDF下载 (CSDN)

标签:

2009年10月5日

代码记录2009.10.5

昨天写的,做个记录,以免遗失

input: 正整数n
output: k个连续整数,这些连续整数的和为n
要求输出所有的情况

例如:
input: 15
output:
1 2 3 4 5
4 5 6
7 8

/*
wen qi
2009.10.5
*/
#include <math.h>
#include <iostream>
using namespace std;

typedef unsigned int U32;

typedef struct _common_divisor
{
    U32 cd;
    U32 cdd;
    _common_divisor *next;
} common_divisor;

void out(common_divisor *h);
void release(common_divisor *p);
void add_note(U32 i, U32 n_i, common_divisor **p);

int main(int argc, char* argv[])
{
    U32 i;
    U32 n;
    U32 sqrta;
    common_divisor h;
   
    while (cin>>n)
    {
        sqrta = sqrt(n);
        h.cd = n;
        h.next = NULL;
        common_divisor *p = &h;

        for (i = 2; i <= sqrta; i++)
        {
            if (n % i == 0)
            {
                if (i % 2 != 0)
                {
                    add_note(i, n / i, &p);
                }
                if ((n / i) % 2 != 0 && (n / i) < 2 * i && i * i != n)
                {
                    add_note(n / i, i, &p);
                }
            }
        }

        out(&h);
        release(&h);
    }
    return 0;
}

void add_note(U32 i, U32 n_i, common_divisor **p)
{
    (*p)->next = (common_divisor*)malloc(sizeof(common_divisor));
    *p = (*p)->next;
    (*p)->cd = i;
    (*p)->cdd = n_i;
    (*p)->next = NULL;
}

void out(common_divisor *h)
{
    U32 i;
    if (h->cd %2 != 0)
    {
        cout<<h->cd / 2<<" "<<h->cd / 2 + 1<<endl;
    }
    h = h->next;
    while (h != NULL)
    {
        for (i = h->cdd - h->cd / 2; i <= h->cdd + h->cd / 2; i++)
        {
            cout<<i<<" ";
        }
        //cout<<h->cd<<" "<<h->cdd;
        cout<<endl;
        h = h->next;
    }
}

void release(common_divisor *p)
{
    p = p->next;
    common_divisor *h = p;
    while (h != NULL)
    {
        h = p->next;
        free(p);
        p = h;
    }
}

标签:

2009年9月26日

关于内存读写越界的一点讨论(C/C++)

关于内存读写越界的一点讨论
根据最近的一点经验,先总结如下两点

1.指针强制转换的隐患
先看一个程序:
#include

void set_zero(unsigned short *p)
{
    *p = 0;
}

typedef struct
{
    unsignedchar a;
    unsignedchar b;
}test_c_c_struct;

typedef struct
{
    unsigned char a;
    unsigned short b;
} test_i_c_struct;

int main()
{
    test_c_c_struct cc;
    test_i_c_struct ic;
    cc.a = 1;
    cc.b = 1;
    ic.a = 1;
    ic.b = 1;
    set_zero((unsigned short *)&(cc.a));
    set_zero((unsigned short *)&(ic.a));
    printf("%d\n", cc.b);
    printf("%d\n", ic.b);
    return 0;
}

在未经特殊设置的VC++6.0中编译,运行输出
0
1

set_zero((unsigned short *)&(cc.a));这句中,把一个unsigned char*转换为unsigned short*,之后在set_zero函数中对对*p赋值为0,其实是把&(cc.a)为启示位置的2字节内容置为0,而cc.a本来只是占1字节的,所以其后的1字节内容也被置0了,这就是为什么printf("%d\n",cc.b);会输出0的原因。

同理printf("%d\n",ic.b);也应该输出0啊,为什么却得到了1?
这是由“内存中字节对齐”导致的。(在VC++6.0中未经特殊设置,是4字节对齐,关于字节对齐的详细情况超出本文的讨论范围。)

虽然test_i_c_struct中a只占1字节,由于字节对齐,导致其后1字节空出来不用,如果a从地址n开始,那么b就是从地址n+2开始,所以在set_zero((unsigned short*)&(ic.a));之后并未影响到ic.b的值.

2.数组越界的危险

再来看一个程序

#define ARR_LEN3
void test_array(void)
{
    int i;
    int arr[ARR_LEN];
    for (i = 0; i <= ARR_LEN; i++)
    {
       arr[i] = 0;
    }
}

如果这个程序拿去执行会得到什么结果了?

死循环!!!

可以输出i,以及arr各个元素的地址出来看看:
i      0x13ff28
arr[0] 0x13ff1c
arr[1] 0x13ff20
arr[2] 0x13ff24
arr[3] 0x13ff28 (虽然arr[3]不是arr的元素)

很容易看出来arr[3]的地址和i的地址是一样的,所以每次i == 3的时候把arr[3] = 0;等于是i = 0;那么循环仍然继续,编成了死循环。从内存地址可以看出,内存分配的时候是从高位往地位分配,数组越界访问导致了这一可怕的结果。

标签: