• 代理模式(proxy pattern),调停者模式(mediator pattern)以及迭代器模式(iterator)

      0 comments

    假想一个场景,需要通过迭代器来访问元素的后继(Binary Tree)

    BinaryTree 类实现基本的二叉树的插入查找等功能:
    01 public class BinaryTree {
    02 public Node head;
    03
    04 public Node findMinNode(Node node{
    05 Node temp = node;
    06 if (temp == null{
    07 return null;
    08 }
    09 while (temp.getLeftNode() != null{
    10 temp = temp.getLeftNode();
    11 }
    12 return temp;
    13 }
    14
    15 public Node findMaxNode(Node node{
    16 Node temp = node;
    17 if (temp == null{
    18 return null;
    19 }
    20 while (temp.getRightNode() != null{
    21 temp = temp.getRightNode();
    22 }
    23 return temp;
    24 }
    25
    26 public Node searchNode(int x{
    27 Node node = head;
    28 Node node1 = head;
    29 if (head == null)
    30 return null;
    31 while (node1 != null{
    32 node = node1;
    33 if (node.getElement() == x{
    34 return node;
    35 } else if (node.getElement() > x{
    36 node1 = node.getLeftNode();
    37 } else {
    38 node1 = node.getRightNode();
    39 }
    40 }
    41 return null;
    42 }
    43
    44 public Node successor(Node x{
    45 if ((x == null) || (searchNode(x.getElement()) == null)) {
    46 return null;
    47 }
    48 if (x.getRightNode() != null{
    49 return findMinNode(x.getRightNode());
    50 }
    51 Node y = x.getFather();
    52 while ((y != null&& (x == y.getRightNode())) {
    53 x = y;
    54 y = y.getFather();
    55 }
    56 return y;
    57 }
    58
    59 public void insert(int element{
    60 Node temp = head;
    61 Node temp1 = head;
    62 while (temp1 != null{
    63 temp = temp1;
    64 if (temp.getElement() == element{
    65 return;
    66 } else if (temp.getElement() > element{
    67 temp1 = temp.getLeftNode();
    68 } else {
    69 temp1 = temp.getRightNode();
    70 }
    71 }
    72 if (temp == null{
    73 head = new Node();
    74 head.setElement(element);
    75 head.setFather(null);
    76 } else {
    77 Node node = new Node();
    78 node.setElement(element);
    79 node.setFather(temp);
    80 if (temp.getElement() > element{
    81 temp.setLeftNode(node);
    82 } else {
    83 temp.setRightNode(node);
    84 }
    85 }
    86 };
    87 }
    Node节点类是基本元素
    01 public class Node {
    02 private Node father;
    03 private Node leftNode;
    04 private Node rightNode;
    05 private int element;
    06
    07 public Node getFather() {
    08 return father;
    09 }
    10
    11 public void setFather(Node father{
    12 this.father = father;
    13 }
    14
    15 public Node getLeftNode() {
    16 return leftNode;
    17 }
    18
    19 public void setLeftNode(Node leftNode{
    20 this.leftNode = leftNode;
    21 }
    22
    23 public Node getRightNode() {
    24 return rightNode;
    25 }
    26
    27 public void setRightNode(Node rightNode{
    28 this.rightNode = rightNode;
    29 }
    30
    31 public int getElement() {
    32 return element;
    33 }
    34
    35 public void setElement(int element{
    36 this.element = element;
    37 }
    38
    39 }
    下面是迭代器,主要实现基本的访问功能

    01 public class BinaryTreeIterator {
    02 Object index;
    03 BinaryTree bt;
    04
    05 public BinaryTreeIterator(BinaryTree bt{
    06 this.bt = bt;
    07 index = bt.findMinNode(bt.head);
    08 }
    09
    10 public Object first() {
    11 return bt.head;
    12 }
    13
    14 public void next() {
    15 index = bt.successor((Nodeindex);
    16 }
    17
    18 public boolean isDone() {
    19 return index == null;
    20 }
    21
    22 public Object currentItem() {
    23 return index;
    24 }
    25 }
    代理模式,封装一部分操作

    01 public class BinaryTreeProxy {
    02 private BinaryTree bt;
    03
    04 public BinaryTreeProxy(BinaryTree bt{
    05 this.bt = bt;
    06 }
    07
    08 public void insert(int element{
    09 bt.insert(element);
    10 }
    11
    12 public Node searchNode(int x{
    13 return bt.searchNode(x);
    14 }
    15
    16 public Node findMaxNode(Node node{
    17 if (node == null{
    18 return null;
    19 }
    20 if (searchNode(node.getElement()) == null{
    21 return null;
    22 }
    23 return bt.findMaxNode(node);
    24 }
    25
    26 public Node findMinNode(Node node{
    27 if (node == null{
    28 return null;
    29 }
    30 if (searchNode(node.getElement()) == null{
    31 return null;
    32 }
    33 return bt.findMinNode(node);
    34 }
    35
    36 public Node successor(Node x{
    37 if (x == null{
    38 return null;
    39 }
    40 if (searchNode(x.getElement()) == null{
    41 return null;
    42 }
    43 return bt.successor(x);
    44 }
    45 }

    Mian函数用来测试

    01 public class Main {
    02
    03 /**
    04 * @param args
    05 */
    06 public static void main(String[] args{
    07 BinaryTree bt = new BinaryTree();
    08 bt.insert(7);
    09 bt.insert(10);
    10 bt.insert(9);
    11 bt.insert(13);
    12 bt.insert(5);
    13 bt.insert(2);
    14 bt.insert(6);
    15 BinaryTreeIterator bti = new BinaryTreeIterator(bt);
    16 for(;!bti.isDone();bti.next()){
    17 System.out.println(((Node)bti.currentItem()).getElement());
    18 }
    19 }
    20
    21 }
    下面是调停者模式
    所有的参与者(Colleague)都继承该类

    01 package CardShark;
    02
    03 public class Colleague {
    04 private Mediator mediator;
    05
    06 public Colleague(Mediator mediator{
    07 this.mediator = mediator;
    08 }
    09
    10 public Mediator getMediator() {
    11 return mediator;
    12 }
    13
    14 public void setMediator(Mediator mediator{
    15 this.mediator = mediator;
    16 }
    17 }
    参与者有cardsender,player,container

    01 package CardShark;
    02
    03 public class Colleague {
    04 private Mediator mediator;
    05
    06 public Colleague(Mediator mediator{
    07 this.mediator = mediator;
    08 }
    09
    10 public Mediator getMediator() {
    11 return mediator;
    12 }
    13
    14 public void setMediator(Mediator mediator{
    15 this.mediator = mediator;
    16 }
    17 }

    001 package CardShark;
    002
    003 import java.io.BufferedReader;
    004 import java.io.IOException;
    005 import java.io.InputStreamReader;
    006
    007 public class Player extends Colleague {
    008 String name;
    009 status status;
    010 double stack;
    011
    012 public Player(Mediator mediator{
    013 super(mediator);
    014 status = status.Null;
    015 stack = 0;
    016 }
    017
    018 public void getStackBegin() {
    019 status = status.PutStack;
    020 System.out.println(“玩家 “ + name + ” 获知开始下注”);
    021 this.setStack();
    022 this.noticeNextPlayerStack();
    023 }
    024
    025 public void setStack() {
    026 System.out
    027 .print(“Hi “ + name + “,you should enter the Amount of fees:”);
    028 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    029 try {
    030 double stack = Double.parseDouble(bf.readLine());
    031 super.getMediator().addAmount(stack);
    032 System.out.println(“玩家 “ + name + “开始下注”);
    033 this.stack = stack;
    034 } catch (NumberFormatException e{
    035 e.printStackTrace();
    036 } catch (IOException e{
    037 e.printStackTrace();
    038 }
    039 }
    040
    041 public void noticeNextPlayerStack() {
    042 System.out.println(“玩家 “ + name + “通知下一个下注的玩家”);
    043 super.getMediator().noticeNextPlayerStackByPlayer();
    044 }
    045
    046 public void getGamblingBegin(Player player, double total{
    047 System.out.println(“玩家 “ + name + “接到通知开始赌博”);
    048 status = status.Gambling;
    049 if (this.isLastOne()) {
    050 this.finished(player, total);
    051 } else {
    052 this.chooseOptioins(player, total);
    053 }
    054 }
    055
    056 public void chooseOptioins(Player player, double total{
    057 String name = “暂无人下注”;
    058 if (player != null)
    059 name = player.name;
    060 System.out
    061 .print(“The last add person is “
    062 + name
    063 + ” and the total number is “
    064 + total
    065 + “. You should choose one option among add, withdraw or not set by 1,2,3(default 3)”);
    066 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    067 try {
    068 int choice = Integer.parseInt(bf.readLine());
    069 switch (choice{
    070 case 1:
    071 System.out.print(“input the amount:”);
    072 double moreStack = Double.parseDouble(bf.readLine());
    073 this.addAmount(moreStack);
    074 this.noticeNextGamblingPlayer();
    075 break;
    076 case 2:
    077 this.withdraw();
    078 break;
    079 default:
    080 this.notSet();
    081 this.noticeNextGamblingPlayer();
    082 break;
    083 }
    084 } catch (NumberFormatException e{
    085 e.printStackTrace();
    086 } catch (IOException e{
    087 e.printStackTrace();
    088 }
    089
    090 }
    091
    092 private void addAmount(double moreStack{
    093 this.stack += moreStack;
    094 super.getMediator().addStack(this);
    095 }
    096
    097 private void withdraw() {
    098 super.getMediator().withdraw(this);
    099 }
    100
    101 private void notSet() {
    102 super.getMediator().notSet(this);
    103 }
    104
    105 public void noticeNextGamblingPlayer() {
    106 super.getMediator().noticeNextGamblingPlayerByPlayer();
    107 }
    108
    109 public void sendSecondPlayerByPlayer() {
    110 super.getMediator().noticeSecondGamblingPlayer();
    111 }
    112
    113 public boolean isLastOne() {
    114 return super.getMediator().isLastOne(this);
    115 }
    116
    117 public void finished(Player player, double total{
    118 String name = “暂无人下注”;
    119 if (player != null)
    120 name = player.name;
    121 System.out.print(“赌博结束,最后下注者为  “ + name
    122 + ” 总数为 “ + total);
    123
    124 }
    125 }

    01 package CardShark;
    02
    03 public class Container extends Colleague {
    04 status status;
    05 Player lastAddMan;
    06 double totalStack;
    07
    08 public Container(Mediator mediator{
    09 super(mediator);
    10 this.status = status.Null;
    11 lastAddMan = null;
    12 }
    13
    14 public void startStack() {
    15 status = status.PutStack;
    16 totalStack = 0;
    17 System.out.println(“容器获得开始下注信息”);
    18 }
    19
    20 //开始下注或者开始加注
    21 public void addStack(double adds){
    22 totalStack+=adds;
    23 }
    24
    25 public void startGambling() {
    26 status = status.Gambling;
    27 System.out.println(“容器获得开始下赌博信息”);
    28 }
    29
    30 public status getStatus() {
    31 return status;
    32 }
    33
    34 public void setStatus(status status{
    35 this.status = status;
    36 }
    37
    38 public Player getLastAddMan() {
    39 return lastAddMan;
    40 }
    41
    42 public void setLastAddMan(Player lastAddMan{
    43 this.lastAddMan = lastAddMan;
    44 }
    45
    46 public double getTotalStack() {
    47 return totalStack;
    48 }
    49
    50 public void setTotalStack(double totalStack{
    51 this.totalStack = totalStack;
    52 }
    53
    54 }

    01 package CardShark;
    02
    03 public class CardSender extends Colleague {
    04
    05 public CardSender(Mediator mediator{
    06 super(mediator);
    07 }
    08
    09 public void startStack(){
    10 this.noticeStartStack();
    11 this.noticeNextPlayerStack();
    12 }
    13
    14 // 通知开发下注
    15 public void noticeStartStack() {
    16 System.out.println(“发牌人通知下注开始”);
    17 super.getMediator().noticeBeginStack();
    18 }
    19
    20 //通知下一个玩家下注
    21 public void noticeNextPlayerStack() {
    22 System.out.println(“发牌人通知下一个玩家开始下注”);
    23 super.getMediator().noticeNextPlayerStackByCardSender();
    24 }
    25
    26 public void GetStackInfoFromUser(){
    27 System.out.println(“发牌人受到下注信息,下注停止”);
    28 }
    29
    30 public void startGambling(){
    31 this.noticeStartGambling();
    32 this.noticeNextPlayerGamblingBySender();
    33 }
    34
    35 public void noticeStartGambling() {
    36 System.out.println(“发牌人通知容器赌博开始”);
    37 super.getMediator().noticeBeginGambling();
    38 }
    39
    40 public void noticeNextPlayerGamblingBySender() {
    41 System.out.println(“发牌人通知下一个玩家开始赌博开始”);
    42 super.getMediator().noticeBeginGamblingBySender();
    43 }
    44
    45 public void noticeSecondPlayerGamblingBySender(Player player){
    46 System.out.println(“发牌人收到”+ player.name+“通知将信息发给该用户左边的用户”);
    47 super.getMediator().noticeSecondPlayerGamblingBySender();
    48 }
    49 }

    容器的状态类

    1 package CardShark;
    2
    3 public enum status {
    4 Null,PutStack,Gambling,End
    5 }

    这个是调停者(Mediator),主要是集中式控制
    001 package CardShark;
    002
    003 import java.util.ArrayList;
    004 import java.util.Iterator;
    005
    006 public class Mediator {
    007 CardSender cardSender;
    008 ArrayList<Player> players;
    009 Container container;
    010 Iterator<Player> iterator;
    011
    012 public Mediator() {
    013 players = new ArrayList<Player>();
    014 }
    015
    016 public void registerPlayer(Player player{
    017 this.players.add(player);
    018 }
    019
    020 public void registerContainer(Container container{
    021 this.container = container;
    022 }
    023
    024 public void registerCardSender(CardSender cardSender{
    025 this.cardSender = cardSender;
    026 }
    027
    028 public void noticeBeginStack() {
    029 iterator = players.iterator();
    030 container.startStack();
    031 }
    032
    033 // 由发牌人通知下一个玩家开始下注
    034 public void noticeNextPlayerStackByCardSender() {
    035 (iterator.next()).getStackBegin();
    036 }
    037
    038 // 增加下注数量和下注金额
    039 public void addAmount(double amount{
    040 container.addStack(amount);
    041 }
    042
    043 // 由参与者通知下一个玩家开始下注
    044 public void noticeNextPlayerStackByPlayer() {
    045 if (iterator.hasNext()) {
    046 (iterator.next()).getStackBegin();
    047 } else {
    048 cardSender.GetStackInfoFromUser();
    049 }
    050 }
    051
    052 public void noticeBeginGambling() {
    053 iterator = players.iterator();
    054 container.startGambling();
    055 }
    056
    057 public void noticeBeginGamblingBySender() {
    058 (iterator.next()).getGamblingBegin(null, container.totalStack);
    059 }
    060
    061 public void addStack(Player player{
    062 container.setLastAddMan(player);
    063 container.addStack(player.stack);
    064 }
    065
    066 public void withdraw(Player player{
    067 if(isLastOne(player)){
    068 player.finished(container.lastAddMan,container.totalStack);
    069 }else if(isFirstOne(player)){
    070 cardSender.noticeSecondPlayerGamblingBySender(player);
    071 }else{
    072 Iterator<Player> temp = players.iterator();
    073 Player previousOne = temp.next();
    074 Player currentOne = previousOne;
    075 while(temp.hasNext()){
    076 previousOne = currentOne;
    077 currentOne = temp.next();
    078 if(currentOne == player){
    079 break;
    080 }
    081 }
    082 iterator = players.iterator();
    083 while(iterator.hasNext()){
    084 if(iterator.next()==previousOne){
    085 break;
    086 }
    087 }
    088 previousOne.sendSecondPlayerByPlayer();
    089 }
    090 }
    091
    092 public void noticeSecondPlayerGamblingBySender(){
    093 iterator.next().getGamblingBegin(null,container.totalStack);
    094 }
    095
    096 public boolean isFirstOne(Player player){
    097 Iterator<Player> temp = players.iterator();
    098 return temp.next()== player;
    099 }
    100
    101 public boolean isLastOne(Player player){
    102 boolean has = false;
    103 Iterator<Player> temp = players.iterator();
    104 Player player2 =null;
    105 while (temp.hasNext()) {
    106 player2 = temp.next();
    107 }
    108 return player2==player;
    109 }
    110
    111 public void notSet(Player player{
    112 System.out.println();
    113 container.addStack(player.stack);
    114 }
    115
    116 public void noticeNextGamblingPlayerByPlayer(){
    117 if (iterator.hasNext()) {
    118 (iterator.next()).getGamblingBegin(container.lastAddMan,container.totalStack);
    119 }else{
    120 System.out.println(“这是最后一个玩家,赌博结束,最后总的赌注为” + container.getTotalStack());
    121 }
    122 }
    123
    124 public void noticeSecondGamblingPlayer(){
    125 iterator.next();
    126 iterator.next().getGamblingBegin(container.lastAddMan,container.totalStack);
    127 }
    128 }
    测试类

    01 package CardShark;
    02
    03 public class Main {
    04
    05 /**
    06 * @param args
    07 */
    08 public static void main(String[] args{
    09 //初始化
    10 //新建调停者
    11 Mediator mediator = new Mediator();
    12
    13 //注册容器
    14 Container container = new Container(mediator);
    15 mediator.registerContainer(container);
    16
    17 //注册会员
    18 Player player1 = new Player(mediator);
    19 player1.name = “Tom”;
    20 mediator.registerPlayer(player1);
    21
    22 Player player2 = new Player(mediator);
    23 player2.name = “Mike”;
    24 mediator.registerPlayer(player2);
    25
    26 Player player3 = new Player(mediator);
    27 player3.name = “Jim”;
    28 mediator.registerPlayer(player3);
    29
    30 Player player4 = new Player(mediator);
    31 player4.name = “Hebe”;
    32 mediator.registerPlayer(player4);
    33
    34
    35 //注册发牌人
    36 CardSender cardSender = new CardSender(mediator);
    37 mediator.registerCardSender(cardSender);
    38
    39 //开始下注
    40 cardSender.startStack();
    41
    42 //赌博开始
    43 cardSender.startGambling();
    44 }
    45
    46 }

  • 一些有空间特性的数据结构

      1 comment

    1.1.2 EXCELL [Tamminen 1982]( Extendible CELL)

    the EXCELL method decomposes the universe regularly: all grid cells are of equal size.( In order to maintain this property in the presence of insertions, each new split results in the halving of all cells and therefore in the doubling of the directory size.)

    1.1.3 The Two-Level Grid File [Hinrichs 1985]

    The basic idea of the two level grid file is to use a second grid file to manage the grid directory.( The first of the two levels is called the root directory,which is a coarsened version of the second level, the actual grid directory.)个人觉得就是一级索引而二级索引的意思,问题是两个level可能会相互影响造成麻烦

    1.1.4 The Twin Grid File [Hutflesz et al. 1988b]

    (目的是提高空间利用率相对于original grid file,to increase space utilization)twin 意味着这两个grid file不是层次结构,两个grid file都要span整个空间,对于两个file ,P和S,如果increase in the number一方大于另一个方的时候才会造成point的转移,(P转移point到S,S overflow了而P可能反过来merge了)

    1.1.5 Multidimensional Linear Hashing

    uses no or only a very small directory(occupy relatively little storage compared to extendible hashing and usually possible to keep all relevant information in main memory) Early proposals failed to support the range queries,

    MOLHPE :a variant of linear hashing called multidimensional order-preserving linear hashing with partial expansions [Kriegel and Seeger 1986] guarantee a modest file growth,缺点是对于nonuniform distributions data,它不能gracefully adapt to them,(question 1)这是由于hashing function的缺点造成的,但是对于uniform distribution,它outperform其他的对手

    quantile hashing [Kriegel and Seeger 1987, 1989].

    利用a-quantiles来解决question1,将不是均匀分布的transformed into uniformly

    distributed values for a,该作者提出了linear order-preserving (PLOP) hashing来适应extended objects

    dynamic z-hashing [Hutflesz et al.1988a]

    它有更好的order preserving properties,uses a space-filling technique called z-ordering(disadvantage 是会generate 一些无用的block,这点与interpolation-based grid file [Ouksel 1985]相似)也不是对于不同的分布有影响

    1.2 Hierarchical Access Methods

    PAM based on binary or multiway tree structure,除了混合结构BANG file 和buddy tree,其他都不需要地址计算,而是通过buckets来组织数据,overlapping regions和partial coverage这两种技术可以用来提高SAM的性能

    1.2.1 The k-d-B-Tree [Robinson 1981]

    Balanced,没有最小的空间开销可以确保,leaf node存储 data points located in the responding partition,类似于adaptive k-d-tree和B-tree

    1.2.2 LSD-Tree [Henrich et al.1989]( Local Split Decision)

    adapts well to data that are nonuniformly distributed and that it is therefore well-suited for use in connection with the transformation technique;组织结构如adaptive k-d-tree,整个universe被partition到各种不同大小的disjoint cell.用特别的paging算法来保证preserve external balancing property;

    用两种策略来accommodate skewed data,

    two split strategies :

    ·data-dependent(SP1) local decision,equal number of objects on both sizes of the splits

    ·distribution-dependent (SP2):split is done at fixed dimension and position,assumed an underlying distribution

    SP = aSP1 +(1-a) SP2 . a 是由一个经验获得的因素,it vary as deleted and inserted operation.

    提高storage utilization的策略就是redistribute data among buckets.improve search performance for nonpoint data and range queries,auxiliary informantion on the existing data regions along with the index entries.

    1.2.3 The Buddy Tree [Seeger and Kriegel 1990].

    dynamic hashing scheme with structured directory: The tree is constructed by consecutive insertion,cutting the universe recursively into two parts of equal size with iso-oriented hyperplanes

    properties:

    (1) each directory node contains at least two entries;(not be balanced,leaves maybe not in the same level)

    (2) whenever a node n is split, the MBBs Id(ni) and Id(nj) of the two resulting subnodes ni and nj are recomputed to reflect the current situation;and(achieve a high selectivity at the directory level,)

    (3) except for the root of the directory, there is exactly one pointer referring to each directory page.

    Property1,3保证了linear的growth of the directory,use k-d-tree to avoid deadlock of grid file,Only restrict is the number of buddies.

    1.2.4 The BANG File [Freeston 1987]

    (Balanced And Nested Grid) difference from grid file : bucket regions may intersect form nonrectangular bucket regions. nested interpolation- based grid file close to the BANG tree,the major difference is the organized directory.BANG 用 spanning split 来取得 high storage utilization这样可能会造成 整目录的traversal in depth-first manner,Freeston [1989a]采用了不同的spitting strategys ,对于extended objects,用centrorid 来确定重心。Freeston [1989b]

    1.2.5 The hB-Tree [Lomet and Salzberg 1989, 1990]

    (holey brick tree)和k-d-B tree 的相似点是两者都采用了k-d-trees来用内部节点来组织空间,两者最显著的区别是 node spitting是基于multiple attributes ,与BANG file相似,它也是fractal structure (a hole brick) with an external enclosing region and several cavities called extracted regions(萃取空间).这种结构避免了cascadding of split(瀑布式的).严格意思上说,非tree结构而是而是有向无圈图directed acyclic graphs

    Searching is similar to the k-d-B-tree.Insertiong is carried out analogously to the k-d—B-tree.

  • 相似度问题

      0 comments
    首先建立可信度模型(credibility model)和分析模型
    借鉴信用风险-市场风险-衍生产品-巴塞尔 内部评级-欺诈侦查模型-套利模型
    而agent的体系结构借鉴于CMU的RETSINA Agent Architecture以及CUHK给的论文中模型。
    文献资料有:
    http://www.cs.cmu.edu/~softagents/retsina_agent_arch.html

    http://www.iam.ecs.soton.ac.uk/

    http://www.aaai.org/AITopics/pmwiki/pmwiki.php/AITopics/MultiAgentSystems

    http://www.cs.cmu.edu/~softagents/

    数据相关性http://book.csdn.net/bookfiles/327/10032713190.shtml

    线性插值 http://zh.wikipedia.org/zh-cn/線性插值

    曲率比较大的时候会导致估计值不稳定,但是它非常的高效。

    de Casteljau算法 实现贝塞尔曲线 http://zh.wikipedia.org/zh-cn/De_Casteljau算法

    贝塞尔曲线 http://zh.wikipedia.org/zh-cn/貝茲曲線

    当维度降为1的时候可以简化为线性插值

    它可以用来平滑地构建曲面。

    至于空间的相似度还是先需要用多变量拟合来处理,然后求出距离,比较差异。

    Agent交互语言ACL(agent communication language)主要实现有KQML

  • 堕落归来

      15 comments

    今天去了城里,买ipod数据线和优盘,该死的apple产品,死贵,连tm配件都要200.

    在百脑汇(今天特地看了下翻译buynow,囧死了),下面重点轰炸我购物被黑的内幕:

    营业员问我:要啥,帅哥?

    我:优盘,8G的,外观小巧的。最好是SONY xxxx某款的。

    营业员开始巴拉巴拉介绍。

    我叽里呱啦地应对。

    我直接问:how much,大姐?

    她说:210。

    我心里想:wc , 贵的一笔啊(心想还价吧!)

    然后脱口而出:180卖不卖?

    她说:好吧好吧,卖给你。

    说到这里,擦,我的还价好失败啊。又不好意思不买,结果,认了…

    路上想爱情的问题:

    想了下,杯具啊,喜欢的话就很认真很投入,就掉架子,不喜欢么,在一起又没意思,一点激情都没有,最终发现,哥就是一杯具。

    最后发个link,主要介绍各个框架的使用tutorial,里面有discuss一些比较advanced theme….

    http://www.vaannila.com/

  • 写于回学校前

      5 comments

    明天就要回去了,新学期也要开始了,这几日没什么心思学习,很是堕落,算了算,从春节到现在一直找一个借口说:过年了,也该休息下了。现在想来,好荒废啊!

    泰州—南京—泰州–…–来来回回,家,来了回,回了走,如此反复,不经意间这个寒假是倒数第二个了,毕业,快了,时间短了。看到有个人的个性签名如下:

      我的母校沒有北大和清華那樣的顯赫聲名,
        甚至也沒有一個顯貴出自南園。
        她曾經是國立中央大學,這就是她的原罪!
        我們永遠無法忘記,一個風雪交加的元旦之夜。
        前校長曲欽岳先生在校廣播裏致新年賀詞和辭職聲明:“國家對教育口惠而實不至,
    我已身心疲憊,萬難繼續校長的工作。”當時,國家教委承諾給予興建埔口校區財政撥
    款,而最後卻不見下文。母校在萬難之下,毅然借款完工,卻因此背上了數千萬元的巨
    債。甚至有傳聞說要賣掉南、北兩園,籌措必要的資金。《南大報》全文登載了前校長曲
    欽岳先生的辭職文告,全校一片黯然。
        穿上學位服,將母校定格在自己的生命中……
    
    
        大哉一诚天下动,如鼎三足兮,     ┃       踵海西上兮,江东;巍巍北极兮,
                                         ┃
      曰知、曰仁、曰勇。千圣会归兮,     ┃       金城之中。天开教泽兮,吾道无
                                         ┃
      集成于孔。下开万代旁万方兮,       ┃       穷;吾愿无穷兮,如日方暾。
                                         ┃
      一趋兮同。       ┏━━━━━━━━━━━━━━━━━━┓     ━━李叔同
    1902-2007           ┃
                      ┗┳━┳━━━━━━━━━━━━┳━┳┛
                        ┃  ┃   Nanjing University   ┃  ┃
       ┏━━━━━━━━┫励┣━━━━━━━━━━━━┫诚┣━━━━━━━━┓
       ┗━┳━━┳━━━┫  ┃                        ┃  ┣━━━┳━━┳━┛
          ┃    ┃      ┃学┃  http://www.nju.edu.cn ┃朴┃      ┃    ┃
          ┃    ┃      ┃  ┃  http://bbs.nju.edu.cn ┃  ┃      ┃    ┃
          ┃    ┃      ┃敦┃                        ┃雄┃      ┃    ┃
          ┃    ┃      ┃  ┃                        ┃  ┃      ┃    ┃
          ┃    ┃      ┃行┃       欢迎光临!       ┃伟┃      ┃    ┃
          ┃    ┃      ┃  ┃                        ┃  ┃      ┃    ┃
    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    也许能够寄托我对母校的一些情感依托吧。

    不过寒假最大收获是抛开一些包袱,知道了自己的一些缺点,并且至少试图去改变。

    继续我的yy流(菜鸟总是期待能够正常人的智商嘛):

    1. 有机会学习下金融学的东西,最好有必要将来弄个金融的MBA读下。

    2. 所有的事情动机更单纯一点,不行,还要继续单纯一些,这样才会动力更足一点。

    3. 尽量该行,不要做IT民工,父亲说的对,人比机器复杂多了,要学会社交。

    作为读者,为了补偿下本blog水的趋势,推荐一个人的blog,这个人的blog里面有很多写关于图灵奖获得者生平的文章,中文的(发现中文读起来真的更方便,这也是最近我所困惑的问题,像计算机科学基本上想学东西都是看英文的,想真的学习必须出国,那么国人永远都需要做翻译,就总是有人喜欢Google translate,也就造成总有那么一部分或者一大部分书翻译质量堪忧。还有那些英语不好的人,情何以堪,他们也许很聪明,很会动脑经,可是无法阅读,获取最先进的知识,当然不排除这些人爱做冷板凳,关门搞冷门的学术课题。语言,嗯,我不知道将来会如何发展下去,至少我觉得这是中国人的一个劣势。):

    http://skylersun.info/281

    有偶像级别的Donald Ervin Knuth爷爷哦,太崇拜了!!

    推荐一个网站:http://www.dwway.com/html/news.html

    有商务智能,数据仓库,数据挖掘啊等等东西的

    p.s. 加一段煽情的,避免blog整体水的趋势

  • 遗传算法小记

      0 comments

    英文名字是genetic algorithm,注意和genetic programming的区别(参考于http://www.geneticprogramming.com/Tutorial/上面的说法,主要的区别是两者的表示)

    应用范围,NP-complete问题(也就是除了穷举法以外没有其他办法的解决方案的问题,例如排课表,求函数最大值,求路径,囚徒困境(prisoner dilemma)这算是是一种探索性方法),就我的理解,是一种对穷举法的优化。其实用贪婪算法也是可以做到的。这个应该算是一种解决策略,就像数学归纳法一样。

    先谈下理论依据,昨天和师兄探讨了下,这个东西似乎没有什么研究价值,因为缺乏必要的数学依据,也就是严格的证明,而是通过一种类似于公认事实的理论来论证的:遗传学。

    先取一个种族(population)也就是初始化的过程,然后基于这个初始化的种族,我们进行评估(evaluate也就是计算它的fitness),接着进行排序,然后是很重要的一步:select(类似于自然选择),同时对劣势的population进行crossover和mutate操作,这样就有一个新的种族。下面举两个例子。(可以参考这两个链接:1.http://www.studa.net/pc-Theory/080505/1633205.html 2.http://www.cnblogs.com/waterflier/archive/2005/05/11/153545.html

    课表问题(可参考Soolmaz Massoodian, Afsaneh Esteki  在2009年2月写的A Hybrid Genetic Algorithm for Curriculum Based Course Timetabling A Hybrid Genetic Algorithm for CurriculumBased Course Timetabling)

    1.先对问题进行描述,对约束条件进行分类,分成hard constraint(即必须要满足的条件)和soft constraint(尽量要满足的条件),对这些条件进行加权,显然hard constraint是要大大高于soft constraint的权值的。对于排课表这样子的问题,可以采用二维数组来实现,这样也可以避免出现冲突的困境。可以参见Soolmaz Massoodian的这篇paper。

    2.然后将数据normalize(按照步骤1所示)

    3.对照约束表,进行fitness的评估,sort

    4.对不好的population进行mutate和crossover操作。

    5.反复循环2-4过程直到满足终止条件

    提供的pseudo code如下:

    01 //Reads all the date from file
    02 ReadData();
    03 //Assigns integer values to the lectures
    04 EncodeData();
    05 //Sorts the courses to place lectures of more constrained courses in the
    06 timetable first
    07 sortCourses(CourseList);
    08 //Creates a semi-random population of timetables
    09 Initialize();
    10 for(All timetables)
    11 //Calculates the fitnessHard value
    12 fitnessHARD(timetable);
    13 generations=1;
    14 do {
    15 //SELECTION POOL
    16 //Selects the better half of the population for the first half of the new
    17 population
    18 SelectBetterHalf();
    19 //Selects the other half of the new population using tournament-3
    20 SelectOtherHalf();
    21 //CROSSOVER
    22 //Crossover is not performed on the better half of population
    23 for(i=population_size/2;i<population_size;i++)
    24 {
    25 Choose a random number a;
    26 if(a<=crossover rate)
    27 //parent1 will be replaced by the offspring of parent1 and parent2
    28 Crossover(parent1,parent2,parent1);
    29 If (a feasible timetable has not found yet)
    30 // Calculate only the violations of hard constraints for timetables;
    31 fitnessHARD(i);
    32 else
    33 If(Maximum and average fitness of the population are very close)
    34
    35 //To avoid convergence
    36
    37 Increase mutation rate;
    38
    39 //sorts the chromosome pool to prevent performing mutation on a good
    40
    41 timetable created by crossover
    42
    43 sortpool(pool);
    44
    45 //MUTATION
    46
    47 //Mutation is not performed on good chromosomes
    48
    49 for(i=population_size/4;i<population_size;i++)
    50
    51 {
    52
    53 Choose a random number a;
    54
    55 if(a<=mutation_rate)
    56
    57 mutation(i);
    58
    59 If (a feasible timetable has not found yet)
    60
    61 fitnessHARD(i);
    62
    63 else
    64
    65 fitness(i);
    66
    67 }
    68
    69 If(Max fitness of this generation>Max fitness of the previous generation)
    70
    71 If(A feasible timetable has not found yet)
    72
    73 Local search is applied to best chromosome;
    74
    75 else
    76
    77 Local search is applied to the columns of the best chromosome;
    78
    79 } while(!( (time is overOR (a timetable for which all soft and hard constraints
    80
    81 are satisfied is found)))

    计算最大值问题 计算诸如f(x) = (x-1)(x-2) 在区间[1,6]上的最小值

    1.先将[1,6]划分为若干块,比如我划分为200,那么就要穷举这500个点,求最大值。decode,也就是将其转换成染色体编码,500小于512,故而需要9位

    2.建立一个individuals的样本池(pool),也就是initial过程。

    3.对前面的pool进行评估,可以采用 评估函数:E(x) = 100 – (x-1)(x-2),因为求最小值,所以是减去,求得它的累加和,对每个样本求其份额。接着用赌轮法进行select

    下面是 http://www.cnblogs.com/waterflier/archive/2005/05/11/153545.html 上提到的一个简单的赌轮的例子

    13%               35%                    15%                 37%
    ———-|—————————-|————|-*————————-|
    个体1              个体2                  个体3    ^0.67    个体4

    随机数为0.67落在了个体4的端内.本次选择了个体4.

    4. 选择父代和母代进行mutation,然后还有crossover

    5.依然是重复该过程。

    最后附上我写的java代码,因为一直怀疑可行性,实际写代码进行下来效果也不是很好。以后再继续深入了解

    显示breed类,用于繁殖后代:

    1 public class Breed {
    2 Chromosome father;
    3 Chromosome mother;
    4
    5 public Breed() {
    6 father = new Chromosome();
    7 mother = new Chromosome();
    8 }
    9 }

    接着是Chromosome类,染色体类

    1 public class Chromosome {
    2 String content;
    3 double p;
    4 double f;
    5 }

    最后是整个过程:

    Java语言Codee#9551
    001 package test;
    002
    003 import java.util.ArrayList;
    004 import java.util.Iterator;
    005
    006 public class Main {
    007
    008 static int geneNum = 32;
    009 static int individualSize = 16;
    010 static int parentNum = 8;
    011
    012 /**
    013 * @param args
    014 */
    015 public static void main(String[] args{
    016 ArrayList<Chromosome> set = new ArrayList<Chromosome>();
    017 ArrayList<Chromosome> parents = new ArrayList<Chromosome>();
    018
    019 // initial
    020 for (int i = 0i < individualSizei++) {
    021 Chromosome temp = new Chromosome();
    022 temp.content = normalize((int) ((geneNum - 1* Math.random()));
    023 set.add(temp);
    024 }
    025
    026 for (int i = 0i < 10000000i++) {
    027 // Evaluate
    028 double totalV = 0;
    029 for (Chromosome chromosome : set{
    030 int x = Integer.valueOf(chromosome.content, 2);
    031 double f = 800.0 - ((doublex - 5.0* ((doublex - 5.0);
    032 chromosome.f = f;
    033 totalV += f;
    034 }
    035 for (Chromosome chromosome : set{
    036 chromosome.= chromosome.f / totalV;
    037 }
    038
    039 // select
    040 for (int j = 0j < parentNumj++) {
    041 parents.add(select(set));
    042 }
    043
    044 set.clear();
    045
    046 // crossover 8个交叉
    047 crossover(set, parents);
    048
    049 // mutate 8个变异
    050 mutate(set, parents);
    051
    052 parents.clear();
    053 }
    054
    055 for (Iterator<Chromosome> iterator = set.iterator(); iterator.hasNext();) {
    056 Chromosome chromosome = (Chromosomeiterator.next();
    057 System.out.println(chromosome.content);
    058 }
    059 System.out.println();
    060
    061 }
    062
    063 // crossover
    064 private static void crossover(ArrayList<Chromosome> set,
    065 ArrayList<Chromosome> parents{
    066 ArrayList<Breed> breed = new ArrayList<Breed>();
    067 // 配对
    068 for (Iterator<Chromosome> iterator = parents.iterator(); iterator.hasNext();) {
    069 Chromosome father = (Chromosome)iterator.next();
    070 Chromosome mother = null;
    071 ifiterator.hasNext()){
    072 mother = (Chromosome)iterator.next();
    073 }else{
    074 break;
    075 }
    076 Breed breedElementBreed = new Breed();
    077 breedElementBreed.father = father;
    078 breedElementBreed.mother = mother;
    079 breed.add(breedElementBreed);
    080 }
    081
    082 // crossover
    083 for (Iterator<Breed> iterator = breed.iterator(); iterator.hasNext();) {
    084 int bit = (int)(4*Math.random());
    085 if(bit == 4){
    086 bit–;
    087 }
    088 if(bit == 0){
    089 bit++;
    090 }
    091 Breed breed2 = (Breediterator.next();
    092 Chromosome childI = new Chromosome();
    093 Chromosome childII = new Chromosome();
    094 childI.content = breed2.father.content.substring(0,bit+1+ breed2.mother.content.substring(bit+1);
    095 childII.content = breed2.mother.content.substring(0,bit+1+ breed2.father.content.substring(bit+1);
    096 set.add(childI);
    097 set.add(childII);
    098 }
    099 breed.clear();
    100 }
    101
    102 // mutate
    103 private static void mutate(ArrayList<Chromosome> set,
    104 ArrayList<Chromosome> parents{
    105 for (Chromosome chromosome : parents{
    106 int bit = (int) (4 * Math.random());
    107 String content = chromosome.content;
    108 if (bit == 0{
    109 Chromosome c = new Chromosome();
    110 c.content = mutateBit(content.charAt(0)) + content.substring(1);
    111 set.add(c);
    112 } else if (bit == 4{
    113 Chromosome c = new Chromosome();
    114 c.content = content.substring(0, 4)
    115 + mutateBit(content.charAt(4));
    116 set.add(c);
    117 } else {
    118 Chromosome c = new Chromosome();
    119 c.content = content.substring(0, bit)
    120 + mutateBit(content.charAt(bit))
    121 + content.substring(bit + 1);
    122 set.add(c);
    123 }
    124 }
    125 }
    126
    127 private static char mutateBit(char pre{
    128 if (pre == ‘0′{
    129 return ‘1′;
    130 } else if (pre == ‘1′{
    131 return ‘0′;
    132 } else {
    133 throw new RuntimeException();
    134 }
    135 }
    136
    137 // 圆盘算法
    138 private static Chromosome select(ArrayList<Chromosome> set{
    139 double key = Math.random();
    140 Iterator<Chromosome> iterator = set.iterator();
    141 Chromosome result = null;
    142 double totalP = 0.0;
    143 while (iterator.hasNext()) {
    144 result = (Chromosomeiterator.next();
    145 totalP += result.p;
    146 if (totalP > key{
    147 break;
    148 }
    149 }
    150 // System.out.println(totalP);
    151 //         System.out.println((result!=null));
    152 return result;
    153 }
    154
    155 private static String normalize(int x{
    156 if ((x < 0&& (x > geneNum))
    157 return null;
    158 String result = Integer.toBinaryString(x);
    159 if (result.length() < 5{
    160 while (result.length() < 5{
    161 result = ‘0′ + result;
    162 }
    163 }
    164 return result;
    165 }
    166
    167 }

    文章比较水,故而推荐两本书最为补偿:

    Springer出版社的 Introduction To Genetic Algorithms 这本讲的例子比较多用matlab和c++都实现了一个例子

    MIT出版社的  An Introduction To Genetic Algorithms 这本讲的比较详细

    p.s. 本文是代码美化是在: http://fayaa.com/code/home/ 上处理的。



  • 那些成功背后的故事

      0 comments

    看完金妍儿的表演,很感动

    真的是台上十分钟台下十年功,偶尔转了blog,看了一片讲陶哲轩的,确实,他的故事真的很impressive,转载过来。不过还要注意,成功是不可复制的,但是有些道理确实人类通用的,有些精神是成功必备的

    ——————————————————————————

    陶哲轩:被数学照亮的精灵  
    
    http://news.sciencenet.cn/htmlnews/2010/2/228513.shtm
    
    从幼年开始,他就被“天才”、“神童”、“叹为观止”、“难以置信”等与神奇相关的
    词语包围:两岁就用积木教更大的孩子如何数数;9岁开始学大学数学课程;13岁成为国际
    数学奥林匹克(IMO)迄今最年轻的金牌获得者;20岁获普林斯顿大学博士学位;24岁成为
    正教授;31岁获被誉为“数学界诺贝尔奖”的菲尔兹奖。
    
    所到之处,他会受到摇滚歌星一样的礼遇;他被看作世界上最强大的“数学智囊”;当其
    他数学家被问题卡住时,他是他们眼中最佳“救火员”和最好的合作者。
    
    他就是陶哲轩,世界顶尖华裔数学家。
    
    然而,这就是陶哲轩?
    
    在他的朋友看来,即使没有荣誉满身,他仍是一个快乐的精灵,时时刻刻神采飞扬、活力
    四射。在他身上,总有一个好奇孩子的影子,有着机灵的眼睛、纯净的笑容。他言行中的
    睿智谦逊、文雅坦诚,像三月的阳光灿烂在和煦的春风中。
    
    在他自己看来,长大之后最看中的是生命中的快乐,可以忘却的是所谓的“神童”称号,
    不可忘却的是从一名天才少年成长为卓越数学家所经历的坎坷与付出。
    
    邂逅数学明星
    
    “您是否听说过麦克阿瑟天才奖?”2006年9月20日,正值初秋,一位英俊帅气的青年接到
    了一个陌生电话。由麦克阿瑟基金会所设的这一奖项是颁给在各领域有创意的优秀人才的
    ,这个他当然知道。“您获奖了。”顿时,大感惊讶的神情,从他黑色方框眼镜后洋溢着
    浓浓青春活力和书卷气息的脸上,慢慢弥散开来。
    
    尽管之前获奖无数,但这个消息还是让他一时回不过神来。要知道,这是一个月内他获得
    的第二个大奖。由于对偏微分方程、组合数学、谐波分析和堆垒数论等方面学术研究的贡
    献,29天前,在西班牙马德里举行的第25届国际数学家大会上,他刚刚从西班牙国王卡洛
    斯一世手中接过有“数学界诺贝尔奖”之称的菲尔兹奖奖章。至今,获此殊荣的华人数学
    家只有他与丘成桐二人。
    
    这位获奖的年轻数学家就是陶哲轩,那年,他31岁。这样的荣誉使他不仅蜚声于国际数
    学界,更被众多青少年学生视为偶像。
    
    一个半月前,成年后的陶哲轩第一次回到他的祖籍国——中国,参与丘成桐中学数学奖的
    评审工作,仅在12月21日公开露面一天,就再次重温了众星捧月的感觉:上午,当他的身
    影刚一出现在清华大学主楼报告厅,欢呼声和掌声立即充斥大厅,在场的学生们纷纷拥上
    前向他索要签名、与他合影;下午,在人民大会堂,他接受了全国人大常委会副委员长陈
    至立的会见。
    
    记者与陶哲轩的邂逅,也正是在这一天。上午10点,清华大学主楼报告厅举行的第二届丘
    成桐中学数学奖颁奖典礼即将开始,蜂拥在陶哲轩周围的学生“粉丝”们依然不愿散去。
    纷纷跑来合影的人,把坐在陶哲轩身旁的丘成桐教授都挤到了主席台与座席之间的过道中
    无法落座。而陶哲轩则面带微笑,谦逊地配合着每一位前来索要签名和要求合影的人。当
    记者的镜头对准他时,他甚至转过头来扮了个鬼脸。若不是名牌摆在桌上,清秀文气、一
    脸朝气的他很可能被误以为是一名在读研究生。
    
    典礼开始后,两位主持人言辞中提到了他的名字,不懂中文的他以为主持人向大家介绍自
    己,倏地站了起来,含笑转身,在全场的哄然大笑中,被坐在一边的丘成桐教授大笑着一
    把拉坐在座位上,他则一副摸不着头脑的样子。而在他讲话时,大厅里鸦雀无声,大家屏
    住呼吸,听着他嘴里吐出来的每一个音节。
    
    在中午的答谢午宴上,记者有幸走近陶哲轩。他匆匆吃完几口饭后,平静而谦逊地讲述了
    自己荣誉不断却坎坷连连的成长、深邃艰深却精彩灵动的研究、平实忙碌却快乐幸福的生
    活。
    
    神童的成长
    
    “古希腊哲学家普罗克洛斯曾说过:‘这,就是数学:她提醒你灵魂有不可见的形态;她
    赋予自己的发现以生命;她唤醒悟性,澄清思维;她照亮了我们内心的思想;她涤尽了我
    们有生以来的蒙昧与无知……’而我喜欢数学,因为她有趣。”这是陶哲轩在15岁时描述
    的他对数学的“一往情深”。15岁,对很多人来说还是个懵懂的年龄,而陶哲轩已经是一
    个徜徉在数学世界中的小小智者了。
    
    1972年,出生于上海、毕业于香港大学的父亲陶象国和母亲梁蕙兰从香港移民到了澳大利
    亚,居住在风景优美的南部港口都市阿得雷德。来澳之前,陶象国是一名儿科医生,在校
    期间就是物理和数学专业高材生的梁蕙兰,大学毕业后曾做过中学数学教师。1975年7月1
    7日,在来到澳大利亚3年后,他们有了自己的第一个孩子——陶哲轩,他们亲昵地叫他
    Terry。从此,为了抚养孩子,梁蕙兰不再工作。
    
    陶哲轩两岁时,父母就发现了他在数学方面的早慧。于是,他3岁半时被送进一所私立小学
    。然而,尽管智力明显超常,但他却不懂得如何与比自己大两岁的孩子相处。几星期后,
    父母明智地将小哲轩送回了幼儿园。在幼儿园的一年半时间里,由母亲指导,他自学了几
    乎全部的小学数学课程。其间,父母开始阅读天才教育的书籍,并且加入了南澳大利亚天
    才儿童协会,他们决心无论付出多少,都要造就这个有天分的孩子的成功。
    
    很快,陶哲轩5岁了。父母决定将他送到离家两英里外的一所公立学校。因为这所小学的校
    长向他们承诺可以为陶哲轩提供灵活的教育方案。一入学,陶哲轩就进了二年级,但他的
    数学课则在五年级上。在浓厚兴趣的驱使下,7岁的小哲轩开始自学微积分。开明的校长又
    在他父母的同意下,主动说服了附近一所中学的校长,让小哲轩每天去该校听中学数学课
    。不久,小哲轩出了自己的第一本书,内容是关于用Basic程序计算完全数。
    
    8岁半时,小哲轩就升入了中学。经过一年的适应后,他用三分之一时间在离家不远的弗林
    德斯(Flinders)大学学习数学和物理。在此期间,他开始以出色的数学竞技考试成绩频
    频引起轰动。研究天才教育的新南威尔士大学教授米那卡·格罗斯认为,陶哲轩的智商介
    于220至230之间,完全有能力在12岁生日前读完大学,成为当时最年轻的大学毕业生。然
    而,父母还是采取了谨慎的态度,他们想,只有让小哲轩打下科学、哲学、艺术等多方面
    的坚实基础,让他对数学的热爱随着心智的成熟而慢慢炽烈,孩子将来的前景才会更加广
    阔。
    
    尽管有掩饰不住的天赋,小哲轩仍像其他孩子一样透着稚气,还有很多的烦恼。比如,他
    有爱咬圆珠笔笔头的坏习惯,有时会发脾气,常常丢三落四。他的一位老师说:“Terry过
    去常常刚学了阅读和拼写课程之后,就跑过来上数学课。他在一个个教室之间跑来跑去的
    ,经常在每处都落下点什么。一天他跑过来,两手空空,这回可是丢了不少东西。这孩子
    几乎要哭出来了:‘我什么东西都找不着!’”
    
    在父母的帮助下,他克服了很多坏毛病,老师的谆谆教导也让他受益匪浅。一位高中时教
    他“普通常识”课程的老师让他印象深刻。有几次,小哲轩抱怨生活不容易,因为自己总
    得在不同的教室间跑来跑去,人们总是期待他知道这个知道那个,甚至弟弟还在他的东西
    上乱涂乱画。那位老师告诉他:“澳大利亚一位前总理说过,人生原本不易。”她教导小
    哲轩,人们都会在生活的某些方面获得某种成功,更多的却是被烦恼和失败的情绪围绕,
    但是,应当多想些乐观的方面,把挫折看作是给自己上了一课,挫折会给未来增添希望。
    小哲轩将这些话深深记在了心里。
    
    数学家的诞生
    
    多年以后,一位陶哲轩的粉丝——南开大学数学系的博士生这样看待他的偶像的成长:“
    如果仅仅看这些事实(陶哲轩神奇的成就),任何人都难免会有仰视的感觉……其实,真
    正静下心来搞科研的能力和早慧的先发优势有着根本的差别。从一个极其聪明的孩子,一
    步步成为世界一流的大数学家,这期间的辛苦付出和勤奋努力,才是这位天才走到今天最
    重要的资历。”
    
    “我不认为聪明程度是在数学领域取得成功的最决定性因素……在数学研究中极具天赋并
    不是必需的,但是你需要耐心和成熟。”在采访中,陶哲轩说,“事实上,问题从来就没
    有离开过我,但你得学着适应它。”
    
    陶哲轩14岁时正式进入他中学时去听课的弗林德斯大学,16岁获得该校荣誉理科学位,仅
    一年后就取得了硕士学位。17岁时,他来到美国,开始攀登数学高峰,在普林斯顿大学师
    从沃尔夫奖获得者埃利亚斯·施泰因,21岁获得博士学位,24岁成为加州大学洛杉矶分校
    的终身数学教授。
    
    在陶哲轩的研究生涯里,他被数学界公认为是调和分析、偏微分方程、组合数学、解析数
    论、算术数论等接近10个重要数学研究领域里的大师级年轻高手,这些方向都是数学发展
    中极热的生长点。
    
    此外,他的研究领域还涉及工科,在照相机的压缩传感原理(调和分析在实际中的应用)
    方面获得了突破性成果。曾经很长一段时间,每天早晨,他和加州科技研究所的以马利·
    坎迪斯教授在幼儿园碰头,他们的孩子在同一所幼儿园,送孩子是他们每天的第一项工作
    。随后他们一起去研究所,共同开展这项军队极想用于勘测,而工程师可以由此开发出用
    于核磁共振成像、天文仪器和数码相机领域更尖端、更有效的成像技术的研究。
    
    陶哲轩另一项著名的成果是与本·格林合作用质数级数解决了一个由欧几里得提出的与“
    孪生质数”相关的猜想:一些质数数列间等差,如3、7、11之间,均差4;而数列中下一个
    数15则不是质数。这个已经有2300年历史的数学悬案,强烈吸引了他的兴趣,他与同伴甚
    至证明了即使在无穷大的质数数列中,也能找到这样的等差数列段,这个发现被命名为“
    格林—陶定理”。
    
    陶哲轩曾在博客上说:“俄罗斯人佩雷尔曼对庞加莱猜想所作的贡献是过去10年中最重大
    的。与他同时当选菲尔兹奖得主,我真的很惭愧。”俄国数学天才佩雷尔曼是非学院派,
    深居简出,过着隐士般的生活,是陶哲轩非常敬佩的一位同行。2006年,陶哲轩在预印本
    网站贴出了长达42页、题目为《从非线性偏微分方程看佩雷尔曼对庞加莱猜想的证明》的
    论文。他完全从数学本身出发,用了两个月时间,综合评述了4组同时攻克此题的论证,并
    得出结论:“至少佩雷尔曼给出了庞加莱猜想的完整证明。”一位业内人士说:“如果陶
    哲轩的论证没有错的话,就说明佩雷尔曼的确高出除陶以外的所有人,佩一眼看出的事情
    ,其他3组要大费周折才能论证。而陶显然看出了其中奥妙,所以大加赞赏。”这篇文章附
    录了38篇参考文献,对公认的难以捉摸的里奇流领域也下了功夫。陶哲轩却说:“这篇论
    文比我以往任何一篇论文都长,但我不打算正式发表它。”一家知名媒体评价说:“其内
    敛、温和、点到为止,令人意会。”
    
    工作中的陶哲轩,享受着与其他数学家的合作,也享受着自己的奇思妙想。普林斯顿大学
    的查尔斯·费佛曼教授(曾被誉为神童、1978年菲尔兹奖获得者)说:“他身上有一种很
    少人具备的素质。当他解决了一个问题,你会对自己嘀咕,这是多么明显,怎么我就没想
    到呢?为什么前100个碰过这个问题的著名数学家也没有想到呢?”所以,他又说:“如果
    你有解决不了的(数学)问题,那么出路之一就是引起Terence Tao(陶哲轩英文名)的兴
    趣。”
    
    对于自己走过的数学之路,陶哲轩这样总结:“当我是小学生时,形式运算的抽象美及其
    令人惊叹的、通过简单法则的重复而得出非凡结果的能力吸引了我;当我是高中生时,通
    过竞赛,我把数学当作一项运动,并享受解答设计巧妙的数学趣味题和揭开每一个奥妙的
    ‘窍门’时的快乐;当我是大学生时,接触到构成现代数学核心的丰富、深刻、迷人的理
    论和体系,使我顿起敬畏之心;当我是研究生时,我为拥有自己的研究课题而感到骄傲,
    并从对以前未解决的问题提供原始性证明的过程中得到无与伦比的满足。直到开始作为一
    名研究型数学家的职业生涯后,我才开始理解隐藏在现代数学理论和问题背后的直觉力及
    原动力……直到最近,当我了解了足够多的数学领域后,才开始理解整个现代数学的努力
    方向及其与科学和其他学科的联系。”
    
    快乐最重要
    
    2006年末,陶哲轩开始在wordpress上写博客。在这里,他将自己科研的方方面面写下来,
    将一些自己觉得分量不够的论文思考结果直接贴出来与同行分享,他总是对其他人的帮助
    极尽感激之情。与他有科研交流的人多得让人吃惊,博客异常火爆。他对每一个认真阅读
    并提出问题的人均仔细回答,这其中也包括来自世界各地的一个个不知名的普通在校学生
    。他还将自己给博士生开的数学课讲义贴在博客上,一些数学专业的学生在这里见识了当
    代数学的魅力。在主页的自我介绍中,最后一句话表达了他拳拳的赤子之心:无论我怎样
    漂泊在远方,澳洲永远是我的故乡。
    
    是的,他生于斯长于斯,澳洲是他魂牵梦绕的故乡。如今,他已经定居在美国阳光明媚的
    南加州。妻子劳拉是他任教不久后班上听他课的一位小她3岁的韩国女孩,现在是美国国
    家航空和宇宙航行局动力推进实验室的一名工程师。
    
    在美国出生的儿子威廉7岁了,与父亲一样,从小就表现出了对数学的天赋与兴趣,但陶哲
    轩并不想逼儿子跟自己一样将来也做数学家。他认为,除了数学,这个世界还有很多不同
    而且有趣的东西。在决定儿子的名字时,他与妻子列了一长串名字,然后给儿子一个个念
    出来,当念到“William”时,儿子面露笑容,于是决定为他起名为William(威廉)。也
    许,相对遗传给儿子天赋,他更希望像自己的父亲一样,把儿子的快乐放在最重要的位置
    。
    
    面对这位当年的神童、今天的数学家、又一个小神童的年轻父亲,记者不禁想起年仅9岁的
    他,在1985年第一次公开演讲中的几句话:“有时候,我做不出来一道题,就会生气地把
    笔扔在一边,把纸撕碎了,跑到床上生闷气。我可能很长时间不大说话,然后无缘无故地
    对弟弟们大喊大叫。爸爸如果在身边,他会给我讲个笑话,让我高兴起来。妈妈如果不忙
    了,她可能会来帮我解决这个问题。有时候我会再回去试做那道题目,发现答案根本没有
    那么难。学习之后跟弟弟玩一会儿是特别好的放松方法。我想,如果没有弟弟们,我一定
    会觉得很孤独。”
    
    【对话】聪明不是决定因素
    
    记者:你小时候是怎么喜欢上数学的?
    
    陶哲轩:从记事起,我就十分喜爱数学。我的父母告诉我,我两岁时,他们发现我在尝试
    着教三四岁的孩子数数。在我最早的记忆中,奶奶擦玻璃时,让我用清洁剂在窗户上写成
    数字的形状。我一直觉得,数字和趣味题都是非常数学化的概念,它们对是非都十分精确
    而严格。因此,比起其他会引起争论的知识,我更喜欢数学。这是我小时候的感受。现在
    我年纪大了,更了解数学研究是怎样的——这些结果是多么有用,以及从数学概念中获得
    了多少感受。比起小时候从难题中抽象了解到的数学,我更喜欢从研究角度获得的对数学
    的理解。
    
    记者:你的父母是否期望你成为一位数学家?
    
    陶哲轩:有一段时间,我不清楚将来会做什么。我尝试过不同的事情,比如说练习钢琴。
    我发现我不能做好老师所要求的练习。父亲希望我成为一名科学家而不是数学家。但是,
    一旦意识到我喜欢数学,父母给了我很多支持。
    
    记者:你的学校教育如何帮助你走上数学道路?
    
    陶哲轩:我的小学、中学、大学都无可挑剔。我的经历稍微有一些不同,因为我的教育有
    些超前。我的小学跳了很多级,而高中我上了很多大学的课,以至于需要和学校的领导商
    议特殊的学习计划。他们允许我根据自己的步伐学习,而不是生硬地强迫我迁就正常教育
    的速度。
    
    记者:在你的成长中,是否有一位或者多位老师对你的帮助很大?
    
    陶哲轩:我有很多很优秀的老师,比如,我高中的数学老师给我们讲很多笑话,也告诉我
    们有趣的故事,同时也教了我们很多数学。我的本科导师建议我去美国学习,而我美国的
    导师则让我成为了一名数学家。所以,我总是得到很好的建议,我数学研究的历程是非常
    有趣的。
    
    记者:很多人说,他很聪明,所以他成功了。因此,他们认为:“我没有他那么聪明,所
    以我做不了数学家。”你怎么看待这样的观点?
    
    陶哲轩:我不认为聪明程度是在数学领域中取得成就的最决定性因素。我看见过很多聪明
    的人从非常有难度而有前景的问题入手,但是他们失去了耐心,最终因无法解决问题而放
    弃了。与之相反,我知道有人从平均的起点开始,在高中时没有那么出类拔萃,但是在大
    学时代,他们渐渐成熟。他们通过勤奋工作、不懈尝试来加深自己对数学的理解,迟早,
    他们会成为知名的数学家。走向成功是需要时间的,这是一个复杂的过程。在数学中极具
    天赋并不是必需的,但是你需要耐心和成熟。比如说,奥林匹克高中数学竞赛就像是短跑
    竞赛,你需要很多的力量和体力。而从事数学研究更像是马拉松,一些体力是需要的,但
    是更多的是意志的力量,这是精神上的自律。
    
    记者:你在研究过程中是否遇到过困难?是怎么克服的?
    
    陶哲轩:会有很多困难,事实上,问题从来就没有离开过我,但是你得学着适应它。如果
    研究遇到困难了,可以多交流,可以与人合作,尝试一个更简单的问题,或者先做做别的
    再回来接着做。我有很多项目都在进展中,因为我了解到其中的一部分而我还不知道如何
    解决剩下的。做一个好的数学家,要了解到自身的局限,要在刚刚接触到一个问题时,就
    能意识到这个问题存在的障碍和困难。这是数学研究工作的一部分,你应该习惯它。在数
    学中,我们只将成果示人,不展示什么是行不通的。我们做的绝大部分工作是看不到的,
    是私下的,需要花费很多精力。
    
    记者:除了在学术领域遇到困难,你在生活中遇到过什么困难?
    
    陶哲轩:我的童年有些不同,但是父母努力让我的生活非常平衡。比如说,即使我在上更
    深的课程,他们也尽量寻找一些简单的课程让我上,好让课堂中有和我年龄相同的孩子,
    所以我总是有同龄朋友。同时,母亲会开车送我去大学上课,然后接我回来,而不是直接
    让我上大学。
    
    记者:你才33岁,对于大多数人来说,在这个年龄时一切都还没有开始。而对于你来说,
    已经拥有了数学界的最高荣誉。你对将来的打算是怎样的?
    
    陶哲轩:事实上我34岁了,不过没关系——我和其他人一样也会变老。我小的时候跳了很
    多级,因此,我更早地做了很多事情,但这并没有带来太大的改变。我和同事交流,在他
    们之中,有的和我同龄,有的比我年轻,有的比我年长。一段时间以后,年龄就不那么重
    要了,重要的是数学工作的实质,各个年龄段都可能有杰出的数学家。丘(成桐)教授去
    年就来加州大学洛杉矶分校做了一个演讲,谈他在几何学上的最新进展,那是数学领域非
    常伟大的成果。很多运动员40岁左右就退休了,而在数学领域,你的时间更长。
    
    记者:你如何处理工作和生活的关系?
    
    陶哲轩:这两方面的事情都让我非常忙碌。现在我在工作,上一个暑期,我和夫人、儿子
    在一起。我现在没有什么业余爱好,因为在工作和生活上,我已经太忙了。
    
    记者:这是你第一次来中国吗?
    
    陶哲轩:很多年前我去过香港,那时我还很小。
    
    记者:你喜欢这里吗?
    
    陶哲轩:是的,我非常喜欢这里的历史和文化。
    
    【陶哲轩说】
    
    数学是一个很有趣的东西。
    
    你可能是最聪明的人,但是如果没有毅力,没有创新精神,你就没法挖掘你的潜力。
    
    数学是一个巨大的工程,不可能单枪匹马来单打独斗,所以我作研究时,必须和其他朋友
    、数学家一起合作。
    
    很多奥数奖牌得主后来没有继续数学研究的原因之一,是数学研究和奥数所需的环境不一
    样,奥数就像是在可以预知的条件下进行短跑比赛,而数学研究则是在现实生活中不可预
    知的条件下进行的一场马拉松比赛,需要更多耐心。
    
    在攻克大难题之前首先要有研究小问题的意愿。
    
    成为数学家是一个长期的过程。
    
    培养对数学的兴趣,最重要的一点就是跟数学一起玩,给自己找些小挑战,设计一些小游
    戏。
    
    当我发现解决问题的价值不在于它使你获得什么奖项,或者使你赢得什么名声,重要的在
    于你学到了什么,通过解决问题理解了这个世界,我就更喜欢数学了。
    
    【说陶哲轩】
    
    陶哲轩这个人是公认了不起的。我虽然没和他见过面,但在很多座谈会上时常听到别人赞
    叹他,提起他多方面的成就。——中国数学家吴文俊
    
    假如你的孩子是天才,你大概会希望他像哲轩一样,是一个容易亲近的天才。他从来没和
    别人争执过,想的都是怎么开心地和别人合作,而不是互相指责,争权夺利。——陶哲轩
    父亲陶象国
    
    他真的很棒,一代人中只有几个这样的人,而他是其中之一。如果你有什么解决不了的数
    学问题,那么出路之一就是引起他的兴趣。——普林斯顿大学查尔斯·费佛曼教授(1978年
    菲尔兹奖获得者)
    
    他就像莫扎特,数学是从他身体中流淌出来的,不同的是,他没有莫扎特的人格问题,所
    有人都喜欢他。他是一个令人难以置信的天才,还可能是目前世界上最好的数学家。他总
    能将复杂的数学问题化繁为简,世界上最出色的数学家都喜欢和他一同工作,他与合作者
    能够组建成世界上最强大的数学系。——陶哲轩任职的加州大学洛杉矶分校数学系前主任
    约翰·加内特
    
    --
    数学是富有想象的科学, 也是最有理智的艺术。
    
  • 排版小记

      1 comment

    窗前放着一本侯捷先生的《word排版艺术》,已经开始落灰了,惭愧,遂拿起看了起来。以下是结果。

    这本书的组织的一些启发,先对文字的规约,专注于自己所写的东西,先处理好这个(实际上是对样式的定义),接着是对常见问题的补充,最后是开始正文。

    作为一个computer science的学生,我觉得研究排版只需要恰如其分的知道在何时何地用怎样一个部件(component,如脚注,题记等)以及如何定义这个部件的外观(如定义一个标题的字体,大小等)就可以了,对于二次创作,也许后来需要继续深入学习吧。

    排版的必要性,也就是排版的动机,考虑下Donald Knuth在写The Art of Computer Programming 这本书的时候为什么活放下手头“正经”的事情而自己花了时间开发Tex系统,以及那些奋斗在各个出版社排版岗位上的先驱们,他们的职业存在价值是什么。从侯先生提到“要想成为最优秀的作家,必须学会排版”,换句话说排版就相当于绘画的渲染,恰如其分的效果才能让读者有更好的感觉。在我看来论文的排版实际是一个很八股的过程,(标题,abstract,related work,正文部分,reference都有一个一致的规定,也许这正是学术的严谨所规约的吧)排版的可创作性也就下降很多,选择latex也许是为了让那些复杂的公式以更加儒雅的方式“排版”出来。 一致性也是排版的一个动机。

    对于计算机科学或者数学专业的人来讲,tex可以算是比较专业的了。那先看下Tex和Word的一些比较。

    先看Tex的主要思想:what you think is what you get. (\begin{document}实际上就是说你想要下面的文字是正文,在定义好文件的结构后再来写真正的内容)我想word的目标是 what you see is what you get(所见即所得,主要是对应前面所以这样翻译的)。一段时间的排版经历让我摸索了一个过程,主要是基于以下几点考虑:

    1. 所看到的内容很直观
    2. 一段时间只做一件事情

    首先我先确定文章的元素,section,subsection,subsubsection之类的东西(如引用,目的,动机等大标题和小标题的),对于footnote或者是编注这些细节的东西在正文确定后在处理。其实这个过程是一个brainstorming的过程,避免后来想到什么添加什么从而造成整个文章没有一个连贯性(托福作文也要注意,连词,“;”的使用)

    接着是做开始文章写作

    完成写作之后开始排版

    最后是完成一些善后工作,比如觉得这个术语需要解释下

    前三步在word下进行,最后一步进行排版。

    其实就word而言,它有文档结构视图和页面视图,用latex是为了锻炼自己强迫自己去学习。以上过程由于我没有出书的经历,就大规模的排版(large scale)似乎需要一些调整,因为前面的直观的效果不那么明显了。

    那么需要定义的过程元素是哪些呢?

    纸型(计算机专业的一般是国际18开,凤姐独爱A4,16开是讲全纸张对折4次,2的四次方为16)(别把底色搞成白色,伤眼睛)

    版心(写正文部分)

    天头(页眉上面部分)

    地脚(页脚下面的部分)

    页眉

    页脚

    页码

    文前(包括)

    正文文后

    扉页

    题献(献给某某某)

    标题

    段落

    脚注(不适合在文章直接放置,影响阅读流畅程度的,本文中括号部分都应该放在脚注里面。有脚注和尾注两种,科技文献一般是脚注,分张归零还是一路流水到底无所谓,文艺类一般是尾注)

    标签

    题注

    表格

    图片(一般将caption和图表放在一起,然后添加一个图片目录,记得Data Mining_Practical Machine Learning Tools and Techniques (2nd)就是这样做的)

    一些tips:

    1.  经常改动的东西需要使用交叉引用(cross reference)(其实这个不是tips,而是一个排版要件的作用,但是写在这里是要提醒自己,避免写需求文档时候挂了)

    2.  页码用流水号,不要写成x-x页

    3.  页面信息不能少,最前面数页可以不加页码,为了美观,后面都需要了,脚注一般脚上书籍名称。提高页面信息量

    4.  类名,一般英文字体,代码,特殊术语,强调,书籍名称等要为各自设计字符样式

    5.  程序代码一般用8.5磅的 Courier New 字体,正文字体不要超过9.5磅,一般9磅为宜

    6.  字体,色彩不要过于丰富,正文用宋体,粗圆体(标题),强调(黑体),不要用中文斜体

    7.  要留白,图中文字大小差不多等于正文字体大小(这点似乎比较难做到,我一般选择caption中包含一些信息)

    8.  宽度18.5,高度 23,页眉距边界 0.95,页脚距边界 0.6,对于版芯也就是正文区左边是3.25,右边是3.25,上方空有2.3,下方是0.6。

    9.  奇数页页眉内侧是标题名,偶数页页眉内侧是章名,外侧一律是页码,页脚是书名

    10.正文距版芯左边是1.0cm,中文开头是0.5cm,右边是1.5cm

  • 新年小计划

      5 comments

    这个,哥很激动,很耐心,很认真的说,哈哈,G..R….E第一遍tm背完了,靠

    哥这几天从早到晚都在背单词,nnd,明天又要开始第二轮了

    经过一年的深入浅出的理论与实践相结合的考虑,哥选择了踏上美利坚去实现自己的American dream的不归路,擦,多么斗志昂扬啊

    近期发现,想有breakthrough,一定要短期,高效,高强度,其实还是有科学依据的,你一段时间内从事同一样事情,有一个environment在里面,

    你不断的考虑这方面事情就不停地提高,我近期研究发现,我大脑从游离状态到高度集中的背单词状态需要一个很长的warm up阶段,这个是需要提高的。

    小结下:

    目标:GRE词汇,听力,注意力

    提高:效率,词汇量

    动机

    1. 物质上的考虑:

    且不说长期投资和短期效应之区别,在国内,有很大肯能成为房奴之危险,为今之计,唯有背井离乡,对水深火热的美帝去了。

    有辆车,有个房,有个家,哈哈。

    2. 学习上的需要:

    语言之重要已经很显然了,尤其是口语,想必那位11 w usd/year的大牛当年iBT 口语肯定不会低于23吧,哈哈

    能力的培养还有自己练习啊之流。

    3. 某mm的召唤:

    不用说的,你懂的,哈哈

    小结下:

    目标:有屋,有车,有家

    提高:口语,算法,社交能力

    风险

    1. 金融危机

    米国失业率高到10+%,需要至少5年才能恢复,这次去很可能没有h1b,被迫成为海带,所以要抓紧学习!争取有个7000+ 刀的offer

    2. 国家关系

    敏感问题

    3. 安全考虑

    安全是个问题,小心即可

    小结下:

    目标:有offer

    提高:托福成绩

    打算

    3月,准备GRE词汇和course

    4月,备战期末   作文AW

    5月,继续GRE,兼顾course

    6月,初GRE,后转战course

    7月-8月,备战托福 估计8月底考

    9月 – 11 月,看GPA了,decent就Ph.D, 差一点就申请master 准备方式也截然不同,到时候细化

    —————————————————————–细化分割线————————————————————–

    3月                    共31天,对于准备GRE来说,每天我觉得要有3个小时,至少可以过一个list,如果早上能早期的话,那么每天最好是2+个list,要兼顾AW,大概每天要看下issues和argument的高频

    4月                    共30天,大概4月13左右考完,也就是说有大概7天时间准备AW,擦,太紧张了

    5月                    共31天,靠,GRE全力冲刺阶段,最后大概在21日开始做模拟题!!

    6月                    共30天,截至6月6日,然后开始准备course考试,擦,拼命了要

    重要的deadline

    3月20日 要全力开始“预习”

    3月29日   —- 4月2日                       炼狱,擦,5天7门

    4月21日                                                AW

    6月6日                                                  GRE笔试

    一句话:拼命!!!!

    总结

    iBT,GRE,GPA

    三个都不能少,都不能低,也只能硬碰硬了,拼了!!


    附加两个link:

    面试题库
    面试流程

    祝愿

    祝愿各位都有offer,不管出国的还是找工作的,我自己也在明年这个时候真正地欢度春节!哥压抑了很久的说,哈哈

  • A brief tutorial to set up your own blog with wordpress

      3 comments

    效果就是你现在看到的这个样子咯。

    废话不多说,现在开始动手咯。

    domian name

    这个嘛,价格看了下参差不齐,不过我这个域名是43 RMB/per year,还算一个比较decent price,当然你也可以免费使用一个二级域名,不过有挂掉的风险哦,而且挂着别人的名字总觉得有点不爽吧。现在.cn的域名已经不开放给个人了,所以只能用.com了。

    下面2个链接是申请域名的:

    http://www.ipx.com.cn/ (I used it, it is about 43 rmb per year)

    http://www.hxun.com/(strong recommended , only 30 rmb per year)

    http://www.net.cn/static/domain/ (a little bit expensive and I do not the reason about it)

    当然国外的朋友可以选择在国外注册,我关注了下,价格似乎都是以美元为单位的(废话,美国人当然用dollar啦,不过这句话的意思是说比较贵,都要乘以6.xx)

    搞定了domain name,now go to step 2:web hosting

    web hosting

    用wordpress嘛,所以考虑到对PHP和mySQL的支持,同时还要少点广告啊,多点容积啊,稳定啊等巴拉巴拉,不过一定要有cpanel,这个很重要。

    下面我推荐如下的一个:

    http://www.000webhost.com/

    网友评价说这个非常好,不过确实没有言过其实。呵呵。

    不过现在屏蔽了中国的IP,我们的对策也很简单,代理(你也可以在Google里面type into “如何注册web host in 000webhost”)

    步骤如下:

    1. 打开 http://www.gwait.com/?lang=cn (在线代理很多,随便,我只是举了个例子),然后输入 http://www.000webhost.com/
    2. 点  order now ,接着傻瓜操作,不过注意一定是代理啊!
    3. 接着理论上就可以激活了

    下面是一些操作:

    • 建立一个数据库:点mySQL的那个图标即可,它会提供一个ftp的地址给你,你可以选择用winscp,这个功能比较多,可

    以用来chmod啊之类的操作,很好,最重要的是它可以直接修改。不过还有net2ftp,web based ftp manager。就不需要任何操作啦。

    • 下面是修改下dns的地址,在domian name 管理中修改相应信息即可(在你购买domain的地方修改)

    然后将wordpress传到数据库中,修改下admin-config.php中关于数据库的一些信息,这里可以参考:http://codex.wordpress.org/Main_Page

    点开 http://example.com/install.php               done!

    以上过程,呃,中间域名打错了,所以我刷了半天,悲剧!

    wordpress

    首先要做个favicon.ico,然后将传到 root 目录下和theme目录下,然后在header.php中添加:

    <link rel=”shortcut icon” href=”<?php bloginfo(‘template_directory’); ?>/favicon.ico” />

    接着选择主题啊之类的

    然后需要做个avatar,这个相对于一个唯一的ID号,作用就是唯一确定你,一般和一个邮箱绑定,我用的是我的头像做的

    地址是:http://en.gravatar.com/

    备份也很重要,我下载的一个插件,wp-dbmanager,进行备份数据用。