Thursday, November 3, 2011

6 bí quyết thành công của Steve Jobs


1.  Làm điều bạn yêu thích
Theo Steve: “Hãy tìm kiếm nỗi đam mê đích thực của bạn. Hãy làm điều bạn yêu thích và tạo sự khác biệt! Cách duy nhất để đạt đến thành công tột bậc là yêu thích những gì bạn làm”
Hoàn toàn đúng! Làm một công việc bạn không thích thì cũng giống như nồi tròn mà úp vung méo. Mỗi ngày bạn đều cố gắng hết sức mình để làm việc, nhưng không bao giờ thật sự đạt được thành công mà bạn cảm thấy mình đáng được nhận.Mỗi ngày làm việc là một trận chiến – hoặc ít nhất cũng là một chướng ngại cần vượt qua – bởi vì bạn chỉ cố gắng làm việc cho hết ngày để tối được về nhà, chứ không vui thú gì với công việc.
Khi bạn chỉ chú tâm làm việc cho hết ngày, hoặc tốn thời gian vào những dự án hoặc tác vụ không thú vị, bạn làm công việc khó khăn hơn cho chính mình. Khi bạn có sự đam mê, và bạn yêu thích những gì bạn làm, bạn sẽ làm việc với hiệu suất cao hơn, năng nổ và vui vẻ hơn với mọi người. Bối cảnh nào bạn nghĩ sẽ mang đến thành công một cách nhanh chóng và dễ dàng nhất? Câu trả lời thật quá rõ ràng!
Vì thế, nếu bạn muốn thật sự thành công trong cuộc sống, đầu tiên, bạn phải dành thời gian và công sức để nhận ra bạn yêu thích việc gì, và sau đó tìm một chiến lược để đạt được nó. Việc này nghe có vẻ đơn giản, nhưng không phải lúc nào cũng dễ làm. Bạn cần chuẩn bị sẵn sàng để tự tiến hành tìm kiếm và khám phá đam mê thật sự của mình là gì (không phải cái bạn nghĩ đồng nghiệp, gia đình, bạn bè và xã hội trông đợi ở bạn). Việc ba mẹ của bạn muốn bạn trở thành một luật sư hay kế toán viên hàng đầu không đồng nghĩa với việc bạn sẽ tìm thấy thành công và niềm đam mê trong công việc đó.
2. Tầm nhìn xa
Theo Steve, “Bạn không nên lo lắng về quá nhiều việc cùng một lúc. Hãy bắt đầu từ một vài việc đơn giản, sau đó mới chuyển qua những việc phức tạp hơn. Hãy suy tính không chỉ cho ngày mai, mà còn cho tương lai.”
Sự quá tải vì công việc có thể cản bước tiến của bạn trên con đường công danh sự nghiệp. Đây là một bệnh dịch ác hiểm, có thể “đè bẹp” nhiều người trên hành trình đến thành công. Vì thế, bạn phải luôn giữ được sự tập trung. Sự quá tải vì công việc “lẳng lặng” đến khi chúng ta quên mất mục tiêu chính của mình và để nhiều việc khác tràn ngập trí não của chúng ta. Một khoảnh khắc bạn tập trung vào một việc tối quan trọng, có thể giúp bạn nhanh chóng đạt đến thành công. Tuy nhiên, ở phút kế tiếp, bạn lại mãi nghĩ về cả trăm việc khác bạn cần làm, và thế là sự quá tải đến!
3.  Hãy nêu cao tinh thần doanh nhân
Steve nói “Hãy tìm kiếm ý tưởng lớn kế tiếp. Tìm ra những ý tưởng cần được hiện thực hóa một cách nhanh chóng và quyết đoán rồi “nhảy” vào thực hiện nó. Đôi khi bước đầu tiên chính là bước khó khăn nhất. Hãy đi bước đầu tiên này! Hãy mạnh dạn theo đuổi tình cảm và trực giác của bạn.”
Không ít lần tôi tình cờ gặp những người thông minh và khôn ngoan đến tuyệt vời. Họ có những ý tưởng rất hay hoặc khả năng kinh doanh, nhưng họ không sẵn sàng để thực hiện “cú nhảy” mà Steve đề cập. Vấn đề ở đây là họ biết họ muốn cái gì, nhưng lại chưa tìm ra cách để có được chúng. Vì thế, họ dừng lại và không tiến thêm nữa.
Mặc dù có một kế hoạch hay chiến lược để hiện thực hóa ý tưởng là rất quan trọng, không nên để việc quá chú trọng vào “LÀM CÁCH NÀO đạt những mục tiêu” khiến công việc của bạn bị đình trệ. Đôi lúc bạn không thể nào biết được tất cả các câu trả lời. Không sao cả, cứ tiếp tục công việc, từng bước một. Cuối cùng, tất cả những chi tiết bạn cần biết sẽ lộ ra. Còn nếu không làm gì cả, bạn sẽ chẳng tiến được đến đâu
Ca sĩ/tay guitar nổi tiếng Jim Rowland đã từng nói “Sự kỷ luật chỉ nặng một ounce còn sự hối tiếc nặng đến một tấn” (1 tấn = 32 000 ounce). Hãy duy  trì tính kỷ luật và lòng dũng cảm để tiến về phía trước theo từng bước nhỏ, và bạn sẽ không bao giờ phải hối tiếc về những tiến bộ bạn đã đạt được.
4. Hãy tạo sự khác biệt 
Theo Steve “Hãy tạo sự khác biệt. Hãy suy nghĩ khác mọi người. Chẳng thà làm một tên cướp biển còn hơn là gia nhập đội ngũ hải quân”
Tôi thích câu này của Steve vì cả từ “hải quân” và “cướp biển” đều gợi nhớ cho tôi nhiều điều! Tôi đã làm việc 14 năm trong môi trường công ty (chưa kể một khoảng thời gian ở trong quân dự bị) nhưng tôi đã vứt bỏ những điều đó để thành lập công ty Outshine Consulting and The Success Rules. Hiện tại không có sự lựa chọn nào tốt hơn cái nào, nhưng tôi nghĩ điểm mấu chốt cần suy nghĩ ở đây là bạn muốn nắm giữ vị trí gì trong cuộc sống.
Nếu chúng ta sống trong một thế giới liên tục thay đổi, chúng ta sẽ cảm thấy mọi thứ đều hỗn loạn.   
Tuy nhiên, để trở thành một doanh nhân thành công như Steve Jobs, điều tối quan trọng là bạn phải liên tục tìm cách thay đổi hiện trạng (status quo), tìm kiếm những ý tưởng mới, có đầu óc cách tân và sáng tạo. Việc làm theo những gì có sẵn nhiều khả năng sẽ tạo ra những kết quả cũ hơn là những cái hiện đại và mới mẻ.
Bạn muốn có sự thách thức và thay đổi, hay bạn thích sự ổn định? Hãy thành thật với chính bản thân bởi vì không phải ai cũng có thể làm lính hải quân, và không phải ai cũng có thể làm hải tặc giỏi!
5. Nỗ lực hết mình
Theo Steve “ Hãy nỗ lực hết mình khi làm bất cứ việc gì. Thành công sẽ tạo ra thành công. Vì thế hãy khát khao thành công"
Nếu bạn “mắc kẹt” trong việc suy nghĩ xem làm cách nào để thành công, hoặc chờ đợi thành công đến với mình, bạn sẽ dậm chân tại chỗ. Thành thật mà nói, đứng yên tại chỗ cho thấy bạn không thật sự khát khao thành công.
Bạn cần tiếp tục công việc, và phải năng động vì mỗi một thành công bạn có – dù nhỏ đến đâu - sẽ giúp tạo ra nhiều và nhiều thành công về sau. Khi động lượng tăng lên thì mức độ thành công của bạn cũng tăng theo. Đến lượt mình, nó lại tạo ra thêm nhiều động lượng và động lực làm việc. Trong điều kiện lý tưởng nhất, đó chính là hiệu ứng quả cầu tuyết (Khi một quả cầu tuyết lăn xuống dốc, nó tích lũy thêm nhiều tuyết bám trên bề mặt nên ngày một lớn hơn) Tuy nhiên, bạn vẫn cần có lòng khao khát để đạt được mục tiêu và sẵn lòng hành động để trải nghiệm nó
6. Không ngừng học hỏi
Theo Steve “Lúc nào cũng có một cái gì đó mới mẻ để bạn học! Trao đổi ý kiến, học hỏi từ khách hàng, đối thủ cạnh tranh và đối tác. Nếu bạn làm việc với một người bạn không thích, hãy học cách thích họ. Hãy khen ngợi họ và thu được lợi ích gì đó từ họ.”
Nếu năng lực của bạn không gia tăng, bạn sẽ chết dần. Đây có thể là một câu khó nuốt, nhưng đó là sự thật. Nếu không phát triển, học hỏi và trưởng thành, bạn sẽ trở nên ốm yếu và chết dần. Bạn muốn mình rơi vào trường hợp nào?
Steve Jobs rõ ràng có được sự cân bằng. Ông không đạt được thành công như ngày hôm nay bằng cách nghỉ ngơi và tận dụng những tri thức sẵn có. Ông liên tục sáng tạo và đổi mới. Điều này chỉ có thể đạt được từ việc không ngừng học hỏi.
Thông qua việc xây dựng một mạng lưới quan hệ xã hội hữu hiệu, bạn có thể học được nhiều điều từ những người thông thái. Họ có thể thách đố tư duy của bạn và giúp bạn phát triển ý tưởng và chiến lược mới để đạt được thành công. Học tập cũng giống như tiêu tiền. Bạn có thể mở mang kiến thức mỗi ngày bằng cách nhận thức ưu điểm của những người xung quanh bạn, hoặc đọc sách thay vì ngồi trước màn hình. Sự lựa chọn là của bạn.
(Theo Ezinearticles.com)

Monday, October 24, 2011

Năm phút với Scrum

Scrum là gì?

Scrum là một trong các khung làm việc linh hoạt (agile framework) phổ biến nhất hiện nay. Ban đầu, Scrum được dùng để quản lý các dự án phát triển phần mềm, nhưng nó có thể được dùng trong các công việc khác với sự phức tạp, và đòi hỏi tính sáng tạo rất đa dạng.

Dựa trên lý thuyết quản lý thực nghiệm (empirical process control), Scrum sử dụng cơ chế lặp (iterative) và tăng dần (incremental) để tối ưu hóa sự hiệu quả và kiểm soát rủi ro. Scrum rất đơn giản, dễ học và có khả năng ứng dụng rất to lớn. Để có thể dùng Scrum, chúng ta cần tiếp cận các thành tố tạo nên Scrum bao gồm ba giá trị cốt lõi (còn gọi là ba chân), ba vai trò, bốn cuộc họp, và ba công cụ (artifacts).

Scrum framework có gì?

Ba chân (hay giá trị cốt lõi) của Scrum

Scrum là một phương pháp linh hoạt (agile), vì thế nó tuân thủ các nguyên tắc của Agile Manifesto (Tuyên ngôn Agile). Ngoài ra Scrum hoạt động dựa trên ba giá trị cốt lõi, còn gọi là Ba chân của Scrum bao gồm Minh bạch, Thanh tra và Thích nghi.

Minh bạch (transparency)

Trong Scrum, tính minh bạch được đề cao như là giá trị cốt lõi cơ bản nhất. Muốn thành công với Scrum, thông tin phải minh bạch và thông suốt. Từ đó mọi người ở các vai trò các nhau có đủ thông tin cần thiết để tiến hành các quyết định có giá trị để nâng cao hiệu quả công việc. Các công cụ và cuộc họp trong Scrum luôn đảm bảo thông tin được minh bạch cho các bên.

Thanh tra (inspection)

Công tác thanh tra liên tục các hoạt động trong Scrum đảm bảo cho việc phát lộ các vấn đề cũng như giải pháp để thông tin đa dạng và hữu ích đến được với các bên tham gia dự án. Truy xét kĩ càng và liên tục là cơ chế khởi đầu cho việc thích nghi và các cải tiến liên tục trong Scrum.

Thích nghi (adaptation)

Scrum rất linh hoạt như các phương pháp phát triển linh hoạt (agile software development) khác. Nhờ đó nó mang lại tính thích nghi rất cao. Scrum có thể phản hồi lại các thay đổi một cách tích cực, nhờ đó mang lại thành công cho dự án.

Ba vai trò

Trong Scrum, người tham gia phát triển phần mềm được phân chia ra ba vai trò với trách nhiệm rõ ràng để đảm bảo tối ưu hóa các công việc đặc thù. Ba vai trò này bao gồm: Product Owner, Scrum Master và Team (Đội sản xuất hay Nhóm Phát triển).

Product Owner (chủ sản phẩm)

Là người chịu trách nhiệm về sự thành công của dự án, người định nghĩa các yêu cầu và đánh giá cuối cùng đầu ra của các nhà phát triển phần mềm.

Scrum Master

Là người có hiểu biết sâu sắc về Scrum và đảm bảo nhóm có thể làm việc hiệu quả với Scrum.

Team (Đội sản xuất, hay Nhóm phát triển)

Một nhóm liên chức năng (cross-functional) tự quản lý để tiến hành chuyển đổi Product Backlog item thành chức năng của hệ thống.

Bốn Cuộc họp (Four ceremonies)

Scrum định nghĩa quy tắc cho bốn lễ nghi (các cuộc họp) nhằm tạo môi trường và quy cách hoạt động và cộng tác cho các thành viên trong dự án. Các lễ nghi này diễn ra trước khi Sprint bắt đầu (Sprint Planning), trong khi Sprint diễn ra (Daily Scrum) và sau khi Sprint kết thúc (Sprint Review và Sprint Retrospective).

Sprint Planning (Họp Kế hoạch Sprint)

Nhóm phát triển gặp gỡ với Product Owner để lên kế hoạch làm việc cho một Sprint (xem thêm phần Sprint bên dưới). Công việc lập kế hoạch bao gồm việc chọn lựa các yêu cầu cần phải phát triển, phân tích và nhận biết các công việc phải làm kèm theo các ước lượng thời gian cần thiết để hoàn tất các tác vụ. Scrum sử dụng cách thức lập kế hoạch từng phần và tăng dần theo thời gian, theo đó, việc lập kế hoạch không diễn ra duy nhất một lần trong vòng đời của dự án mà được lặp đi lặp lại, có sự thích nghi với các tình hình thực tiễn trong tiến trình đi đến sản phẩm.

Daily Scrum (Họp Scrum hằng ngày)

Scrum Master tổ chức cho Đội sản xuất họp hằng ngày để Nhóm chia sẻ tiến độ công việc cũng như chia sẻ các khó khăn gặp phải trong quá trình phát triển phần mềm suốt một Sprint.

Sprint Review (Họp Sơ kết Sprint)

Cuối Sprint, nhóm phát triển cùng với Product Owner sẽ rà soát lại các công việc đã hoàn tất (DONE) trong Sprint vừa qua và đề xuất các chỉnh sửa hoặc thay đổi cần thiết cho sản phẩm.

Sprint Retrospective (Họp Cải tiến Sprint)

Dưới sự trợ giúp của Scrum Master, nhóm phát triển sẽ rà soát lại toàn diện Sprint vừa kết thúc và tìm cách cải tiến quy trình làm việc cũng như bản thân sản phẩm.

Ba công cụ (artifacts)

Scrum sử dụng các công cụ rất đơn giản nhưng hiệu quả để trợ giúp công việc. Chúng bao gồm bản yêu cầu của chủ sản phẩm được gọi là Product backlog, bản kế hoạch của từng Sprint (Sprint Backlog) và biểu đồ Burndown Chart.

Product backlog

Đây là danh sách ưu tiên các tính năng (feature) hoặc đầu ra khác của dự án, có thể hiểu như là danh sách yêu cầu (requirement) của dự án. Product Owner chịu trách nhiệm sắp xếp độ ưu tiên cho từng hạng mục (Product Backlog Item) trong Product Backlog dựa trên các giá trị do Product Owner định nghĩa (thường là giá trị thương mại – business value).

Sprint backlog

Đây là bản kế hoạch cho một Sprint; là kết quả của buổi họp lập kế hoạch (Sprint Planning). Với sự kết hợp của Product Owner, nhóm sẽ phân tích các yêu cầu theo độ ưu tiên từ cao xuống thấp để hiện thực hóa các hạng mục trong Product Backlog dưới dạng danh sách công việc (TODO list).

Burndown Chart

Đây là biểu đồ hiển thị xu hướng của dự án dựa trên lượng thời gian cần thiết còn lại để hoàn tất công việc. Burndown Chart có thể được dùng để theo dõi tiến độ của Sprint (được gọi là Sprint Burndown Chart) hoặc của cả dự án (Project Burndown Chart).

Scrum vận hành như thế nào?

Product Owner tạo ra Product Backlog chứa các yêu cầu của dự án với các hạng mục được sắp theo thứ tự ưu tiên. Đội sản xuất sẽ thực hiện việc hiện thực hóa dần các yêu cầu của Product Owner với sự lặp đi lặp lại các giai đoạn nước rút từ 2 đến 4 tuần làm việc (gọi là Sprint) với đầu vào là các hạng mục trong Product Backlog, đầu ra là các gói phần mềm hoàn chỉnh có thể chuyển giao được (Potentially Shippable Product Increment). Trước khi cả nhóm cùng đua nước rút trong Sprint, đội sản xuất cùng họp với Product Owner để lên kế hoạch cho từng Sprint. Kết quả của buổi lập kế hoạch (theo cách làm của Scrum) là Sprint Backlog. Trong suốt quá trình phát triển, nhóm sẽ phải cập nhật Sprint Backlog và thực hiện công việc họp hằng ngày (Daily Scrum) để chia sẻ tiến độ công việc cũng như các vướng mắc trong quá trình làm việc cùng nhau. Khi kết thúc Sprint, nhóm tạo ra các gói phần mềm có chức năng hoàn chỉnh, sẵn sàng chuyển giao (shippable) cho khác hàng. Buổi họp Sơ kết Sprint (Sprint Review) ở cuối Sprint sẽ giúp khách hàng thấy được nhóm đã có thể chuyển giao những gì, còn những gì phải làm hoặc còn gì phải thay đổi hay cải tiến. Sau khi kết thúc việc đánh giá Sprint, Scrum Master và nhóm cùng tổ chức họp Cải tiến Sprint (Sprint Retrospective) để tìm kiếm các cải tiến trước khi Sprint tiếp theo bắt đầu.

Các Sprint sẽ được lặp đi lặp lại cho tới khi nào các hạng mục trong Product Backlog đều được hoàn tất hoặc khi Product Owner quyết định có thể dừng dự án căn cứ tình hình thực tế. Do sử dụng chiến thuật “quan trọng làm trước” nên các hạng mục mang lại nhiều giá trị hơn cho chủ dự án luôn được hoàn tất trước. Do đó Scrum luôn mang lại giá trị tốt nhất cho người đầu tư cho dự án. Do quy trình luôn luôn được cải tiến, nhóm Scrum thường có năng suất lao động rất cao. Đây là hai lợi ích to lớn mà Scrum mang lại cho tổ chức.


http://hanoiscrum.net

Wednesday, October 12, 2011

Cách chia subneting , subnet mask

Subnet MasksKhi ta chia một Network ra thành nhiều Network nhỏ hơn, các Network nhỏ nầy được gọI là Subnet. Theo quy ước, các địa chỉ IP được chia ra làm ba Class (lớp) như sau:

Address Class Subnet mask trong dạng nhị phân Subnet mask
Class A11111111 00000000 00000000 00000000255.0.0.0
Class B11111111 11111111 00000000 00000000255.255.0.0
Class C11111111 11111111 11111111 00000000255.255.255.0


Subnet Mask của Class A bằng 255.0.0.0 có nghĩa rằng ta dùng 8 bits, tính từ trái qua phải (các bits được set thành 1), của địa chỉ IP để phân biệt các NetworkID của Class A. Trong khi đó, các bits còn sót lại (trong trường hợp Class A là 24 bits đuợc reset thành 0) được dùng để biểu diễn computers, gọi là HostID. Nếu bạn chưa quen cách dùng số nhị phân hãy đọc qua bài Hệ thống số nhị phân.

Subnetting
Hãy xét đến một địa chỉ IP class B, 139.12.0.0, với subnet mask là 255.255.0.0 (có thể viết là: 139.12.0.0/16, ở đây số 16 có nghĩa là 16 bits được dùng cho NetworkID). Một Network với địa chỉ thế nầy có thể chứa 65,534 nodes hay computers (65,534 = (2^16) –2 ) . Đây là một con số quá lớn, trên mạng sẽ có đầy broadcast traffic.

Giả sử chúng ta chia cái Network này ra làm 4 Subnet. Công việc sẽ bao gồm ba bước:

1) Xác định cái Subnet mask
2) Liệt kê ID của các Subnet mới
3) Cho biết IP address range của các HostID trong mỗi Subnet

Bước 1: Xác định cái Subnet mask
Để đếm cho đến 4 trong hệ thống nhị phân (cho 4 Subnet) ta cần 2 bits. Công thức tổng quát là:

Y = 2^X

mà Y = con số Subnets (= 4)
X = số bits cần thêm (= 2)

Do đó cái Subnet mask sẽ cần 16 (bits trước đây) +2 (bits mới) = 18 bits

Địa chỉ IP mới sẽ là 139.12.0.0/18 (để ý con số 18 thay vì 16 như trước đây). Con số hosts tối đa có trong mỗi Subnet sẽ là: ((2^14) –2) = 16,382. Và tổng số các hosts trong 4 Subnets là: 16382 * 4 = 65,528 hosts.

Bước 2: Liệt kê ID của các Subnet mới
Trong địa chỉ IP mới (139.12.0.0/18) con số 18 nói đến việc ta dùng 18 bits, đếm từ bên trái, của 32 bit IP address để biểu diễn địa chỉ IP của một Subnet.

Subnet mask trong dạng nhị phân Subnet mask
11111111 11111111 11000000 00000000255.255.192.0

Như thế NetworkID của bốn Subnets mới có là:

Subnet Subnet ID trong dạng nhị phân Subnet ID
110001011.00001100.00000000.00000000139.12.0.0/18
210001011.00001100.01000000.00000000139.12.64.0/18
310001011.00001100.10000000.00000000139.12.128.0/18
410001011.00001100.11000000.00000000139.12.192.0/18

Bước 3: Cho biết IP address range của các HostID trong mỗi Subnet
Vì Subnet ID đã dùng hết 18 bits nên số bits còn lại (32-18= 14) được dùng cho HostID.
Nhớ cái luật dùng cho Host ID là tất cả mọi bits không thể đều là 0 hay 1.

Subnet HostID IP address trong dạng nhị phân HostID IP address Range
110001011.00001100.00000000.00000001 10001011.00001100.00111111.11111110139.12.0.1/18 -139.12.63.254/18
210001011.00001100.01000000.00000001 10001011.00001100.01111111.11111110139.12.64.1/18 -139.12.127.254/18
310001011.00001100.10000000.00000001 10001011.00001100.10111111.11111110139.12.128.1/18 -139.12.191.254/18
410001011.00001100.11000000.00000001 10001011.00001100.11111111.11111110139.12.192.0/18 –139.12.255.254


Bạn có để ý thấy trong mỗi Subnet, cái range của HostID từ con số nhỏ nhất (màu xanh) đến con số lớn nhất (màu cam) đều y hệt nhau không?

Bây giờ ta thử đặt cho mình một bài tập với câu hỏi:

Bạn có thể dùng Class B IP address cho một mạng gồm 4000 computers được không? Câu trả lời là ĐƯỢC. Chỉ cần làm một bài toán nhỏ.

Giả tỉ cái IP address là 192.168.1.1. Thay vì bắt đầu với Subnet mask, trước hết chúng ta tính xem mình cần bao nhiêu bits cho 4000 hosts.

Con số hosts ta có thể có trong một network được tính bằng công thức:

Y = (2^X –2)

Nhớ cái luật dùng cho Host ID là tất cả mọi bits không thể đều là 0 hay 1.

4094 = (2^12 –2)
X = 12 , ta cần 12 bits cho HostIDs, do đó Subnet mask sẽ chiếm 20 (=32-12) bits.

Quá trình tính toán nói trên nầy mang tên là Variable Length Subnet Mask(VLSM).

Supernetting
Giả sử ta mạng của ta có 3 Subnets:

Accounting: gồm 200 hosts
Finance : gồm 400 hosts
Marketing: gồm 200 hosts

Bạn hòa mạng với Internet và được Internet Service Provider (ISP) cho 4 Class C IP addresses như sau:
192.250.9.0/24
192.250.10.0/24
192.250.11.0/24
192.250.12.0/24

Bạn có 3 segments và bạn muốn mỗi segment chứa một Network.
Bây giờ bạn làm sao?

Địa chỉ IP trong Class C với default subnet mask 24 cho ta con số Hosts tối đa trong mỗi Network là [(2^X) – 2] = (2^8) – 2 = 254. Như thế segments Accounting và Marketing không bị trở ngại nào cả.

Nhưng ta thấy Segment Finance cần thêm 1 bit mới đủ. Ta làm như sau:

Bước 1: Liệt kê Network IP addresses trong dạng nhị phân
192.250.9.0/24 11000000 11111010 00001001 00000000 (1)
192.250.10.0/24 11000000 11111010 00001010 00000000 (2)
192.250.11.0/24 11000000 11111010 00001011 00000000 (3)
192.250.12.0/24 11000000 11111010 00001100 00000000 (4)

Bước 2: Nhận diện network prefix notation
23 bits đầu (từ trái qua phải) của 2 network IP address (2) and (3) đều giống nhau.

Nếu chúng ta thu Subnet mask từ 24 xuống 23 cho (2) và (3) ta sẽ có một Subnet có thể cung cấp 508 hosts.

IP address của mỗi segment trở thành:

Accounting: gồm 200 hosts: 192.250.9.0/24
Finance: gồm 400 hosts: 192.250.10.0/23
Marketing: gồm 200 hosts: 192.250.12.0/24

Bây giờ IP address 192.250.11.0 trở thành một HostID tầm thường trong Subnet 192.250.10.0/23.

Quá trình ta làm vừa qua bằng cách bớt số bits trong Subnet mask khi gom hai hay bốn (v.v..) subnets lại với nhau để tăng con số HostID tối đa trong một Subnet, được gọi là SUPERNETTING.

Supernetting đuợc dùng trong router bổ xung CIDR (Classless Interdomain Routing và VLSM (Variable Length Subnet Mask).

Và luôn luôn nhớ rằng trong internetwork, NETWORK ID phải là địa chỉ duy nhất (unique)

Friday, October 7, 2011

How To Install PHP on IIS 6.0

Configuring IIS to process PHP requests

Download and install PHP in accordance to the instructions described in manual installation steps

Note:

Non-thread-safe build of PHP is recommended when using IIS. The non-thread-safe builds are available at » PHP for Windows: Binaries and Sources Releases.

Configure the CGI- and FastCGI-specific settings in php.ini file as shown below:

Example #1 CGI and FastCGI settings in php.ini

fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0

Download and install the » Microsoft FastCGI Extension for IIS 5.1 and 6.0. The extension is available for 32-bit and 64-bit platforms - select the right download package for your platform.

Configure the FastCGI extension to handle PHP-specific requests by running the command shown below. Replace the value of the "-path" parameter with the absolute file path to the php-cgi.exe file.

Example #2 Configuring FastCGI extension to handle PHP requests

cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe" 

This command will create an IIS script mapping for *.php file extension, which will result in all URLs that end with .php being handled by FastCGI extension. Also, it will configure FastCGI extension to use the executable php-cgi.exe to process the PHP requests.

Check in the C:\WINDOWS\system32\inetsrv\fcgiext.ini file the next text is present or paste into it:

[Types]
php=c:\php\php-cgi.exe

[c:\php\php-cgi.exe]
QueueLength=999
MaxInstances=20
InstanceMaxRequests=10000
IdleTimeout=90
RequestTimeout=90

To create a script map for the FastCGI handler on IIS 6.0 and IIS 5.1:
  1. Open IIS Manager.
  2. Double-click the machine icon for the local computer.
  3. Right-click Web Sites and then click Properties.
  4. Click the Home Directory tab.
  5. Click the Configuration… button.
  6. Click the Add… button.
  7. Browse to %WINDIR%\system32\inetsrv\ and select fcgiext.dll as the executable file.
    Note: If you are using a 64-bit platform in WOW mode, you must use the fcgiext.dll file that is located in the %WINDIR%\SysWOW64\inetsrv path.
  8. In the Extension text box, enter .php (or another extension that is specific to your FastCGI application).
  9. Under Verbs, in the Limit to text box, enter GET,HEAD,POST.
  10. Select the Script engine and Verify that file exists check boxes.
  11. Click OK.

Set index.php as a default document in IIS

The IIS default documents are used for HTTP requests that do not specify a document name. With PHP applications, index.php usually acts as a default document. To add index.php to the list of IIS default documents, follow these steps:

  1. In the Windows Start Menu choose "Run:", type "inetmgr" and click "Ok";

  2. Right-click on the "Web Sites" node in the tree view and select "Properties";

  3. Click the "Documents" tab;

  4. Click the "Add..." button and enter "index.php" for the "Default content page:"


    Reference:

    http://learn.iis.net

    php.net

How to switch between Activities

In my great expectations of Google Android coming to Canada on June 2nd, I’ve started experimenting with developing some apps for the Android platform. My first app is called “The Taxman” and will calculate the amount of tax you owe per year in your province/state – well only Canada for now.


I had trouble adjusting to what an “Activity” was and how to handle it. Here is a quick and dirty way to create an Activity, and to switch to another Activity (think of it as another screen) on the click of a button.


1. Create a new Android project – or you might already have one created.


01 new project


2. Add a new Class that extends android.app.Activity. You need a total of two classes that extend Activity. You will switch from one Activity to another.


02 new class


03 new class 2



3. Now, we’ll create two XML files to store the layout of each Activity. Under the res/layouts directory create a copy of main.xml


04 xml files


4. Each XML file will contain 1 button. On the click of the button, the Activities will switch.


main.xml will contain:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="#ffffff" >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textColor="#000000"
android:text="This is Activity 1" />

<Button android:text="Next" android:id="@+id/Button01"
android:layout_width="250px" android:textSize="18px"
android:layout_height="55px">

</Button>
</LinearLayout>

main2.xml will contain:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="#ffffff" >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textColor="#000000"
android:text="This is Activity 2" />

<Button android:text="Previous" android:id="@+id/Button02"
android:layout_width="250px" android:textSize="18px"
android:layout_height="55px">
</Button>
</LinearLayout>

So each Activity will have a text that says “This is Activity x” and a button to switch the Activity.


5. Add the second Activity to the main manifest file. Open AndroidManifest.xml and add:


        <activity android:name=".Activity2"></activity>

The final result will look similar to this:


<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.warriorpoint.taxman2"
android:versionCode="1"
android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Activity1" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activity2">
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>

If you forget to do this, then the you will get a Null Pointer exception because “Activity2” will not be found at runtime. It took me some time to find out how to find what Exception was getting thrown as well. I will include how to debug and look at Exceptions in another future post.


5. Open Activity1.java and enter the following code:


package com.warriorpoint.taxman2; 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Activity1 extends Activity {
/** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button next = (Button) findViewById(R.id.Button01);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent myIntent = new Intent(view.getContext(), Activity2.class);
startActivityForResult(myIntent, 0);
}
});
}
}

Here’s a quick explanation of what this does:


- setContentView(R.layout.main) makes sure that main.xml is used as the layout for this Activity.


- Gets a reference to the button with ID Button01 on the layout using (Button) findViewById(R.id.Button01).


- Create san OnClick listener for the button – a quick and dirty way.


- And the most important part, creates an “Intent” to start another Activity. The intent needs two parameters: a context and the name of the Activity that we want to start (Activity2.class)


- Finally, the Activity is started with a code of “0”. The “0” is your own code for whatever you want it to mean. Activity2 will get a chance to read this code and use it. startActivityForResult means that Activity1 can expect info back from Activity2. The result from Activity2 will be gathered in a separate method which I will not include here.


6. Open Activity2.java and enter the code below:


package com.warriorpoint.taxman2; 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Activity2 extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
Button next = (Button) findViewById(R.id.Button02);

next.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
});
}

This code does the following:


- Sets main2 as the layout for this Activity


- Gets a reference to Button02 and creates an OnClick listener


- In the OnClick listener, the Activity finishes with finish(). setResult() returns information back to Activity 1. In this example, it returns no information; and Activity1 doesn’t even have the listener to receive this information anyway.


That’s it! Run it!


05 run


The app will load in Activity 1:


06 activity 1


When you click the button you will see Activity 2. There are no animations, no tweens, etc, so the screen will just “change”. I’ll talk about animations in future posts.


07 activity 2


And clicking on the button “Previous” here will go back to Activity1.


Still to come:


1. How to create animations when switching screens.


2. How to switch using a dragging motion of your finger.


3. How to see a log of the exceptions that your app throws

http://www.warriorpoint.com