竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


291月/130

英语也就这么回事

发布在 邵珠庆

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

 

图片

271月/130

《Head First 设计模式》代码之PHP版

发布在 邵珠庆

《Head First 设计模式》是本不错的讲解设计模式的书,不像F4写的那么枯燥,应该算是比较容易理解的好书。书中的例子都比较浅显易懂,不过由于是外国佬写的,所以例子的习惯不是很附合中国特色,可能偶尔看起来有些别扭,还有语言习惯也不是中国风。当然看过这本书之后,你才能深刻理解设计模式到底能为你解决哪些题,不能为你解决哪些问题(比如不能代替你的编码)。

策略模式

 

[php] view plaincopy

 
  1. <?php  
  2. /** 
  3.  * 策略模式 
  4.  * 定义了算法族,分别封装起来,让它们之间可以互相替换, 
  5.  * 此模式让算法的变化独立于使用算法的客户。 
  6.  */  
  7. //飞行行为接口  
  8. interface FlyBehavior {  
  9.     public function fly();  
  10. }  
  11. //呱呱叫行为接口  
  12. interface QuackBehavior {  
  13.     public function quack();  
  14. }  
  15. //翅膀飞行  
  16. class FlyWithWings implements FlyBehavior {  
  17.     public function fly() {  
  18.         echo "I'm flying!!/n";  
  19.     }  
  20. }  
  21. //不会飞  
  22. class FlyNoWay implements FlyBehavior {  
  23.     public function fly() {  
  24.         echo "I can't fly!/n";  
  25.     }  
  26. }  
  27. class FlyRocketPowered implements FlyBehavior {  
  28.     public function fly() {  
  29.         echo "I'm flying with a rocket!/n";  
  30.     }  
  31. }  
  32. class Qquack implements QuackBehavior {  
  33.     public function quack() {  
  34.         echo "Quack/n";  
  35.     }  
  36. }  
  37. class Squeak implements QuackBehavior {  
  38.     public function quack() {  
  39.         echo "Squeak/n";  
  40.     }  
  41. }  
  42. class MuteQuack implements QuackBehavior {  
  43.     public function quack() {  
  44.         echo "<< Silence >>/n";  
  45.     }  
  46. }  
  47. abstract class Duck {  
  48.     protected $quack_obj;  
  49.     protected $fly_obj;  
  50.     public abstract function display();  
  51.     public function performQuack() {  
  52.         $this->quack_obj->quack();  
  53.     }  
  54.     public function performFly() {  
  55.         $this->fly_obj->fly();  
  56.     }  
  57.     public function swim() {  
  58.         echo "All ducks float, even decoys!/n";  
  59.     }  
  60.     public function setFlyBehavior(FlyBehavior $fb) {  
  61.         $this->fly_obj = $fb;  
  62.     }  
  63.     public function setQuackBehavior(QuackBehavior $qb) {  
  64.         $this->quack_obj = $qb;  
  65.     }  
  66. }  
  67. class ModelDuck extends Duck {  
  68.     public function __construct() {  
  69.         $this->fly_obj = new FlyNoWay();  
  70.         $this->quack_obj = new MuteQuack();  
  71.     }  
  72.     public function display() {  
  73.         echo "I'm a model duck!/n";  
  74.     }  
  75. }  
  76. $model = new ModelDuck();  
  77. $model->performFly();  
  78. $model->performQuack();  
  79. //提供新的能力  
  80. $model->setFlyBehavior(new FlyRocketPowered());  
  81. $model->setQuackBehavior(new Squeak());  
  82. $model->performFly();  
  83. $model->performQuack();  
  84. ?>  

 

单件模式

 

[php] view plaincopy

 
  1. <?php  
  2. /** 
  3.  * 单件模式 
  4.  * 确保一个类只有一个实例,并提供一个全局访问点。 
  5.  */  
  6. class MyClass {  
  7.     private static $uniqueInstance;  
  8.     private function __construct() {  
  9.     }  
  10.     public static function getInstance() {  
  11.         if (self::$uniqueInstance == null) {  
  12.             self::$uniqueInstance = new MyClass();  
  13.         }  
  14.         return self::$uniqueInstance;  
  15.     }  
  16. }  
  17. $myClass = MyClass::getInstance();  
  18. var_dump($myClass);  
  19. $myClass = MyClass::getInstance();  
  20. var_dump($myClass);  
  21. ?>  

 

工厂方法模式

 

[php] view plaincopy

 
  1. <?php  
  2. abstract class PizzaStore {  
  3.     public function orderPizza($type) {  
  4.         $pizza = $this->createPizza($type);  
  5.         $pizza->prepare();  
  6.         $pizza->bake();  
  7.         $pizza->cut();  
  8.         $pizza->box();  
  9.         return $pizza;  
  10.     }  
  11.     public abstract function createPizza($type);  
  12. }  
  13. class NYPizzaStore extends PizzaStore {  
  14.     public function createPizza($type) {  
  15.         if ($type == "cheese") {  
  16.             return new NYStyleCheesePizza();  
  17.         } elseif ($type == "veggie") {  
  18.             return new NYStyleVeggiePizza();  
  19.         } elseif ($type == "clam") {  
  20.             return new NYStyleClamPizza();  
  21.         } elseif ($type == "papperoni") {  
  22.             return new NYStylePapperoniPizza();  
  23.         } else {  
  24.             return null;  
  25.         }  
  26.     }  
  27. }  
  28. class ChicagoPizzaStore extends PizzaStore {  
  29.     public function createPizza($type) {  
  30.         if ($type == "cheese") {  
  31.             return new ChicagoStyleCheesePizza();  
  32.         } elseif ($type == "veggie") {  
  33.             return new ChicagoStyleVeggiePizza();  
  34.         } elseif ($type == "clam") {  
  35.             return new ChicagoStyleClamPizza();  
  36.         } elseif ($type == "papperoni") {  
  37.             return new ChicagoStylePapperoniPizza();  
  38.         } else {  
  39.             return null;  
  40.         }  
  41.     }  
  42. }  
  43. abstract class Pizza {  
  44.     public $name;  
  45.     public $dough;  
  46.     public $sauce;  
  47.     public $toppings = array();  
  48.     public function prepare() {  
  49.         echo "Preparing " . $this->name . "/n";  
  50.         echo "Yossing dough.../n";  
  51.         echo "Adding sauce.../n";  
  52.         echo "Adding toppings: /n";  
  53.         for ($i = 0; $i < count($this->toppings); $i++) {  
  54.             echo "    " . $this->toppings[$i] . "/n";  
  55.         }  
  56.     }  
  57.     public function bake() {  
  58.         echo "Bake for 25 minutes at 350/n";  
  59.     }  
  60.     public function cut() {  
  61.         echo "Cutting the pizza into diagonal slices/n";  
  62.     }  
  63.     public function box() {  
  64.         echo "Place pizza in official PizzaStore box/n";  
  65.     }  
  66.     public function getName() {  
  67.         return $this->name;  
  68.     }  
  69. }  
  70. class NYStyleCheesePizza extends Pizza {  
  71.     public function __construct() {  
  72.         $this->name = "NY Style Sauce and cheese Pizza";  
  73.         $this->dough = "Thin Crust Dough";  
  74.         $this->sauce = "Marinara Sauce";  
  75.         $this->toppings[] = "Grated Reggiano Cheese";  
  76.     }  
  77. }  
  78. class NYStyleVeggiePizza extends Pizza {  
  79.     public function __construct() {  
  80.         $this->name = "NY Style Sauce and veggie Pizza";  
  81.         $this->dough = "Thin Crust Dough";  
  82.         $this->sauce = "Marinara Sauce";  
  83.         $this->toppings[] = "Grated Reggiano veggie";  
  84.     }  
  85. }  
  86. class NYStyleClamPizza extends Pizza {  
  87.     public function __construct() {  
  88.         $this->name = "NY Style Sauce and clam Pizza";  
  89.         $this->dough = "Thin Crust Dough";  
  90.         $this->sauce = "Marinara Sauce";  
  91.         $this->toppings[] = "Grated Reggiano clam";  
  92.     }  
  93. }  
  94. class NYStylePapperoniPizza extends Pizza {  
  95.     public function __construct() {  
  96.         $this->name = "NY Style Sauce and papperoni Pizza";  
  97.         $this->dough = "Thin Crust Dough";  
  98.         $this->sauce = "Marinara Sauce";  
  99.         $this->toppings[] = "Grated Reggiano papperoni";  
  100.     }  
  101. }  
  102. class ChicagoStyleCheesePizza extends Pizza {  
  103.     public function __construct() {  
  104.         $this->name = "Chicago Style Deep Dish Cheese Pizza";  
  105.         $this->dough = "Extra Thick Crust Dough";  
  106.         $this->sauce = "Plum Tomato Sauce";  
  107.         $this->toppings[] = "Shredded Mozzarella Cheese";  
  108.     }  
  109.     public function cut() {  
  110.         echo "Cutting the pizza into square slices/n";  
  111.     }  
  112. }  
  113. $myStore = new NYPizzaStore();  
  114. $chicagoStore = new ChicagoPizzaStore();  
  115. $pizza = $myStore->orderPizza("cheese");  
  116. echo "Ethan ordered a " . $pizza->getName() . "/n";  
  117. $pizza = $chicagoStore->orderPizza("cheese");  
  118. echo "Ethan ordered a " . $pizza->getName() . "/n";  
  119. ?>  

 

工厂模式

 

[php] view plaincopy

 
  1. <?php  
  2. abstract class PizzaStore {  
  3.     public function orderPizza($type) {  
  4.         $pizza = $this->createPizza($type);  
  5.         $pizza->prepare();  
  6.         $pizza->bake();  
  7.         $pizza->cut();  
  8.         $pizza->box();  
  9.         return $pizza;  
  10.     }  
  11.     public abstract function createPizza($type);  
  12. }  
  13. class NYPizzaStore extends PizzaStore {  
  14.     public function createPizza($type) {  
  15.         $pizza = null;  
  16.         $ingredientFactory = new NYPizzaIngredientFactory();  
  17.         if ($type == "cheese") {  
  18.             $pizza = new CheesePizza($ingredientFactory);  
  19.             $pizza->setName('New York Style Cheese Pizza');  
  20.         } elseif ($type == "veggie") {  
  21.             $pizza = new VeggiePizza($ingredientFactory);  
  22.             $pizza->setName('New York Style Veggie Pizza');  
  23.         } elseif ($type == "clam") {  
  24.             $pizza = new ClamPizza($ingredientFactory);  
  25.             $pizza->setName('New York Style Clam Pizza');  
  26.         } elseif ($type == "papperoni") {  
  27.             $pizza = new PapperoniPizza($ingredientFactory);  
  28.             $pizza->setName('New York Style Papperoni Pizza');  
  29.         }  
  30.         return $pizza;  
  31.     }  
  32. }  
  33. class ChicagoPizzaStore extends PizzaStore {  
  34.     public function createPizza($type) {  
  35.         if ($type == "cheese") {  
  36.             return new ChicagoStyleCheesePizza();  
  37.         } elseif ($type == "veggie") {  
  38.             return new ChicagoStyleVeggiePizza();  
  39.         } elseif ($type == "clam") {  
  40.             return new ChicagoStyleClamPizza();  
  41.         } elseif ($type == "papperoni") {  
  42.             return new ChicagoStylePapperoniPizza();  
  43.         } else {  
  44.             return null;  
  45.         }  
  46.     }  
  47. }  
  48. interface PizzaIngredientFactory {  
  49.     public function createDough();  
  50.     public function createSauce();  
  51.     public function createCheese();  
  52.     public function createVeggies();  
  53.     public function createPepperoni();  
  54.     public function createClam();  
  55. }  
  56. class NYPizzaIngredientFactory implements PizzaIngredientFactory {  
  57.     public function createDough() {  
  58.         return new ThinCrustDough();  
  59.     }  
  60.     public function createSauce() {  
  61.         return new MarinaraSauce();  
  62.     }  
  63.     public function createCheese() {  
  64.         return new ReggianoCheese();  
  65.     }  
  66.     public function createVeggies() {  
  67.         $veggies = array(  
  68.         new Garlic(),  
  69.         new Onion(),  
  70.         new Mushroom(),  
  71.         new RedPepper(),  
  72.         );  
  73.         return $veggies;  
  74.     }  
  75.     public function createPepperoni() {  
  76.         return new SlicedPepperoni();  
  77.     }  
  78.     public function createClam() {  
  79.         return new FreshClams();  
  80.     }  
  81. }  
  82. class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {  
  83.     public function createDough() {  
  84.         return new ThickCrustDough();  
  85.     }  
  86.     public function createSauce() {  
  87.         return new PlumTomatoSauce();  
  88.     }  
  89.     public function createCheese() {  
  90.         return new Mozzarella();  
  91.     }  
  92.     public function createVeggies() {  
  93.         $veggies = array(  
  94.         new BlackOlives(),  
  95.         new Spinach(),  
  96.         new EggPlant(),  
  97.         );  
  98.         return $veggies;  
  99.     }  
  100.     public function createPepperoni() {  
  101.         return new SlicedPepperoni();  
  102.     }  
  103.     public function createClam() {  
  104.         return new FrozenClams();  
  105.     }  
  106. }  
  107. abstract class Pizza {  
  108.     public $name;  
  109.     public $dough;  
  110.     public $sauce;  
  111.     public $veggies = array();  
  112.     public $cheese;  
  113.     public $pepperoni;  
  114.     public $clam;  
  115.     public abstract function prepare();  
  116.     public function bake() {  
  117.         echo "Bake for 25 minutes at 350/n";  
  118.     }  
  119.     public function cut() {  
  120.         echo "Cutting the pizza into diagonal slices/n";  
  121.     }  
  122.     public function box() {  
  123.         echo "Place pizza in official PizzaStore box/n";  
  124.     }  
  125.     public function getName() {  
  126.         return $this->name;  
  127.     }  
  128.     public function setName($name) {  
  129.         $this->name = $name;  
  130.     }  
  131.     public function __toString() {  
  132.     }  
  133. }  
  134. class CheesePizza extends Pizza {  
  135.     public $ingredientFactory;  
  136.     public function __construct(PizzaIngredientFactory $ingredientFactory) {  
  137.         $this->ingredientFactory = $ingredientFactory;  
  138.     }  
  139.     public function prepare() {  
  140.         echo "Preparing " . $this->name . "/n";  
  141.         $this->dough = $this->ingredientFactory->createDough();  
  142.         $this->sauce = $this->ingredientFactory->createSauce();  
  143.         $this->cheese = $this->ingredientFactory->createCheese();  
  144.     }  
  145. }  
  146. class ClamPizza extends Pizza {  
  147.     public $ingredientFactory;  
  148.     public function __construct(PizzaIngredientFactory $ingredientFactory) {  
  149.         $this->ingredientFactory = $ingredientFactory;  
  150.     }  
  151.     public function prepare() {  
  152.         echo "Preparing " . $this->name . "/n";  
  153.         $this->dough = $this->ingredientFactory->createDough();  
  154.         $this->sauce = $this->ingredientFactory->createSauce();  
  155.         $this->cheese = $this->ingredientFactory->createCheese();  
  156.         $clam = $this->ingredientFactory->createClam();  
  157.     }  
  158. }  
  159. $nyPizzaStore = new NYPizzaStore();  
  160. $nyPizzaStore->orderPizza('cheese');  
  161. ?>  

 

观察者模式

 

[php] view plaincopy

 
  1. <?php  
  2. /** 
  3.  * 观察者模式 
  4.  * 定义了对象之间的一对多依赖,当一个对象改变状态时, 
  5.  * 它的所有依赖者都会收到通知并自动更新。 
  6.  */  
  7. interface Subject {  
  8.     public function registerObserver(Observer $o);  
  9.     public function removeObserver(Observer $o);  
  10.     public function notifyObservers();  
  11. }  
  12. interface Observer {  
  13.     public function update($temperature, $humidity, $pressure);  
  14. }  
  15. interface DisplayElement {  
  16.     public function display();  
  17. }  
  18. class WeatherData implements Subject {  
  19.     private $observers = array();  
  20.     private $temperature;  
  21.     private $humidity;  
  22.     private $pressure;  
  23.     public function __construct() {  
  24.         $this->observers = array();  
  25.     }  
  26.     public function registerObserver(Observer $o) {  
  27.         $this->observers[] = $o;  
  28.     }  
  29.     public function removeObserver(Observer $o) {  
  30.         if (($key = array_search($o, $this->observers)) !== false) {  
  31.             unset($this->observers[$key]);  
  32.         }  
  33.     }  
  34.     public function notifyObservers() {  
  35.         foreach ($this->observers as $observer) {  
  36.             $observer->update($this->temperature, $this->humidity, $this->pressure);  
  37.         }  
  38.     }  
  39.     public function measurementsChanged() {  
  40.         $this->notifyObservers();  
  41.     }  
  42.     public function setMeasurements($temperature, $humidity, $pressure) {  
  43.         $this->temperature = $temperature;  
  44.         $this->humidity = $humidity;  
  45.         $this->pressure = $pressure;  
  46.         $this->measurementsChanged();  
  47.     }  
  48. }  
  49. class CurrentConditionsDisplay implements Observer, DisplayElement {  
  50.     private $temperature;  
  51.     private $humidity;  
  52.     private $weatherData;  
  53.     public function __construct(Subject $weatherData) {  
  54.         $this->weatherData = $weatherData;  
  55.         $weatherData->registerObserver($this);  
  56.     }  
  57.     public function update($temperature, $humidity, $pressure) {  
  58.         $this->temperature = $temperature;  
  59.         $this->humidity = $humidity;  
  60.         $this->display();  
  61.     }  
  62.     public function display() {  
  63.         echo "温度:" . $this->temperature . "; 湿度:" . $this->humidity . "%/n";  
  64.     }  
  65. }  
  66. class StatistionsDisplay implements Observer, DisplayElement {  
  67.     private $temperature;  
  68.     private $humidity;  
  69.     private $pressure;  
  70.     private $weatherData;  
  71.     public function __construct(Subject $weatherData) {  
  72.         $this->weatherData = $weatherData;  
  73.         $weatherData->registerObserver($this);  
  74.     }  
  75.     public function update($temperature, $humidity, $pressure) {  
  76.         $this->temperature = $temperature;  
  77.         $this->humidity = $humidity;  
  78.         $this->pressure = $pressure;  
  79.         $this->display();  
  80.     }  
  81.     public function display() {  
  82.         echo "温度:" . $this->temperature . "; 湿度:" . $this->humidity . "%; 气压:" . $this->pressure . "/n";  
  83.     }  
  84. }  
  85. $weatherData = new WeatherData();  
  86. $currentDisplay = new CurrentConditionsDisplay($weatherData);  
  87. $statistionDisplay = new StatistionsDisplay($weatherData);  
  88. $weatherData->setMeasurements(10, 20, 30);  
  89. $weatherData->removeObserver($currentDisplay);  
  90. $weatherData->setMeasurements(30, 40, 50);  
  91. ?>  

 

命令模式

 

[php] view plaincopy

 
  1. <?php  
  2. class Light {  
  3.     public function __construct() {  
  4.     }  
  5.     public function on() {  
  6.         echo "Light On/n";  
  7.     }  
  8.     public function off() {  
  9.         echo "Light Off/n";  
  10.     }  
  11. }  
  12. interface Command {  
  13.     public function execute();  
  14. }  
  15. class LightOnCommand implements Command {  
  16.     public $light;  
  17.     public function __construct(Light $light) {  
  18.         $this->light = $light;  
  19.     }  
  20.     public function execute() {  
  21.         $this->light->on();  
  22.     }  
  23. }  
  24. class SimpleRemoteControl {  
  25.     public $slot;  
  26.     public function __construct() {  
  27.     }  
  28.     public function setCommand(Command $command) {  
  29.         $this->slot = $command;  
  30.     }  
  31.     public function buttonWasPressed() {  
  32.         $this->slot->execute();  
  33.     }  
  34. }  
  35. class RemoteControlTest {  
  36.     public static function main() {  
  37.         $remote = new SimpleRemoteControl();  
  38.         $light = new Light();  
  39.         $lightOn = new LightOnCommand($light);  
  40.         $remote->setCommand($lightOn);  
  41.         $remote->buttonWasPressed();  
  42.     }  
  43. }  
  44. RemoteControlTest::main();  
  45. ?>  

 

 

装饰者模式

 

[php] view plaincopy

 
  1. <?php  
  2. /** 
  3.  * 装饰着模式 
  4.  * 动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 
  5.  */  
  6. abstract class Beverage {  
  7.     public $description = "Unknown Beverage";  
  8.     public function getDescription() {  
  9.         return $this->description;  
  10.     }  
  11.     public abstract function cost();  
  12. }  
  13. abstract class CondimentDecorator extends Beverage {  
  14.     //JAVA代码里这里是个抽象类,PHP不允许这么做  
  15.     public function getDescription() {  
  16.         return $this->description;  
  17.     }  
  18. }  
  19. class Espresso extends Beverage {  
  20.     public function __construct() {  
  21.         $this->description = "Espresso";  
  22.     }  
  23.     public function cost() {  
  24.         return 1.99;  
  25.     }  
  26. }  
  27. class HouseBlend extends Beverage {  
  28.     public function __construct() {  
  29.         $this->description = "HouseBlend";  
  30.     }  
  31.     public function cost() {  
  32.         return .89;  
  33.     }  
  34. }  
  35. class DarkRoast extends Beverage {  
  36.     public function __construct() {  
  37.         $this->description = "DarkRoast";  
  38.     }  
  39.     public function cost() {  
  40.         return .99;  
  41.     }  
  42. }  
  43. class Mocha extends CondimentDecorator {  
  44.     public $beverage;  
  45.     public function __construct(Beverage $beverage) {  
  46.         $this->beverage = $beverage;  
  47.     }  
  48.     public function getDescription() {  
  49.         return $this->beverage->getDescription() . ", Mocha";  
  50.     }  
  51.     public function cost() {  
  52.         return .20 + $this->beverage->cost();  
  53.     }  
  54. }  
  55. class Whip extends CondimentDecorator {  
  56.     public $beverage;  
  57.     public function __construct(Beverage $beverage) {  
  58.         $this->beverage = $beverage;  
  59.     }  
  60.     public function getDescription() {  
  61.         return $this->beverage->getDescription() . ", Whip";  
  62.     }  
  63.     public function cost() {  
  64.         return .10 + $this->beverage->cost();  
  65.     }  
  66. }  
  67. class Soy extends CondimentDecorator {  
  68.     public $beverage;  
  69.     public function __construct(Beverage $beverage) {  
  70.         $this->beverage = $beverage;  
  71.     }  
  72.     public function getDescription() {  
  73.         return $this->beverage->getDescription() . ", Soy";  
  74.     }  
  75.     public function cost() {  
  76.         return .15 + $this->beverage->cost();  
  77.     }  
  78. }  
  79. $beverage = new Espresso();  
  80. echo $beverage->getDescription() . "/n";  
  81. $beverage2 = new DarkRoast();  
  82. $beverage2 = new Mocha($beverage2);  
  83. $beverage2 = new Mocha($beverage2);  
  84. $beverage2 = new Whip($beverage2);  
  85. echo $beverage2->getDescription() . " $" . $beverage2->cost() . "/n";  
  86. $beverage3 = new HouseBlend();  
  87. $beverage3 = new Soy($beverage3);  
  88. $beverage3 = new Mocha($beverage3);  
  89. $beverage3 = new Whip($beverage3);  
  90. echo $beverage3->getDescription() . " $" . $beverage3->cost() . "/n";  
  91. ?>  

 

状态模式

 

[php] view plaincopy

 
  1. <?php  
  2. class GumballMachine {  
  3.     const SOLD_OUT = 0;  
  4.     const NO_QUARTER = 1;  
  5.     const HAS_QUARTER = 2;  
  6.     const SOLD = 3;  
  7.     public $state = self::SOLD_OUT;  
  8.     public $count = 0;  
  9.     public function __construct($count) {  
  10.         $this->count = $count;  
  11.         if ($count > 0) {  
  12.             $this->state = self::NO_QUARTER;  
  13.         }  
  14.     }  
  15.     public function insertQuarter() {  
  16.         if ($this->state == self::HAS_QUARTER) {  
  17.             echo "You can't insert another quarter!/n";  
  18.         } else if ($this->state == self::NO_QUARTER) {  
  19.             $this->state = self::HAS_QUARTER;  
  20.             echo "You inserted a quarter!/n";  
  21.         } else if ($this->state == self::SOLD_OUT) {  
  22.             echo "You can't insert a quarter, the machine is sold out!/n";  
  23.         } else if ($this->state == self::SOLD) {  
  24.             echo "Please wait, we're already giving you a gumball!/n";  
  25.         }  
  26.     }  
  27. }  
  28. $obj = new GumballMachine(0);  
  29. print_r($obj)  
  30. ?>  

 

241月/130

jQuery 中使用 JSON

发布在 邵珠庆

 

JSON 格式

json 是 Ajax 中使用频率最高的数据格式,在浏览器和服务器中之间的通讯可离不开它。

JSON 的格式说明可以在可以这里看到,非常详细,还是中文的。

 JSON 格式说明

需要特别注意的是,在 JSON 中的属性名是需要使用引号引起来的。

 jQuery 中使用 JSON

jQuery 是现在使用广泛的脚本库,那么,在 jQuery 中如何使用 JSON 呢?

解析 JSON

在 jQuery 中已经提供了对于解析 JSON 的内在支持,

jQuery.parseJSON 函数提供了解析的支持,详细的说明见这里

var obj = jQuery.parseJSON('{"name":"John"}');  
alert( obj.name === "John" );  

使用对象生成 JSON 格式串

在 jQuery 中并没有提供直接将普通的 JavaScript 对象转换为 JSON 串的方法,可以使用下面的扩展库来完成。

jquery-json 扩展库

这个库用来扩展 jQuery ,对于 JSON 的使用,扩展了两个方法。

toJSON 方法用来将一个普通的 JavaScript 对象序列化为 JSON 串。

var thing = {plugin: 'jquery-json', version: 2.3};    
var encoded = $.toJSON( thing ); // '{"plugin":"jquery-json","version":2.3}' 

evalJSON 方法将一个 JSON 串解析为一个普通的 JavaScript 对象。

var thing = {plugin: 'jquery-json', version: 2.3};    
var encoded = $.toJSON( thing ); // '{"plugin":"jquery-json","version":2.3}'   
var name = $.evalJSON( encoded ).plugin; // "jquery-json"   
var version = $.evalJSON(encoded).version; // 2.3 

这个扩展的下载地址:http://code.google.com/p/jquery-json/

使用 jQuery 配合 WCF

客户端

jQuery 中的 $.post 可以直接向服务器发出请求,将服务器返回的数据按照 JSON 方式进行解析,不过,需要注意下面几点:

请求的内容类型必须为  json 格式,这可以通过上面的 jQuery-json 扩展库来完成,需要特别注意的在请求的 contentType 也必须使用  text/json 进行说明,默认的 post 使用普通的名值对方式请求,因此 contentType 是: application/x-www-form-urlencoded,可以通过 $.ajaxSetup 来进行设置:

// Ajax 设置  
$.ajaxSetup({ contentType: 'text/json' });  

这样,请求的内容类型就设置为需要的类型。

其次,实际的请求内容必须使用 JSON 方式,这可以通过扩展库的 $.toJSON 来实现,例如:

$.toJSON({ x: 2, y: 3 })

  

这样,如果服务器端提供了一个服务方法 Sum,定义如下:

public int Sum(int x, int y)  
{  
    return x + y;  
}

就可以如下调用了。注意,WCF 返回的数据在属性 d 中。

复制代码
// Ajax 设置  
$.ajaxSetup({ contentType: 'text/json' });  

$("#wcfBtn").click(function () {  
    $.post("Service1.svc/Sum", $.toJSON({ x: 2, y: 3 }), function (data) {  
        alert(data.d);  
    });  
});  
复制代码

服务器端的配置

首先,为服务增加标签:[System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)]

复制代码
// #1  
// 为了在脚本中使用,必须增加这个标签  
[System.ServiceModel.Activation.AspNetCompatibilityRequirements( 
    RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)]  

// #2  
// 在网站的配置文件中也需要进行设定  
public class Service1 : IService1  
{  
    public int Sum(int x, int y)  
    {  
        return x + y;  
    }  
}
复制代码

  

然后,在网站的配置文件中,如下配置。

复制代码
<system.serviceModel>  
  <!-- 为了支持在浏览器端调用 WCF 服务的特定配置 -->  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true">  
    <serviceActivations>  

      <!-- relativeAddress 服务的地址  
           service 实现服务的类型,全名,包含命名空间,甚至程序集  
           factory 是 WCF 系统提供,直接使用  
      -->  

      <add relativeAddress="Service1.svc" service="MServer.Service1"  factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"   
           />  
    </serviceActivations>  
  </serviceHostingEnvironment>  

    <behaviors>  
        <serviceBehaviors>  
            <behavior name="">  
                <serviceMetadata httpGetEnabled="true" />  
                <serviceDebug includeExceptionDetailInFaults="false" />  
            </behavior>  
        </serviceBehaviors>  
    </behaviors>  
</system.serviceModel> 
复制代码

 

231月/130

各大IT公司、软件公司员工等级(级别)及薪资

发布在 邵珠庆

信息来自互联网(很多是猎头的post中包括了薪水信息)

数据很可能已经过时,准确性很不高,仅供参考

主要对象职位:技术类,工程师

IBM员工等级(级别)

Band

Non-ManagementTitle

ManagementTitle

6

SalesSpecialist

 

7

AdvisorySalesSpecialist

 

8

SeniorSalesSpecialist

SalesSpecialist-Manager

9

ConsultingSalesSpecialist

ConsultingSalesSpecialist-Manager

10

SeniorConsultingSalesSpecialist

SeniorConsultingSalesSpecialist-Manager

 

 

 

6

ITSpecialist

 

7

AdvisoryITSpecialist

 

8

SeniorITSpecialist

SeniorITSpecialist-Manager

9

ConsultingITSpecialist

ConsultingITSpecialist-Manager

10

ExecutiveITSpecialist

ExecutiveITSpecialist-Manager

 

 

 

6

SoftwareEngineer

 

7

StaffSoftwareEngineer

SoftwareEngineering-DepartmentManager

8

AdvisorySoftwareEngineer

SoftwareEngineering-Manager

9

SeniorSoftwareEngineer

SoftwareEngineering-SeniorManager

10

STSM-Software

ManagerofSoftwareEngineering

 

 

 

6

Consultant

 

7

SeniorConsultant

 

8

ManagingConsultant

ManagingConsultant-Manager

9

SeniorManagingConsultant

SeniorManagingConsultant-Manager

10

ExecutiveConsultant

ExecutiveConsultant

 

部门结构

 

GBS 前端咨询..有战略咨询 有ERP咨询...流程咨询比较多

GTS 后端 为4大国有银行做维护

CDL 研发中心 (CSDL & CSTL)

ISSC 外包中心  -> 现在叫 GDC,GDC的regular算是IBM的正式员工。

 

GDC工资低于GBS,那是肯定的,GDC需要的是大量的工人,而不是个个都是行业顾问专家。

GDC里面一半都是刚刚毕业没两年

 

GBS比ISSC名气好,顾问性质,IBM 50%利润来源于此。

GBS:Band 7, GBS 14-20K, 14薪,+15% 住房补贴,满10万上限。

Band 8 20-30K,福利同上

 

ISSC Band 7 理论上16K到顶,可以突破。13薪,签约奖金两个月,10%住房补贴,

Band 8 也是比GBS低一些,有猎头说,基本上低半级。

 

出差: GBS,250一天。 Fly Back

GDC:包月的形式,一月7500给你

IBM 里的朋友都认为,ISSC不是IBM的。虽然理论上,ISSC应该是的...

两个公司的HR是不同的...

 

以前GBS做实施,ISSC做维护。据说ISSC也开始和GBS一起做项目了。

 

18摸得薪酬到底怎么样,我给大家一个参考值,不同的部门同一个band 差距较大,这里给出同一个band的上下值。2012.10 版(睡前月基本工资)band7 1.24W ~2.76W , band8 1.9w ~4.2w, band9 3.3w ~7.7w , band10 5.28w ~12.3w ,全公司均值 band7 2w, band8 3w band9 5.5w band10 8.8w,你在哪个水平[偷笑]

发信人: wayy (wayy), 信区: WorkLife 
标  题: Re: ibm硕士五年年薪40万 
发信站: 水木社区 (Mon Apr 15 21:54:25 2013), 站内 
  
我俩小弟一个去年到9,一个今年到9  
都不到60万,base都在3万出头  
18摸工资很低,不过胜在worklife balance强 

我知道lab 里边有个band 10, package大约65万  
【 在 reflection (闲爱孤云) 的大作中提到: 】 
: 9的话幅度就比8大多了。越往上差距越大。18摸认为核心员工最低的级别就是10,所 
: 以9以下的就没必要以18摸为荣了,都是边角料。   

薪水结构

同Band的技术和销售,MBS的范围都是一样的,不同的只是incentive plan不同,销售141%,技术119%

销售的收入的141%,其中的的77.5%部分是稳定的,其他的是浮动bonus

Band7最高的MBS是21K

Band 8的MBS range是18K~34K

Band9 mbs   2w5~5w5的样子。80w的package差不多就到头了

一个offer例子:

1. your reference monthly salary is 24,000

2. monthly allowance is 800

3. 10% housing fund

4. 15% saving fund   => 需要干满三年才能提取

5. 141% incentive plan (55/45 paymix)

6. 14 months reference salary annually => 14个月工资

7. total annual package is 525,813.

           ===> 谈offer应该直接谈MBS

微软 Microsoft 员工等级(级别)

(发表于2010-07-22)  头两年,大多数college new hire的engineer级别都是59,一部分是60,还有少数是61或者更高。最近的new hire逐渐都变为60,否则很难吸引人加入。

 

59,60被称作SDE/SDET/PM, 61,62是SDE2/SDET2/PM2, 63,64是Senior SDE Senior SDET, Senior PM, or Senior ****,取决于你的普通title。65开始叫做principle。68开始叫做partner,70是distinguished engineer,有些VP也是这个级别。但大多数VP,techinical fellow都是80级。据说billg的级别很高。大多数人混到senior就止步了,有人开玩笑说,只要到了senior就是大锅饭,不会layoff。有些人能混到principle。再有些牛人,才能到principle之上,算是微软的厉害人物。

 

59之下的级别,主要是给那些stuff和秘书之类的。以前有手工测试的时候,他们的级别都是57。微软研究院的研究员是另外一套体制,他们的级别基本是同阶段engineer的级别+3. 还是很爽的。

 

59级的薪水,几年前大概在7万6左右。每增长一级工资,base大概能增长大几千将近1w,cash bonus的增加并不多,但stock award跟级别关系很大,比如62级的award就将近是61级别2倍。66又将近是65的两倍。但62,63,64变化不甚大。

HP

5c对应于spe 1,  是software engineer 5c. 是罗马数字V。(月薪参考:11k)

5b 对应于spe 2,  (Solution Architect)  (月薪参考:10k-20k)

5就对应于spe 3了。(月薪参考:10k-20k)

6对应expert。expert分exp 1和exp 2.

 

exp后升master是走技术路线,升manager是管理路线。

 

Oracle员工等级(级别)

 

技术岗

管理岗

 

Level

Title

Level

Title

ic1

ic2

Junior Engineer

Staff Engineer

 

 

ic3

Senior Engineer

m2

Manager

ic4

Principle Engineer

m3

Senior Manager

ic5

Senior Principle Engineer

m4

Director

         

 

Oracle R&D (研发中心) ic3参考年薪20w+

ic4参考年薪30w+

O记的software engineer(IC2)相当于IBM的band 6, senior(IC3)相当于band 7, principle(IC4)相当于band 8, consultant principle(IC5)相当于band 9吧

从package讲,O过去是靠谈,现在貌似要求你提供上一家的薪水,根据那个涨幅不超过20%,超过30%就要走特殊流程了。

路透员工等级(级别)

方舟大厦研发中心的待遇年薪 12个月工资,1个月年终奖,年薪15%的奖金,基本是15个月薪水

 

principal software engineer 22w-25w之间

senior software engineer 18w-22w之间

principal QA >22w

Senior QA <22w

 

software engineer 18w

QA engineer 16w

 

associate software engineer 15w

associate qa engineer 14w

 

trainee software engineer 10w

trainee qa engineer 10w

 

intern 2200/月

 

software team manager <30w

QA team manager <30w

specialist = team manager

 

project manager <30w

 

teachinal writer 16w

 

腾讯

T1-T4

T2和T3和T4之间有3个小等级 就是T2-1,T2-2,T3-3

T2-T3 15-30w

T3-T4 30-60W左右 可能有股票

 

VMware员工等级(级别)

R&D QA Manager ,35W以上,最低20k/m (2010-8-31)

QA Manager   薪资  35~45,    Senior QA Manager薪资  70/80   (2011-8-24)

Senior Engineer 25万-32万/年,股票。20天年假,全家保险,100%报销。(2011-10-19)

Adobe员工等级(级别)

QE developer-RMB 118,200 – RMB 171,300

QE lead- RMB 145,200–RMB313,650

 

华为:

员工级别

职位名称

配股

标准岗位工资

C

B

A

13   

 

2W

5500   

6500   

7500   

14   

工程师B

5W

7500   

9000   

10500   

15   

工程师A

20W

10500   

12500   

14500   

16   

高级工程师B

30W

14500   

17000   

19500   

17   

高级工程师A

50W

19500   

22500   

25500   

18   

主任工程师

80W

25500   

29000   

32500   

19   

技术专家B

120W

32500   

36500   

40500   

20   

技术专家A

200W

40500   

44500   

49500   

21   

高级技术专家

300W

49500   

54500   

59500   

22   

资深技术专家

500W

59500   

 

 

23   

 

1000W

 

 

 

 
阿里巴巴:员工等级(级别)
p5 工程师
p6 高级工程师 
p7 初级专家
p8 专家
p9 初级研究员
p10 研究员
p11 初级科学家
p12 科学家
p14
p14

一般硕士毕业是P5,博士毕业是P6
p6 月薪 7.5K – 17K 开始有期权或者股票
p8 差不多部门老大,月薪25K,年终奖11,股票另算。大多在50w左右

m是管理路线
m1 主管与p5相当
m2经理 与P7相当
m3高级经理 p8
m4 总监
m5高级总监
马云是m10,阿里巴巴m10就他一个

 

新浪:员工等级(级别)
4-1
3-3
3-2
3-1
2-3

181月/130

有效控制项目进度的几点技巧

发布在 邵珠庆

 

软件开发的项目周期大体分为3个阶段:获取需求和定义产品、开发和测试、部署和运维。

在获取需求和定义产品阶段,需要防止 的不是进度太慢而是过快、过草率。特别是对于创业公司的产品经理来说,很可能因为看到开发人员无事可做而感到压力,所以尽快完成产品定义,而没有充分了解 市场和竞争对手信息,没有与合作伙伴充分沟通,没有做深入的思考。

这些因仓促而隐藏的问题,发现得早则导致开发阶段大量返工,发现得晚则导致产品上线后不 受欢迎。常听一些人说现在互联网开发,讲究快速迭代和敏捷,边做边想,返工也正常。这是一个误解。快速迭代指的是将不同版本之间的周期缩短,小步快跑,而 不是在一个版本的周期内来回折腾。

在开发和测试阶段,项目管理重在跟踪进度和保持沟通—用集成和演示跟踪进度,基于Bug沟通问题。

要做到各个模块外部接口相对清晰稳定,并尽早完成各个模块间的集成,最晚不超过开发周期的1/4时间。第一次集成之后,就应该开始每日集成和每周演示。每日 集成使得测试团队每天能同步测试最新的代码,帮助开发团队尽早发现问题并及时了解技术细节上的进度;每周演示使产品经理、项目经理和管理层能从用户的角度 感受产品,使他们对产品有信心。集成和演示是项目管理的心跳,合理利用它们,有助于及时把握项目的健康程度。

无论开发流程多敏捷,工程师能 力多强,记录和跟踪Bug都是必不可少的。开发团队和测试团队的沟通都应该基于Bug,才能言之有物。开发工程师每次提交代码都应该记录是针对哪个Bug 的,每日工作简报都应该写今天关/开了哪些Bug。要在每日晨会(站着开,一般15分钟内)时说好,今天打算解决哪些Bug,其中有哪些点不清楚,需要和 谁沟通。

在后期部署和维护阶段,要快速响应。考验的是团队成员的责任心和抗压能力。系统运维工程师要深夜工作,因为部署可能要在流量低的时 候进行;项目经理要保持能随时沟通,做出快速而准确的决定,鼓励团队并做出表率;一旦出现高危害Bug,开发团队要在24小时内准备好补丁。Amazon 的做法比较有趣:在产品刚上线一段时间内,开发工程师要保持24小时开机。如果自己负责的模块中出现高危害Bug,那么很可能会在深夜被系统运维工程师叫醒。这样不仅能保证快速响应,还能让工程师意识到:前期代码不好好写,后期就别指望能好好睡觉了。

161月/130

中航信的ICS、CRS和DCS系统

发布在 邵珠庆

 

什么是GDS,全称是Global Distribution System,即全球分销系统,是基于计算机技术支持下的大规模销售网络。目前国际上的GDS分二类:

  1.既可以销售航空公司的产品(机票)也可以销售酒店的产品(客房),如SABRE、GALILEO、AMADEUS、WORLDSPAN和中国民航GDS系统(中航信Travelsky)。

  2.只可以销售酒店产品,如:UTELL、ACCOR和一些酒店集团自己的销售网络,如:假日集团、喜来登、希尔顿。

中航信GDS系统的运行方式说明

CRS全称是Computer Reservation System,即代理人机票售票系统。CRS主要功能是为代理人提供航班可利用情况查询、航段销售、订座记录、电子客票预订,旅游产品等服务。

ICS全称是Inventory Control System,即航空公司人员使用的航空公司订座系统。ICS是一个集中式、多航空公司的系统。每个航空公司享有自己独立的数据库、独立的用户群、独立的控制和管理方式,各种操作均可以加以个性化,包括航班班期、座位控制、运价及收益管理、航空联盟、销售控制参数等信息和一整套完备的订座功能引擎。

DCS全称是Departure Control System,即机场人员使用的离港控制系统。DCS是为机场提供旅客值机、配载平衡、航班数据控制、登机控制联程值机等信息服务,可以满足值机控制、装载控制、登机控制以及信息交换等机场旅客服务所需的全部功能。



根据上面图示,一名旅客来代理处购机票。

1.此时机票代理处首先要做的就是在CRS系统为旅客查询航班信息,那么CRS系统的航班信息是从何而来的呢。CRS系统航班信息是由ICS系统得来,ICS系统的主要功能就是建立,控制和销售航班,所以航空公司就会把所建立好的航班信息传送到CRS以便代理人查询销售航班。

2.旅客这时要购票,代理处需要在CRS系统为其建立旅客订座信息,当我们建立好记录并封口后,旅客的订座信息会传送到ICS系统,告知航空公司有旅客订取了某某航班的某某舱位。如果订座正常,代理处可以为旅客出票了。

3.旅客拿到机票后需要去机场进行值机换登机牌登机,那么机场是如何知道旅客购买的什么航空公司机票什么舱位呢。DCS系统会在飞机起飞48小时之内对航班进行初始化,ICS系统这时会对DCS系统拍发一份PNL报(旅客名单报),PNL报是指ICS系统把这个航班上所有旅客订座过的记录信息传送到DCS系统以便进行旅客值机。但在航班初始化完后到航班起飞这段期间内,ICS系统还会向DCS系统拍发一份ADL报(旅客增减报),ADL报指把在航班初始化完后到航班起飞这段时间,如果有新的旅客订座和原有旅客取消座位的信息,也会传送到DCS系统以便对上次初始化信息进行修改。

4. 最后,当旅客正常登机并且飞机正常起飞之后。这是DCS系统会向ICS系统拍发一份PFS报(最终销售报),PFS报是指把最后所有正常登机的旅客订座信息传送给航空公司系统,那么航空公司系统就可凭这些数据就可以进行结算了。

161月/130

国内航空公司图谱和数据

发布在 邵珠庆

 

国内主要航空公司图谱 

IATA ICAO 中文名称 英文名称 机队 性质 集团
CZ CSN 中国南方航空 China Southern Airlines 393   中国南方航空集团
CA CCA 中国国际航空 Air China 291   中国航空集团
MU CES 中国东方航空 China Eastern Airlines 310   中国东方航空集团
HU CHH 海南航空 Hainan Airlines 112   海南航空集团
ZH CSZ 深圳航空 Shenzhen Airlines 115   中国航空集团
GS GCR 天津航空 Tianjin Airlines 103   海南航空集团
FM CSH 上海航空 Shanghai Airlines 65   中国东方航空集团
MF CXA 厦门航空 Xiamen Airlines 86   中国南方航空集团
3U CSC 四川航空 Sichuan Airlines 73    
SC CDG 山东航空 Shandong Airlines 61   中国航空集团
JD CBJ 首都航空 Beijing Capital Airlines 39   海南航空集团
9C CQH 春秋航空 Spring Airlines 32    
HO DKH 吉祥航空 Shanghai Juneyao Airlines 30    
CK CCK 中国货运航空 China Cargo Airlines 19 货运 中国东方航空集团
8Y CYZ 中国邮政航空 China Postal Airlines 17 货运  
Y8 YZR 扬子江快运 Yangtze River Express 16 货运 海南航空集团
BK OKA 奥凯航空 Okay Airways 17    
EU UEA 成都航空 Chengdu Airlines 10    
8L LKE 祥鹏航空 Lucky Air 17   海南航空集团
KN CUA 中国联合航空 China United Airlines 12   中国东方航空集团
OQ CQN 重庆航空 Chongqing Airlines 9   中国南方航空集团
JI JAE 翡翠航空 Jade Cargo International 3 货运 中国航空集团
J5 EPA 东海航空 Shenzhen Donghai Airlines 14 货运  
PN CHB 西部航空 China West Air 9   海南航空集团
JR JOY 幸福航空 Joy Air 6 支线  
KY KNA 昆明航空 Kunming Airlines 7 支线 中国航空集团
G5 HXA 华夏航空 China Express Airlines 7 支线  
VD KPA 鲲鹏航空 Kun Peng Airlines 4 支线 中国航空集团
NS DBH 河北航空 Hebei Airlines 13    
UW UTP 友和道通航空 Uni-Top Airlines 3 货运  
CN GDC 大新华航空 Grand China Air 3   海南航空集团
O3 CSS 顺丰航空 SF Airlines 9 货运  
GD GSC 银河航空 Grandstar Cargo International Airlines 1 货运  
  CAO 中国国际货运航空 Air China Cargo 11 货运 中国航空集团
  CGN 长安航空 Chang'an Airlines N/A 支线 海南航空集团
  CXH 中国新华航空 China Xinhua Airlines N/A   海南航空集团
  CXI 山西航空 Shanxi Airlines N/A   海南航空集团
    贵州航空 Guizhou Airlines 11   中国南方航空集团
    汕头航空 Shantou Airlines 12   中国南方航空集团
    珠海航空 Zhuhai Airlines 6   中国南方航空集团
    东航江苏公司 China Eastern Airlines Jiangsu Company 32   中国东方航空集团
    东航武汉公司 China Eastern Airlines Wuhan Company 19   中国东方航空集团
    东航云南公司 China Eastern Yunnan Airlines 51   中国东方航空集团
TV TBA 西藏航空 Tibet Airlines 4   中国航空集团
  CCD 大连航空 Dalian Airlines 4   中国航空集团
GJ CDC 长龙航空 CDI Cargo Airlines 2 货运  
YI AYE 英安航空(筹) Yunnan YingAn Airlines N/A 支线  
注:机队数据更新时间:2012-11-07

港澳台地区航空公司

IATA ICAO 地区 英文名称 中文名称 机队 航空联盟
KA HDA 香港 Dragonair 港龙航空 35 寰宇一家
CX CPA 香港 Cathay Pacific Airways 国泰航空 139 寰宇一家
LD AHK 香港 Air Hong Kong 华民航空 11  
HX CRK 香港 Hong Kong Airlines 香港航空 25  
UO HKE 香港 Hong Kong Express Airways 香港快运航空 5  
NX AMU 澳门 Air Macau 澳门航空 14  
BR EVA 台湾 EVA Airways 长荣航空 59  
CI CAL 台湾 China Airlines 中华航空 71 天合联盟
AE MDA 台湾 Mandarin Airlines 华信航空 8 天合联盟
GE TNA 台湾 Transasia Airways 复兴航空 17  
B7 UIA 台湾 Uni Air 立荣航空 19  
EF FEA 台湾 Far Eastern Air Transport 远东航空 10  
注:机队数据更新时间:2012-07-12
141月/130

Zend Studio9 配置优化

发布在 邵珠庆

 

今天使用ZendStudio9的时候再次被卡得想死,ctrl+s保存文件的时候zend会先build什么东西,然后才进行save操作,每次如此。突然好怀念当初使用的zendStudio5.5,完全只是php的开发环境。而在6.0之后的版本都成为了ZendStudio for eclipse,也就是均是基于eclipse的。功能很强大,但能用到的却不多,还很占用资源。真想把他换了。但找来找去,还真找不到一个能比拟ZendStudio的开发环境,也不是很想退回去使用5.5的版本。

        那么我就自己研究Zend Studio的菜单栏和工具栏,看看有没有可以优化的配置,以下说明不一定正确:

1、关闭自动Build:
 Project -> Build Automatically 前面的勾选取消掉
在使用中,我发现Build的作用应该是为整个项目建立一个索引和预读取,加快查找和载入文件的速度,但不必要让zend 自动Build项目,他还没有聪明到知道自己该什么时候build才会让主人不觉得卡,所以,取消Build Automatically会让你觉得你的Zend Studio跑的快了点。你可以在添加完项目或者在修改过项目之后,右键点击项目,然后选择Build Project

2、开启智能插入模式
勾选 Edit->Smart Insert Mode

3、快捷键加注释
使用ctrl + / 增加和取消一行的注释
使用ctrl + shift + / 注释一个代码块
使用ctrl + shift + 取消注释一个代码块

4、设置代码格式
Window->Preferences->PHP->Code Style->Formatter

选择Show之后,可以设置类、方法、for语句块、switch语句中的代码是否需要缩进,设置类、方法、语句块中的前半个大括号是直接跟在本行结尾还是换到下一行,还有许多,可以自己查看

选择文件:使用快捷键ctrl + shift + f可以快速将你的php文件格式化为你设置的格式,也可以使用菜单栏的Source -> Format

5、修改配置文件ZendStudio.ini
加大zendstudio的使用内存,也就是讲XXMaxPermSize加大到512m,如果你的内存足够大到4G,那么你这里使用1024都可以,修改完后的配置文件内容如下:

 

-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
-showlocation
-name
Zend Studio
-vmargs
-Xms128M
-Xmx512M
-DGIT_SSL_NO_VERIFY=true
 

6、加快鼠标经过时代码提示速度
选择Window -> Preferences -> PHP -> Editor -> Content Assist ->Auto Activation
将Auto activation delay(in msecs)设置为50,默认值可能是200或者500

7、使用空格代替tab
选择Window -> Preferences -> PHP -> Code Style -> Formatter
一、选择Zend Framework Coventions[build-in],然后在Window -> Preferences -> General -> Editors -> Text Editors中如下设置:

二、如果是自定义的话,点击Edit,在Indentation选项卡中,设置Tab policy为Spaces,然后在Indentation size填写使用的空格数,

8、快速搜索方法和类:
之前我更习惯于在项目文件夹上直接点击右键,然后选择Search进行查找,这样的话ZendStudio会去扫描所有文件,比较耗时。
如果只是需要查找方法的话,可以使用快捷键ctrl + shift + M
根据类名称查找的话使用快捷键ctrl + shift + T
速度真的很快

9、添加新的文件类型:

drupal中的模块后缀名是*.module,我们使用zend打开的时候是纯文本内容,不会有代码高亮的效果,设置方法:
选择:Window -> Preferences -> General -> Content Types
点开右侧的Text,选择php content type,点击Add按钮,在弹出框中输入*.module,最后保存即可

将*.tpl添加到HTML中也是类似操作

111月/130

git查看某个文件的修改历史

发布在 邵珠庆

 

有时候在比对代码时,看到某些改动,但不清楚这个改动的作者和原因,也不知道对应的CR号,也就是说无从查到这些改动的具体原因了~

【注】:某个文件的改动是有限次的,而且每次代码修改的提交都会有commit描述,我们可以从这里进行入手;

一、切换到目录

首先切换到要查看的文件所在的目录:

cd packages/apps/Mms/src/com/android/mms/ui/



二、git log --pretty

然后使用下面的命令可列出文件的所有改动历史,注意,这里着眼于具体的一个文件,而不是git库,如果是库,那改动可多了去了~

git log --pretty=oneline 文件名

如:

复制代码
root@ubuntu:android_src/packages/apps/Mms/src/com/android/mms/ui# git log --pretty=oneline MessageItem.java 
27209385caf678abe878375a470f4edd67a2d806 fix cr 17973 to process force close when empty address contained in card
0e04b16f1dad7dc0a36e2235f7337bc656c365c7 display for 1970-1-1
e4abf3a213197491e0855e101117b59b5dc0160d HREF#13954 receive, store, and display wap push
356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e HREF#16265_uim_show_time_error
350f9d34c35ab50bdb4b2d43fb3ff9780e6c73fa fix href#13617 and href#15149
715e32f97bd9d8ce4b5ba650b97ba4b137150456 Fix ANR from calling Contact.get()
fd8357ff5febab0141e1beb8dd3b26f70416b108 Fix missing From field
d130e2e6dc448fd80ecb70f0d31e3affb9888b9a fix bug 2112925: don't display zip file garbage content in MMS.
0e19f738c114f86d0d88825ee48966015fb48b6d Don't always show sent timestamp
52f854cbb75e8f9975c7e33216b828eb2f981095 Don't show Anonymous as the MMS sender
331864544ec51ba6807fc5471cc6d537b7fef198 add search capability
33a87f96f8c625aa10131a77a3968c97c4ec5a62 Remove all references to ContactInfoCache except those in Contact.
70c73e05a792832aa28da751cdaf3fa83a7b8113 Begin moving all conversation data behind a data model with a cache.
48da875f1beea835c6771977e5bd8a9aa3d4bc10 Begin adding UI unit tests to the Mms app.
66dde9460badebf8e740275cabde9cca256006eb Stop requiring a Context to be passed in to ContactInfoCache.
591d17e9a51bb9f829d6860dc7aa0bad25062cd5 auto import from //branches/cupcake_rel/...@138607
72735c62aba8fd2a9420a0f9f83d22543e3c164f auto import from //depot/cupcake/@135843
892f2c5bf965b1431ae107b602444a93f4aad4a3 auto import from //depot/cupcake/@135843
153ae99e0a7d626a24d61475eeb133249deb448c auto import from //depot/cupcake/@132589
abd7b2d90f7491075f1daba4b4cccdfc82f8ddd1 auto import from //depot/cupcake/@137055
59d72c57ce9c319b6cd43ce2ab36b7076c9e821f auto import from //branches/cupcake/...@132276
44cea74dc55e2459262d0d765ef4a69267dd09b0 auto import from //branches/cupcake/...@131421
0f236f55349f070ac94e12cca963847173393da8 Code drop from //branches/cupcake/...@124589
8eed706474910ccb978acda03e85d3261037da6e Initial Contribution
复制代码

 三、git show



如上所示,打印出来的就是针对文件MessageItem.java的所有的改动历史,每一行最前面的那一长串数字就是每次提交形成的哈希值,接下来使用git show即可显示具体的某次的改动的修改~

git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e

结果如下:

复制代码
root@ubuntu:/android_src/packages/apps/Mms/src/com/android/mms/ui# git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e
commit 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e
Author: 某某某 <某某某的邮箱>
Date:   Thu Jan 6 01:50:31 2011 +0800

    修改的描述(是该代码commit时所填)
    
    Signed-off-by: 某某某 <某某某的邮箱>

diff --git a/src/com/android/mms/ui/MessageItem.java b/src/com/android/mms/ui/MessageItem.java
index 0a0c4b7..55c3b27 100644
--- a/src/com/android/mms/ui/MessageItem.java
+++ b/src/com/android/mms/ui/MessageItem.java
+
+ 列出具体的改动
-
-
复制代码

这样就可以知道是谁做了修改,以及具体的修改代码~

那接下来不管是直接去找他交流还是研究代码,都有依据了~

101月/130

3W Coffee

发布在 邵珠庆

 

3W(互联网、咖啡、红酒、沙龙),互联网的圈子。她是由一群热爱互联网、致力于行业交流、酷爱咖啡和红酒的互联网人士通过微博发起,百名互联网资深人士热烈响应和支持的互联网主题馆。她以为互联网人士提供一个开放、专业、休闲的交流场所和沟通平台为主旨,以展现日新月异的创意产业,提高企业竞争力和影响力,繁荣互联网文化,增进业界交流,促进行业发展为目标。当然,她还是一家让您享受人性化的咖啡和红酒文化及美食的小资聚点。

100名互联网牛人组成的股东,中央美术学院知名教授设计的店面,这些闪闪的阵容也掩藏不住3W Coffee对出品美味有着专业的向往。

无论西式风味,还是中式美味,均有经验大厨掌勺,即使你们只顾着志同道合的互相分享,也会在心底小声的说,味道真不赖。

 

 

 

 

 

 

 

谈微博墙,谈公仔墙,谈键盘墙

以为只有大型活动现场才有微博墙,至少说明你没到过3W Coffee;

以为各互联网公司的公仔很难聚首,至少说明你没到过3W Coffee;

以为废旧的键盘只能当垃圾处理之,至少说明你没到过3W Coffee。

 

谈Social,谈Local,谈Mobile

3W Coffee的Social是,技术男2分钟认识隔壁公司编辑,男的;

3W Coffee的Local是,可能就在你公司附近两步就到;

3W Coffee的Mobile是,服务生拿着iPad菜单走来走去;

当然你们大可谈论更复杂的MoLoSo……

 

谈恋爱,谈前途,谈创投

宁可看“非诚勿扰”,也不来3W Coffee?这里不定期举办圈内相亲会;

宁可研究星座命盘,也不来3W Coffee?这里可遇见圈内各职位人士;

宁可制造电梯偶遇,也不来3W Coffee?这里偶有VC行家坐品咖啡。

 

会员
   下一页