Welcome to rocktonam

Sunday, January 15, 2006

Symbian FAQ, v2.0

Symbian is a joint venture between Nokia, Motorola, Ericsson, Matsushita, and Psion, with Nokia as one of the founding members. Symbian was established by leaders in the computing and mobile industries to enable the mass market of communicators and smart phones. Symbian owns and develops the Symbian operating system that is optimized for mobile terminals, such as communicators and smart phones.

What does Symbian OS enable?

  • Small, feature-rich, mobile devices for a mass market
  • Diversity of devices for consumers
  • Faster time-to-market for platform vendors
  • Open, standards-based platform for third-party application developers
  • Excellent connectivity
  • Advanced design
  • Extensibility
  • High-performance, 32-bit OS with pre-emptive multitasking
  • Long battery life
  • Wide industry support and commitment
  • Applications that can be designed once and run on multiple devices
  • Nokia Series 60 and communicator platforms are based on Symbian OS

Why choose Symbian OS as a development platform?

Because Symbian OS is written in C++, it is a fully object-oriented operating system. This contributes to its flexibility, efficiency,and ability to re-use segments of the code.

Clearly defined APIs allow the large developer community, including terminal vendors, to create applications that can be easily downloaded, installed, and run natively on the terminal Symbian OS.

Symbian C++ APIs enable extremely efficient multitasking and memory management. Processor-and memory-intensive operations such as context switching are minimized.

Symbian OS is primarily event driven rather than multithreaded, potentially saving several kilobytes of overhead per thread. The event-driven Symbian OS doesn't need any context switching and can have an overhead as low as a few tens of bytes.

How reliable is Symbian OS?

Symbian OS was developed so that user data would never be lost and the device running the OS would never need to be rebooted. Symbian OS provides all the tools necessary for developers to deliver on this vision, including:

  • Preventing memory leaks with effective memory management;
  • Releasing resources as soon as they are no longer needed;
  • Handling out-of-memory errors properly through an effective error-handling framework.


What capabilities does Symbian OS provide?

There is no single Symbian OS. Instead, variations of the Symbian OS are tailored for different device categories. The capabilities of the Symbian OS depend on the device category for which it was tailored. Each variation is called a Device Family Reference Design, or DFRD.

What are DFRDs?

Device Family Reference Designs (DFRDs) are variations of Symbian OS tailored for different types of mobile information devices. Each DFRD specifies a set of features, including user interface and hardware configuration. There are three DFRDs - Crystal, Pearl, and Quartz.

What is Crystal?

Crystal is a DFRD tailored for feature-rich, Communicator-type devices. Hardware platforms are phones with a full (typically qwerty) keyboard and a relatively large, landscape-oriented (horizontal) display. Crystal devices are designed for business users who need a lot of information. The Nokia 9210 Communicator and Nokia 9290 Communicator belong to the Crystal product family.

What is Pearl?

Pearl is a DFRD for a Symbian smart phone. Hardware platforms typically look like standard cell phones ? with small displays and limited keyboards.

What is Quartz?

Quartz is a DFRD for a pen-based phone similar to the Palm PDAs. Hardware platforms do not include keyboards, and the relatively large displays are portrait-oriented (vertical). Quartz devices are designed for consumer users and are geared toward information gathering.

What is GT?

Generic Technology (GT) is the set of core technologies common to all the DFRDs. The telephony components, for example, are part of the generic technology and are therefore available in all DFRDs.

What is an SDK?

A Software Development Kit (SDK) is supplied to third-party software developers and used by them to create applications. Symbian and Nokia both offer SDKs for Symbian OS. The Nokia SDKs are optimized for Nokia devices such as the Nokia 9200 Communicator Series.


What Symbian platform products does Nokia offer?

The Nokia 9210 Communicator, Nokia 9290 Communicator, and Nokia 7650 all incorporate the Symbian OS. The Communicators offer Nokia implementations of the Crystal DFRD, while the Nokia 7650 uses the Pearl DFRD.

What SDKs does Nokia offer?

Symbian SDKs from Nokia are tailored to the DFRD they support.

The Nokia 9200 Communicator Series SDK for Symbian OS supports the Crystal-based Nokia 9210 Communicator and Nokia 9290 Communicator.

The Nokia Series 60 SDK for Symbian OS supports the Pearl-based Nokia 7650.

How much do these SDKs cost?

Symbian SDKs from Nokia may be obtained free of charge from Forum Nokia at www.forum.nokia.com.

How does one get started with Symbian OS?

To start on the road to Symbian development, developers should choose the DFRD that best supports the hardware platform suitable for the application they have in mind; then obtain the appropriate SDK from Forum Nokia at www.forum.nokia.com.

The next step is for them to choose the best technology for the application. They may develop applications in their choice of C++ or Java, or may find that the application is best supported by a browser-based implementation. For more information about choosing a development technology, developers should read the white paper Choosing the Best Technology for Series 60 Applications available at Forum Nokia.

JASS, bảo mật Web Component

Web application phải được phát triển với sự bảo mật ngay từ khi bắt đầu. Các developer nên lập kế hoạch bảo mật một web application với cả web server và application server. Việc bảo mật một J2EE application có thể trông rất phức tạp, tuy nhiên trong article này, phần đầu tiên sẽ giải thích làm thế nào để bảo mật các web component của J2EE.
1.“Phòng bệnh tốt hơn chữa bệnh”
Câu ngạn ngữ cổ xưa này vẫn đúng thậm chí cho đến ngày hôm nay, đặc biệt trong trường hợp các web application. Deface site chỉ là một cách tấn công website. Nó không phải là điềm báo trước nếu như bảo mật một application cần được quan tâm đầu tiên sau một cuộc tấn công. Các application phải được phát triển với khả năng bảo mật của chúng được định ra ở mức độ cao.

Cho đến một vài năm trước đây, bảo mật có nghĩa là bảo mật web server. Nhưng với sự trông đợi của lập trình server-side, bảo mật không thể là giới hạn tài nguyên bên trong web server, mà hầu hết yêu cầu xử lý và dịch vụ được thực hiện bằng việc thực thi mã bên trong application server. Trong trường hợp của J2EE, bảo mật một web application có thể phức tạp: một J2EE application có thể chứa một hay nhiều hơn các component khác nhau, mỗi component cung cấp dịch vụ cho một layer khác nhau. Thế giải pháp là gì? Giải pháp đến từ hai package khác nhau:
  • Declareative security : nếu một application tuân theo cách này, thì tất cả những xác lập bảo mật nằm trong file web.xml của application. Container đọc những xác lập này và thực thi truy cập điều khiển cho application cụ thể
  • Programmatic security : Dưới mô hình này, trách nhiệm bảo mật web application thuộc về duy nhất lập trình viên. Lô gic ủy quyền và phân chia quyền hạn user được nhúng vào trong application. Nó có thể tồn tại một dịch vụ toàn bộ application hoặc trong mỗi module.


Bảo mật dựa trên Realm có trước, trong khi bảo mật dựa trên Java Authentication and Authorization Services (JASS) đến sau.Câu hỏi rõ ràng kế tiếp đặt ra là cái nào tốt hơn? Câu trả lời , thường lặp lại, đó là ngữ cảnh xác định việc xử dụng. Nếu việc bảo mật mã ít hơn thì declarative security là tốt hơn. Nếu điều khiển từng phần được yêu cầu thì programmatic security là sự lựa chọn tốt nhất.

Quay về ngữ cảnh J2EE component, chúng được chia thành Web Components và Business Components. Các Servlet và JSP là những Web Component trái lại Enterprise Java Beans (EJB) là những Business Component. Phương thức bảo mật các Web Component khác với cách bảo mật các Business Component. Trong tutorial này, tôi sẽ thảo luận về làm thế nào để bảo mật các Web Component bằng việc sử dụng JAAS. Trước khi bắt đầu thảo luận, tốt hơn là làm quen với JAAS, tổng quan về nó và từ vựng của nó.

2.JAAS là gì?
Theo truyền thống, bảo mật cung cấp bởi bảo mật dựa trên mã Java(tôi sẽ sử dụng Java khi đề cập đến J2SE). Trong bảo mật dựa trên mã, chữ ký của mã cung với mã gốc được chứng thực. Các đặc quyền của user chạy mã không bao giờ được kiểm tra. Vì thế điều khiển truy cập không bao giờ có hiệu lực. Để vượt qua giới hạn này, package JAAS được giới thiệu. Trong phiên bản hiện thời, JAAS là một trong những module cốt lõi của Java Development Kit. JAAS có hai component: một authentication component (xác nhận), và một authorization component (phân quyền).
Authentication component cung cấp các dịch vụ để xác nhận định danh user người đang thực thi mã. Authorization component bổ sung những đặc điểm bảo mật mã tồn tại bằng việc hạn chế mã từ việc thực thi các tác nhiệm hệ thống. Điều này được thực hiện bằng cách tăng hiệu lực điều khiển truy cập dựa trên việc xác nhận. Module authorization có thể cung cấp dịch vụ này cho bất kỳ kiểu mã nào mà nó có đang được thực thi từ bên trong một application hay không, applet và servlet hay cho EJB. Một phần bên ngoài, JAAS thực hiện việc xác nhận và phân quyền của nó trong một kiểu pluggable. Những đặc điểm này của JAAS làm cho nó tốt hơn trong việc bảo mật các ứng dụng J2EE.

3.Tại sao sử dụng JAAS?
Trong J2EE, câu trả lời nằm ở những cơ sở dưới đây:

  • Như đã được mô tả, JAAS bao gồm những đặc điểm bảo mật đựơc cung cấp bởi Java
  • Nó thích hợp với bảo mật J2EE. Việc tích hợp của JAAS với J2EE cũng rất dễ dàng
  • Việc xác nhận thực hiện bởi JAAS theo phương cách thiết kế Pluggable Authentication Module. Cách làm này Java có được từ kỹ thuật xác nhận mà sự thay đổi trong kỹ thuật này có thể đạt được mà không phải viết lại mã
  • 4.Subject, principals và credentials
    Ba điều này là những thuật ngữ thường xuyên nhất của JAAS. Chúng cũng là những class cốt lõi của package này. Trong phần này, tôi sẽ thảo luận về những thuật ngữ này và cách sử dụng chúng trong trong tiến trình cung cấp bảo mật.

    Subject

    Nói một cách ngắn gọn, một subject liên quan đến một cá thể, ví dụ một user hoặc một hệ thống khác. Những user của hệ thống phụ thuộc trên những tài nguyên khác nhau được cung cấp bởi hệ thống để thực thi những tác nhiệm tính toán khác nhau. Các tài nguyên này hầu hết luôn luôn nằm trong một dạng của các Service. Trong những trường hợp nào đó, bản thân một hệ thống phải phụ thuộc vào những service chạy trên những hệ thống khác. Vì thế, trong cả hai trường hợp, dù đó là một cá thể sử dụng các service hệ thống hoặc hệ thống khác thì JAAS phải chứng thực nó. Vì thế trong thuật ngữ của JAAS, cả hai trở thành những subject.

    Principal
    Một service luôn luôn được kết hợp với tên của subject đang sử dụng service đó. Và mỗi subject có thể sử dụng nhiều service khác nhau dưới những tên khác nhau. Vì thế, principal, về thực chất là tên được kết hợp với một subject. Nói một cách khác, tên kết hợp một subject và một service chính là principal. Giống như subject, principal là một trong những class cốt lõi.


    Credential
    Một service, tại nhiều thời điểm, sẽ đính kèm những thuộc tính bảo mật (cũng đồng thời là dữ liệu) cho một subject khác với principal. Hầu hết các thời điểm những thuộc tính này thường không có gì, nhưng thông tin được hỗ trợ bởi subject cho authentication (việc chứng thực). Những thuộc tính như thế là những credential được giới hạn. Credential có thể là bất kỳ kiểu đối tượng nào. Chúng có thể bao gồm password (mật khẩu), Kerberos ticket, và các public key certificate (khóa xác nhận). Các đặc điềm pluggable (cắm & xài) này của JAAS đảm bảo rằng việc bổ sung credential của bên thứ ba có thể được tập hợp vào bên trong JAAS mà không phải tốn nhiều công sức.


    Câu hỏi kế tiếp này sinh hiển nhiên là, chúng quan hệ thế nào trong code? Hãy cùng nhìn một chút.
    Như tôi đã thảo luận, mỗi subject có thể có nhiều tên. Một subject sẽ có một tập các principal

    public interface Principal {
    public String getName();
    }
    public final class Subject {
    public Set getPrincipals() {
    }
    }


    Tương tự như thế:
    public final class Subject {
    ...
    public Set getPublicCredentials() { }// không kiểm tra bảo mật
    public Set getPrivateCredentials() { } // kiểm tra bảo mật
    }



    Trong nhiều thuật ngữ cần giải thích hơn, class Subject có một method trả về những principal được kết hợp với subject, kiểu trả về là một collection – Set. Class subject có những method tốt hơn cho các Credential. Có hai kiểu credential trong ví dụ trên: các public credential và private credential. Các public credential chứa các Public key, các Kerberos ticket của instance Subject vân vân... trong khi các private credential chứa các Private Key, các password vân vân... Vì thế, subject chứa những method để lấy những credential và principal được kết hợp với nó.

    5.Bổ sung module bảo mật JAAS
    Đã lý luận quá nhiều, bây giờ là thời gian để xem xét những bước đòi hỏi việc bổ sung JAAS như một module. Việc bổ sung mà tôi thảo luận dưới đây đã được phát triển để cung cấp bảo mật cho một ứng dụng Java Mail mà hiện thời tôi đang cố gắng sử dụng cho cá nhân tôi. Để viết những bổ sung tùy biến, sử dụng những bước sau:

    * Bổ sung LoginModule

    * Viết CallBackHandler

    * Cung cấp các bổ sung tùy biến cho Principal và Action (đây là lựa chọn)

    * Cấu hình file JAAS policy

    * Cấu hình J2EE Application Server

    Trước khi đi vào chi tiết của bổ sung, package mà bạn cần phải import là javax.security

    Bổ sung LoginModule
    LoginModule là một trong những module cốt lõi của JAAS. Nó đóng gói tính logic của việc chứng thực dành cho JAAS framework. Để bổ sung LoginModule, một trong bốn method sau phải được override.

    * login()

    Method này thực thi các tác nhiệm trong việc thu thập thông tin đăng nhập và việc chứng thực user. Nói một cách ngắn gọn, tính logic để chứng thực một user là ở đây. Việc thu thập thông tin đăng nhập được thực hiện như dưới đây

    Callback[] callbacks=new Callbacks[2];
    Callbacks[0] = new NameCallback(“userModule username:”);
    Callbacks[0] = new NameCallback(“userModule password:”,false);
    callbackHandler.handle(calls);

    Hiển nhiên là trong đoạn mã ở trên, thông tin đăng nhập được thu thập sử dụng CallBackHandler. Một khi thông tin đăng nhập được tập hợp với nhau, method login sẽ cố gắng để kết nối với server. Nếu kết nối được, method sẽ trả về true. Đoạn mã nhỏ dưới đây chỉ ra thủ tục đó:

    boolean succeeded=false;
    try {
    user=((NameCallback)callbacks[0]).getName();
    passwd=((NameCallback)callbacks[0]).getPassword();
    props.put(Context.SECURITY_PRINCIPAL,user);
    props.put(Context.SECURITY_CREDENTIALS,passwd);
    ctx = new InitialDirContext(props);
    succeeded =true;
    }…
    return succeeded;

    Trong khối lênh try – catch, nó cố gắng để kết nối với LDAP server với thông tin đã được tập hợp. Nếu kết nối thành công (dĩ nhiên, method InitialDirContext() không ném ra các ngoại lệ), biến chứng thực được set là true. Ở đây, thay vì LDAP server, database server được sử dụng như là server dành cho việc chứng thực.


    * commit()

    Method này set username đã được kiểm tra trong session context. Mã thể hiện subject với các vai trò và các credential (chẳng hạn như các private key) bất kỳ cũng ở đây.

    if(!succeeded) {
    return false;
    } else {
    userPrincipal=new userPrincipal(user);
    if(!subject.getPrincipals().contains(userPrincipal) {
    subject.getPrincipals().add(userPrincipal);
    ...
    }
    commitSucceeded=true;
    return true;
    }

    * abort()

    Method này được gọi khi việc chứng thực LoginContext bị lỗi. Method này cũng được tự động thực thi bởi runtime nếu như một runtime exception xảy ra. Để tạo nên xử lý tùy biến trong trường hợp việc chứng thực bị lỗi này, đoạn mã thực hiện như sau


    if(!succeed) {//this is for authentication failure
    return false;
    } else if(succeeded&&commitSucceeded==false) {//this is for //runtime //error
    user=null;
    passwd=null;
    throw new FailedLoginException(“Exception in Processin”);
    }


    * logout()

    Bất kỳ khi nào user đăng xuất, method này sẽ được gọi. Vì thế, nếu bạn muốn gỡ bỏ một vài credential hay giải phóng tài nguyên nắm giữ bởi user bạn có thể thực hiện ở đây. Đoạn mã mà tôi sử dụng như dưới đây:
    subject.getPrincipals.remove(userPrincipal);
    succeeded = false;
    succeeded = commitSucceeded;
    user = null;
    if(password!=null) {
    password=null;
    }
    userPrincipal=null;
    return true;

    Class bao đoạn mã như sau:
    public class MyLoginModule implements LoginModule {
    }

Friday, January 13, 2006

Hướng dẫn lập trình Struts

1. Chào mừng bạn đến với Struts
Mục đích của dự án là cung cấp một môi trường làm việc mã nguồn mở cho việc xây dựng các ứng dụng với công nghệ Java.
Lõi của Struts là tầng điều khiển (Controller) mềm dẻo dựa trên các công nghệ chuẩn như Java Servlets, JavaBeans, ResourceBundles, và XML, cũng như hàng loạt các gói Jakarta Commons . Struts khuyến khích các kiến trúc ứng dụng dựa trên tiếp cận mô hình 2 - một áp dụng của lược đồ thiết kế Model-View-Controller (MVC).
Struts chứa thành phần điều khiển Controller và tích hợp với các công nghệ khác để hỗ trợ mô hình Model và khung nhìn View. Với Model, Struts có thể tương tác với các kỹ thuật truy cập dữ liệu chuẩn như JDBCEJB , cũng như hầu hết các gói của các nhà cung cấp khác (third-party packages), giống như Hibernate, iBATIS, hoặc Object Relational Bridge. Đối với View, Struts làm việc với các JavaServer Pages , bao gồm JSTL và JSF , cũng như các mẫu Velocity Templates, XSLT, và các hệ thống trình diễn khác.
Struts framework cung cấp các hệ thống nền tảng cho các ứng dụng web chuyên nghiệp. Struts giúp bạn tạo một môi trường mở cho ứng dụng của bạn dựa trên các chuẩn và các mẫu thiết kế mang tính chất công khai rõ ràng.
Struts là một dự án của The Apache Software Foundation đặt tại website http://struts.apache.org/ .
Struts là một dự án tiên phong và hỗ trợ miễn phí. Tài liệu và danh mục mail là cách thức chính để học sử dụng về Struts. Các trang tiếp theo giúp bạn biết là có những tài nguyên nào. Vì Struts là dự án tiên phong và các tài nguyên là giới hạn, điều quan trọng là chúng tôi giúp bạn những bước đầu tiên, sau đó là bạn phải tự phát triển tiếp.

2. Hình dung đơn giản về Struts
Một ứng dụng web web application sử dụng một trình thực thi để khởi động các tài nguyên như servlets và taglibs. Trình thực thi được định dạng bằng một tài liệu XML có tên là "web.xml". Mặt khác, Struts sử dụng một file cấu hình "Struts-config.xml" để khởi tạo các tài nguyên cần thiết. Những tài nguyên này bao gồm các ActionForms để lấy các yêu cầu của người dùng, ActionMappings để chỉ đến các Actions phía trình phục vụ Server, và các ActionForward để chọn các trang hiển thị.
Dưới đây là một file cấu hình đơn giản của Struts (struts-config.xml) áp dụng cho luồng công việc login:

    
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">


name="logonForm"
type="app.LogonForm"/>


path="/Welcome"
forward="/pages/Welcome.jsp"/>
path="/Logon"
forward="/pages/Logon.jsp"/>
path="/LogonSubmit"
type="app.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="/pages/Logon.jsp">
name="success"
path="/pages/Welcome.jsp"/>
name="failure"
path="/pages/Logon.jsp"/>

path="/Logoff"
type="app.LogoffAction">
name="success"
path="/pages/Logoff.jsp"/>




Bạn có thể mô tả nhiều loại tài nguyên trong file cấu hình. Bạn có thể mô tả các định dạng hợp lệ cho các ActionForms trong một đặc tả XML bằng việc sử dụng Bộ kiểm tra tính hợp lệ của Struts . Một mở rộng khác gọi là Tiles, nó giúp bạn xây dựng những trang web từ các phân đoạn nhỏ hơn.
Struts là một framework mở. Mỗi lớp thực thi bằng Struts có thể thay thế bằng các lớp mặc định (Struts xây dựng sẵn). Các thuộc tính của lớp mặc định này có thể được thiết lập bằng việc sử dụng thẻ set-property của Digester (Bộ chuyển đổi các cấu hình từ XML sang Java). Đó là một lý do giải thích việc có rất nhiều các phiên bản mở rộng cho Struts. Struts cung cấp một môi trường làm việc nền tảng, nhưng bạn vẫn có thể viết các ứng dụng theo cách riêng của bạn.
Thông tin thêm về Struts và các công nghệ phía sau của Struts, xin xem Tài liệu hướng dẫn sử dụng và Tài liệu kỹ thuật .

Để được bắt đầu một cách dễ dàng hơn, tôi xin được trình bày một số khái niệm cơ bản để các bạn có thể hiểu được Struts:
1. Thế nào là mô hình 1 ?
Ngày xưa các bạn lập trình một trang jsp, php hay asp, các bạn thường đan xen các mã html cùng với các mã jsp, php, hay asp. Do vậy, có những khó khăn sau có thể gặp phải
- Người thiết kế giao diện cũng cần phải biết các ngôn ngữ lập trình, hoặc bạn phải trực tiếp thiết kế chúng.
- Việc bảo trì chúng thường rất khó khăn, vì một phần các mã chương trình lẫn lộn với mã html.
- Khi có lỗi xảy ra, việc tìm ra lỗi và định vị ỗi cũng là một vấn đề khó khăn.
- Và còn nhiều những khó khăn khác ...
Việc lập trình như trên, người ta gọi là mô hình lập trình 1, hay là mô hình lập trình cổ điển.
2. Thế nào là mô hình 2 ?
Để khắc phục các khó khăn trên, người ta đưa ra mô hình 2 hay còn gọi là mô hình MVC (Model-View-Controllor).
Tức là: Tương ứng với một trang JSP ngày xưa, bây giờ người ta tách nó ra làm ba thành phần: Mô hình - Khung nhìn - Bộ điều khiển. Các thành phần trên làm việc như sau:
- Mô hình: Mô hình là các lớp java có nhiệm vụ:
+ Nhận các yêu cầu từ khung nhìn
+ Thi hành các yêu cầu đó (tính toán, kết nối CSDL ...)
+ Trả về các giá trị tính toán cho View.
- Khung nhìn: Bao gồm các mã tương tự như JSP để hiển thị form nhập liệu, các kết quả trả về từ Mô hình...
- Bộ điều khiển: Đồng bộ hoá giữa Khung nhìn và Mô hình. Tức là với một trang JSP này thì sẽ tương ứng với lớp java nào để xử lý nó và ngược lại, kết quả sẽ trả về trang jsp nào.
Như vậy, chúng ta có thể tách biệt được các mã java ra khỏi mã html. Do vậy, nó đã giải quyết được các khó khăn đã nêu ra trong Mô hình 1. Người thiết kế giao diện và người lập trình java có thể mang tính chất độc lập tương đối. Việc debug hay bảo trì sẽ dễ dàng hơn, việc thay đổi các theme của trang web cũng dễ dàng hơn ...

3. Struts sử dụng mô hình 2 như thế nào ?
Ngày nay khi nói đến Mô hình 2 thì người ta hiểu ngay đến Struts/MVC. Các thành phần MVC tương ứng trong Struts có thể mô tả đơn giản như sau:
- Mô hình: Các lớp java
- Khung nhìn: các trang jsp hay html
- Bộ điều khiển: file struts-config.xml (đương nhiên là cả các lớp điều khiển bên trong của nó nữa, nhưng người lập trình chỉ cần hiểu file cấu hình này là cũng tạm đủ rồi).

4. Để lập trình Struts được bạn cần phải có các kiến thức gì ?
Để lập trình được Struts, bạn cần hiểu được một số công nghệ nền tảng của Struts là:
- html
- xml
- java
- taglib
- ...
Nói như vậy, chắc các thấy sợ quá đúng không ?
Tuy nhiên, nó không đáng sợ đến thế đâu, bởi vì tuỳ vào lượng kiến thức bạn thu thập được bạn có thể áp dụng vào ứng dụng của mình. Nếu bạn chưa biết nhiều, bạn có thể làm các ứng dụng với việc hỗ trợ của các công nghệ cơ bản, sau đó bạn có thể nghiên cứu tiếp để đến với các công nghệ cao hơn ...

5. Vậy thì Struts có phải là lựa chọn tốt nhất cho tất cả các dự án ?
Không. Nếu bạn cần viết các ứng dụng đơn giản thì bạn chỉ cần sử dụng các trang phía trình phục vụ như JSP hoặc Servlet (Mô hình 1).
Nhưng nếu bạn viết một ứng dụng phức tạp hơn, với rất nhiều các trang, mà cần được duy trì lâu dài, khi đó Struts có thể giúp bạn. Các thông tin về lựa chọn hoặc Mô hình 1 hoặc MVC (Mô hình 2), xem phần Understanding JavaServer Pages Model 2 architectureIssues in Struts Adoption .

Tuesday, January 03, 2006

Kỹ thuật lập trình Ajax


AJAX là một trong những từ ngữ thời thượng bậc nhất hiện nay trong giới công nghệ thông tin và là bí quyết kĩ thuật đứng đằng sau các ứng dụng lớn thuộc Google, Flickr, GMail, Google Suggest, Google Maps. Mặc dù cái tên này mới xuất hiện được vài tháng, InfoWorld số tháng 5/2005 đã đưa ra nhận định: Ajax đang tạo nên cuộc cách mạng trong thế giới web.
AJAX LÀ GÌ?
JavaScript, ngôn ngữ lập trình chạy trên trình duyệt đã quá quen thuộc với thế giới web kể từ khi Netscape phát minh ra nó. Sự phát triển của công nghệ và nhu cầu người sử dụng ngày càng cao buộc các nhà phát triển tạo ra một kĩ thuật khác cho phép xử lý các tác vụ phức tạp hơn. Tháng 2/2005, trên Internet bắt đầu lan truyền thuật ngữ Ajax như là một kỹ thuật mới cho ứng dụng web. Những thành công vang dội và sự hấp dẫn kì lạ của Gmail, Google Suggest và Google Maps đã khiến cho Ajax được chú ý một cách đặc biệt.Ajax là viết tắt của Asynchronous JavaScript and XML - kỹ thuật kết hợp hai tính năng mạnh của JavaScript được các nhà phát triển đánh giá rất cao: • Gửi yêu cầu (request) đến máy chủ mà không cần nạp lại trang• Phân tách và làm việc với XMLCác ứng dụng Ajax xoay quanh một tính năng có tên là XMLHttpRequest. Các kĩ sư của dự án Mozilla bắt đầu hỗ trợ tính năng này ở bản Mozilla 1.0 (và Netscape 7). Apple cũng đã thực hiện một tính năng tương tự kể từ Safari 1.2.Ajax là sự phối hợp một loạt các công nghệ đang thu hút sự quan tâm của giới công nghiệp trong thời gian gần đây. Đó là:• Trình bày trang web dựa trên XHTML và CSS, các chuẩn của W3C, được Firefox (Mozilla), Safari (Apple), Opera, Netscape 8.0 (nhân Firefox) hỗ trợ rất tốt;• Biểu diễn động và tương tác sử dụng Document Object Model, chuẩn của W3C;• Trao đổi và xử lý dữ liệu dùng XML và XSLT, chuẩn của W3C;• Thu hồi dữ liệu bất đối xứng dùng XMLHttpRequest;• Dùng JavaScript để liên kết mọi thứ lại với nhau. JavaScript ở đây là ECMAScript, chuẩn của ECMA, không phải là JScript của Microsoft. Ở các ứng dụng web truyền thống, client sẽ gửi HTTP Request đến web server và web server sẽ gửi trả response chứa các thông tin dưới dạng HTML và CSS. Ajax cho phép tạo ra một Ajax Engine nằm giữa giao tiếp này. Khi đó, các yêu cầu gửi resquest và nhận response do Ajax Engine thực hiện. Thay vì trả dữ liệu dưới dạng HTML và CSS trực tiếp cho trình duyệt, web server có thể gửi trả dữ liệu dạng XML và Ajax Engine sẽ tiếp nhận, phân tách và chuyển hóa thành XHTML+CSS cho trình duyệt hiển thị. Việc này được thực hiện trên client nên giảm tải rất nhiều cho server, đồng thời người sử dụng cảm thấy kết quả xử lý được hiển thị tức thì mà không cần nạp lại trang. Mặt khác, sự kết hợp của các công nghệ web như CSS và XHTML làm cho việc trình bày giao diện trang web tốt hơn nhiều và giảm đáng kể dung lượng trang phải nạp. Đây là những lợi ích hết sức thiết thực mà Ajax đem lại.LẬP TRÌNH AJAXXử lý HTTP Request Để gửi một HTTP Request đến server bằng JavaScript, bạn cần tạo một đối tượng của lớp cung cấp tính năng này. Trong IE thì lớp này tồn tại dưới dạng một đối tượng ActiveX có tên là XMLHTTP. Đối tượng này có từ IE 4.0. var httpRequest = new ActiveXObject("Microsoft.XMLHTTP");Nếu MSXML được cài đặt thì bạn cũng có thể gọi: var httpRequest = new ActiveXObject("Msxml2.XMLHTTP");Ở Mozilla, Firefox, Opera 8.0, Safari và các trình duyệt khác thì lớp này có tên là XMLHttpRequest. Đối tượng XMLHttpRequest không phải là một chuẩn của W3C (tương lai có thể được W3C chấp thuận). Đối tượng XMLHttpRequest được hỗ trợ ở IE 5.0+, Safari 1.2+, Mozilla 1.0+/ Firefox, Opera 8.0+ và Netscape 7+.var httpRequest = new XMLHttpRequest();Do sự khác biệt này, nên để ứng dụng của bạn chạy trên nhiều trình duyệt thì bạn có thể làm như sau:if (window.XMLHttpRequest) { // Mozilla, Safari, ...httpRequest = new XMLHttpRequest();} else if (window.ActiveXObject) { // IEhttpRequest = new ActiveXObject("Microsoft.XMLHTTP");}Do ActiveX trên IE rất nguy hiểm cho người dùng nên nhiều trường hợp tính năng này được mặc định cấm, vì vậy bạn cần kiểm tra trình duyệt của người sử dụng trước khi gọi đối tượng XMLHTTP. Việc kiểm tra này được thực hiện qua giá trị của window.ActiveXObject. Ví dụ:if (window.ActiveXObject) {xmlhttp=new ActiveXObject("Microsoft.XMLHTTP") } else { ...} Một số phiên bản của trình duyệt Mozilla không làm việc đúng khi nhận đáp trả từ server không có header chứa XML mime-type. Để khắc phục vấn đề này, bạn có thể sử dụng phương thức định nghĩa lại phần header do server gửi đến trong trường hợp nó không phải là text/xml.httpRequest = new XMLHttpRequest();httpRequest.overrideMimeType(text/xml);Tiếp theo, bạn cần xác định muốn làm gì sau khi nhận được đáp trả (response) từ server. Giai đoạn này, bạn chỉ cần báo cho đối tượng HTTP request biết hàm JavaScript sẽ làm công việc xử lý đáp trả. Điều này được thực hiện bằng cách thiết lập thuộc tính onreadystatechange của đối tượng thành tên của hàm JavaScript:httpRequest.onreadystatechange = nameOfTheFunction; Chú ý không dùng cặp ngoặc đơn () sau tên hàm và không truyền tham số vào hàm đó. Thêm nữa, thay vì trao tên hàm thì bạn có thể sử dụng kĩ thuật định nghĩa hàm động:httpRequest.onreadystatechange = function() {// do the thing};Sau khi đã khai báo những gì sẽ diễn ra lúc nhận được response, bạn tiến hành gửi request. Bạn cần gọi các phương thức open() và send() của lớp HTTP request:httpRequest.open(GET, http://www.example.org/some.file, true);httpRequest.send(null);Tham số đầu tiên của lời gọi đến open() là phương thức HTTP Request – GET, POST, HEAD hay bất cứ phương thức nào mà bạn muốn sử dụng và phương thức đó cần được server hỗ trợ. Chú ý viết hoa theo quy định của chuẩn HTTP, nếu không thì một số trình duyệt như Firefox có thể không xử lý request. Tham số thứ hai là địa chỉ URL của trang mà bạn gửi request đến. Do thiết lập bảo mật, bạn không thể gọi các trang trên tên miền của bên thứ ba. Chú ý là nếu bạn không gọi đúng tên miền trên tất cả các trang thì bạn sẽ nhận được thông báo permission denied khi gọi open(). Tham số thứ ba xác lập request có bất đối xứng hay không (asynchronous). Nếu TRUE, thì việc thực thi hàm JavaScript sẽ tiếp tục trong khi response của server chưa đến. Đây là chữ A trong AJAX. Tham số gửi đến phương thức send() có thể là bất cứ dữ liệu nào mà bạn muốn gửi tới server nếu bạn dùng phương thức POST để gửi request. Dữ liệu sẽ có dạng của một chuỗi truy vấn: name=value&anothername=othervalue&so=onĐối tượng XMLHttpRequest có một tập các thuộc tính dùng chung trên tất cả các môi trường hỗ trợ. Dưới đây là danh sách các thuộc tính chủ yếu của đối tượng này.Xử lý Server Response Chú ý khi gửi request, bạn cung cấp tên của hàm JavaScript được thiết kế để xử lý response.httpRequest.onreadystatechange = nameOfTheFunction; Hãy xem hàm này nên làm gì. Đầu tiên, hàm cần kiểm tra trạng thái của request. Nếu trạng thái có giá trị là 4, nghĩa là ứng dụng của bạn đã nhận được response đầy đủ từ server và đó là dấu hiệu tốt để bạn tiếp tục xử lý nó.if (httpRequest.readyState == 4) {// không xảy ra vấn đề gì và bạn đã nhận được response } else {// chưa sẵn sàng}Tiếp theo cần kiểm tra mã trạng thái của HTTP server response. Tất cả các mã có thể thàm khảo ở site của W3C. Trong bài viết này, chúng ta quan tâm đến response 200 (OK).if (httpRequest.status == 200) {// trạng thái response trả lại dấu hiệu tốt!} else {// có vấn đề trong việc tiếp nhận và xử lý request,// ví dụ 404 (Not Found)// hay 500 (Internal Server Error) }Sau khi đã kiểm tra trạng thái của request và mã trạng thái của HTTP response, việc xử lý dữ liệu mà server gửi tới tùy ở bạn. Bạn có hai lựa chọn:• httpRequest.responseText – trả lại dưới dạng chuỗi văn bản • httpRequest.responseXML – trả lại dưới dạng đối tượng XMLDocument và bạn có thể duyệt bằng cách sử dụng các hàm JavaScript DOMVí dụ với Text Response Chúng ta sẽ xây dựng một ví dụ đơn giản. Các mã JavaScript gửi request đến một trang HTML, test.html. Trang này chứa dòng "Im a test", sau đó chúng ta dùng alert() để gửi ra nội dung của file đó.Trong ví dụ này, người dùng kích chuột vào liên kết "Make a request" trên trình duyệt, việc này sẽ gọi hàm makeRequest() cùng với một tham số – cái tên test.html của file HTML trong cùng thư mục. Sau đó request được thực hiện. Tiếp theo, bạn xác định hàm alertContents() sẽ xử lý trường hợp onreadystatechange. alertContents() kiểm tra xem response đã nhận được hay chưa và nếu OK thì nó sẽ thực thi alert() để gửi ra nội dung của file test.html.Ví dụ với XML Response Ví dụ vừa khảo sát minh họa cho cách dùng thuộc tính reponseText của đối tượng request. Ví dụ dưới đây sẽ minh họa cho thuộc tính responseXML.Việc đầu tiên là chuẩn bị trang XML sẽ được dùng cho request về sau. Trang dưới có tên là test.xml:
Im a test.Trong dòng mã của ví dụ trên chúng ta chỉ cần thay dòng request bằng:...onclick="makeRequest(test.xml)">...Sau đó trong alertContents() chúng ta cần thay dòng alert(httpRequest.responseText); với:var xmldoc = httpRequest.responseXML;var root_node = xmldoc.getElementsByTagName(root).item(0);alert(root_node.firstChild.data);responseXML lấy giúp chúng ta đối tượng XMLDocument và chúng ta sẽ dùng các phương thức DOM để truy cập một số dữ liệu có trong trang XML. Mã nguồn ví dụ có thể tải về ở website TGVT, bạn cũng có thể chạy trực tiếp tại http://goldenkey.edu.vn/ajax.

onreadystatechange


Bộ xử lý sự kiện cho một sự kiện phát sinh mỗi khi có sự thay đổi trạng thái.


readyState


Status: 0 = uninitialized 1 = loading 2 = loaded 3 = interactive 4 = complete


responseText


Dữ liệu dạng String trả về từ server


responseXML


Đối tượng tài liệu tương thích DOM của dữ liệu trả về từ server


status


Mã trạng thái dạng số do server trả về, như 404 cho "Not Found" hay 200 cho "OK"


statusText


Thông điệp dạng String message đi kèm với mã trạng thái.


To be continue…

Monday, January 02, 2006

10 lời khuyên cho "dân IT" khi được phỏng vấn tuyển dụng

Nhiều ý kiến của bạn đọc là sinh viên bày tỏ rằng: Hiện tại các chương trình đào tạo chính quy chuyên ngành CNTT ở VN chưa chưa đề cập tới những soft skills (kỹ năng mềm) như: giao tiếp, làm việc nhóm, thuyết trình, lập kế hoạch...

Để đáp ứng nhu cầu này, sau đây là: "10 lời khuyên khi đi phỏng vấn tuyển dụng cho sinh viên IT". Bài viết là sự tổng hợp từ ý kiến của nhiều chuyên gia, các nhà tuyển dụng...

1/ Bằng cấp và bảng điểm không phải là yếu tố quyết định. Nhà tuyển dụng (NTD) có các chuyên gia giỏi của lĩnh vực bạn có bằng cấp, nếu bạn kém cỏi thì chỉ 5 giây họ sẽ quay ra tò mò làm sao bạn lại có được chứng chỉ này.

Quy tắc số 1: phải trau dồi kiến thức để có bản lĩnh thực chất, có khả năng đáp ứng yêu cầu công việc trong thực tế, bằng cấp chỉ là yếu tố phụ.

2/ Tìm hiểu rõ nhà tuyển dụng cần gì ở bạn? Nói vui một chút, là bạn "có hoặc sẽ có" khả năng gì mà họ có thể "lợi dụng". NTD sẽ tìm cách hỏi bạn nhựng kiến thức và kỹ năng mà họ cần bạn có. Nếu bạn có thì trả lời là có, nếu bạn chưa có kiến thức đó, hãy cho NTD thấy bạn đã hiểu nguyên lý của vấn đề, chỉ cần tập trung đầu tư thời gian, bạn sẽ trở thành người giỏi.

Quy tắc số 2: lấy khả năng tiếp cận nhanh kiến thức mà NTD cần để khắc phục sự khiếm khuyết kiến thức hiện tại của mình.

Ví dụ: NTD yêu cầu bạn trình bày về một hệ điều hành X mà bạn chưa sử dụng nó bao giờ (hoặc mới chỉ nghe loáng thoáng), bạn hãy bình tĩnh nói họ của HĐH X đó (thuộc họ Unix hay Windows), nói về vài nhận xét của bạn về nó. Bạn hãy tự tin nói cho NTD biết là bạn sẽ mất bao lâu để có thể làm việc với hệ điều hành X như họ yêu cầu (bởi ước lượng chính xác thời gian tiếp cận công nghệ cũng là một tiêu chí để đánh giá ứng viên của các NTD trong lĩnh vực IT).

3/ Tỉnh táo trước những câu hỏi lạ! Khi gặp những câu hỏi lạ không liên quan đến kỹ thuật hãy dành một chút thời gian tìm hiểu mục đích của câu hỏi trước khi trả lời. Bạn có thể yêu cầu NTD cho bạn 1 phút để suy nghĩ hoặc tìm kế hoãn binh để đoán ra ý đồ của NTD.

Quy tắc số 3: Đừng vội vàng trả lời ngay những câu hỏi lạ.

Ví dụ: NTD hỏi bạn là nếu đang đi một con thuyền, trên thuyền có một tảng đá và bạn vứt tảng đá đó xuống hồ. Hỏi: nước trong hồ dâng lên hay hạ xuống?. Xin chú ý, NTD không quan tâm câu trả lời là dâng lên hay hạ xuống, mà họ chỉ muốn kiểm tra khả năng tìm hiểu các yêu cầu để giải quyết vấn đề của bạn. Một ứng viên tốt sẽ hỏi lại rất nhiều câu hỏi (hỏi càng hay càng được đánh giá cao) như: hồ có to không? tảng đá có to không? nước trong hồ là mặn hay ngọt... trước khi đưa ra kết luận.

4/ Khả năng nghiên cứu bằng tiếng Anh! Lĩnh vực IT rất cần khả năng này, ít nhất bạn phải có khả năng đọc hiểu tài liệu kỹ thuật tiếng Anh. Hãy nói thẳng với NTD về khả năng tiếng Anh của bạn (nếu bạn không nghe/nói được, điều này ít quan trọng hơn đọc/hiểu).

Quy tắc số 4: bạn phải là người có thể nghiên cứu tốt bằng tài liệu tiếng Anh

5/ Tự tin có cơ sở! Đừng ngại "sửa lưng" NTD, nếu bạn nắm rõ vấn đề hãy mạnh dạn tương tác với NTD. Những NTD cởi mở sẽ rất thích các ứng viên có quan điểm mạnh, tư tin và vững vàng trong trình bày! (Rất cần thiết nhưng không nên lạm dụng một cách thái quá sẽ "hiệu quả ngược".)

Quy tắc số 5: hãy khác biệt và tự tin.

Ví dụ: bạn không cần đợi đến đợt phỏng vấn mới nộp hồ sơ, hãy mạnh dạn tương tác và đề xuất trực tiếp với NTD, bạn sẽ nhận được những kết quả hết sức thú vị.

6/ Hồ sơ xin việc rõ ràng và sáng sủa (sự cẩu thả trong chuẩn bị hồ sơ tạo ấn tượng rất xấu vì làm giảm bớt sự tin cậy của người tuyển dụng). Đặc biệt phần CV (tóm tắt thông tin cá nhân) cần làm rõ những khả năng, kinh nghiệm và định hướng lĩnh vực đang quan tâm và dự kiến kế hoạch để đạt được mục đích đó.

Nguyên tắc số 6: Hãy rèn luyện tính nghiêm túc, biết lựa chọn hướng đi rõ ràng và thể hiện nó.

7/ Tính thật thà: Trong phỏng vấn, đây là yếu tố rất quan trọng. Việc trả lời lòng vòng hoặc không nhất quán (đặc biệt các câu hỏi liên quan tới các vấn đề kỹ thuật) sẽ gây ấn tượng rất tệ. Những gì chưa rõ hoặc không biết thì cần trả lời ngay là chưa biết hoặc chưa nghiên cứu. Người tuyển dụng đánh giá cao nếu nhận thấy tính thật thà khi trả lời và tính cầu tiến (Ví dụ: Vấn đề này em chưa rõ nhưng có thể có câu trả lời chính xác sau.... thời gian)

Nguyên tắc số 7: Hãy luôn biết mình là ai và học lấy tinh thần cầu tiến

8/ Tính trách nhiệm, cẩn trọng và chủ động trong công việc: Trong thời điểm này, tính trách nhiệm, cẩn trọng được đánh giá cao hơn sự thông mình, nhanh nhạy nhưng không có trách nhiệm làm tới nơi tới chốn 1 công việc. Đặc biệt nếu bạn muốn vào các vị trí quan trọng (ví dụ quản trị mạng, vị trí liên quan tới bảo mật thông tin...)

Nguyên tắc số 8: Trong quá trình tuyển dụng, hãy thể hiện mình là người quyết đoán nhưng có trách nhiệm.

9/ Tính sáng tạo và khả năng hòa đồng nhanh chóng với môi trường mới: Nếu bạn có tố chất này thì sẽ được cộng điểm tương đối.

Nguyên tắc số 9: Khi tuyển dụng, hãy ăn nói tự nhiên một cách hợp lý, thân thiện và dí dỏm.

10/ Kinh nghiệm thực tế: được đánh giá thông qua các đề tài nghiên cứu khoa học, đồ án tốt nghiệp, nơi thực hành, làm tại các công ty trong thời gian sinh viên. Hãy cố gắng thể hiện ra được những gì mình đã từng làm và có liên quan tới nơi mà bạn xin việc. Cũng rất chú ý khi trình bày khả năng của mình, cần toát lên cho người tuyển dụng thấy được sự chắc chắn và rõ ràng đối với các thông tin bạn đưa ra.

Ví dụ: Trình bày một cách tổng quan về chính đồ án tốt nghiệp bạn đã làm. Cách làm tưởng chừng đơn giản nhưng sẽ khiến NTD đánh giá được nhiều về bạn.

Nguyên tắc số 10: Hãy chuẩn bị cho con đường của bạn bằng những thực nghiệm, nghiên cứu thực tế ngay từ lúc bạn còn trên ghế nhà trường và phát xuất ý tưởng.

Trên đây là một vài lời khuyên của một số các nhà tuyển dụng lớn về nhân lực IT ở Việt Nam và các chuyên gia. Chúng tôi cũng thu thập ý kiến của một số cá nhân từng có nhiều kinh nghiệm trong quá trình "bị" phỏng vấn tuyển dụng. Đúc kết lại, tất cả mọi người đều có chung một nhấn mạnh: Lời khuyên quan trọng nhất là hãy chuẩn bị cho mình một bản lĩnh vững vàng + niềm đam mê, bởi IT là một lĩnh vực đầy thử thách!

10 lời khuyên này được tổng hợp lại từ ý kiến của một số nhà tuyển dụng, đại diện cho rất nhiều nhà tuyển dụng của VN và thế giới. Do vậy, không hẳn đó đã là những lời khuyên đúng đắn tuyệt đối nhất. Song chúng tôi hy vọng, những lời khuyên này sẽ giúp các bạn trẻ ít nhiều trong một hoàn cảnh cụ thể nào đó.

"Thuật đàm phán" dành cho dân IT

"Thuật đàm phán" là khái niệm rất phổ biến đối với nhiều sinh viên tại các trường ĐH hoặc nhân viên tại nhiều công ty nước ngoài. Trước nay, nó vốn là "vũ khí bí mật" của dân quản trị kinh doanh...

Thạc sĩ Nguyễn Hà Phi - một người Việt Nam sinh sống và tu nghiệp tại Mỹ, từng tốt nghiệp Đại học Berkeley, định cư tại thung lũng Silicon (Mỹ). Hiện tại, anh Phi đang dạy học tại một trường Cao đẳng và làm việc cho một trong năm công ty phần mềm lớn của Mỹ.

Bài viết dưới đây được tóm tắt từ buổi nói chuyện của anh Phi với cộng đồng JavaVietNam và sinh viên CNTT tại Hà Nội.

Trong đó anh Phi đề cập đến một số kiến thức khá mới mẻ, chẳng hạn: "Thuật đàm phán” dành cho sinh viên CNTT Việt Nam đang học hoặc mới ra trường. Hy vọng những kinh nghiệm, kiến thức của một người nhiều năm làm việc, quan hệ với các doanh nghiệp, tổ chức IT trong và ngoài nước Mỹ sẽ giúp ích cho các bạn trẻ đang trên con đường tìm kiếm tương lai và sự nghiệp trong ngành IT.

"Xin chào các bạn!

"Thuật đàm phán" là khái niệm rất phổ biến, mọi sinh viên tại nhiều trường ĐH hoặc nhân viên tại nhiều công ty nước ngoài đều được học. Trước nay nó vốn là "vũ khí bí mật" của dân quản trị kinh doanh, hoặc chỉ có các sinh viên ở những trường ĐH danh tiếng, kỹ sư được tu nghiệp ở các Công ty để hỗ trợ bán hàng...”.

“Ở Việt Nam, tôi thấy các trung tâm đào tạo thường dạy thiên về kỹ thuật và nhiều kiến thức khác, bỏ qua mặt kỹ năng đàm phán, giao tiếp, thuyết trình, phỏng vấn... (trừ các ngành quản trị kinh doanh, Marketing, MBA)”.

“Dưới đây là một vài đúc rút kinh nghiệm của cá nhân tôi. Trong quá trình học tập, nghiên cứu và làm việc tại nước ngoài. Vì thế, nó sẽ thích hợp hơn với những bạn đang có ý định, hoặc sắp tham gia vào các doanh nghiệp tổ chức IT nước ngoài, liên doanh, hoặc đơn giản là tiếp xúc với người nước ngoài".

1/ Không đưa vào thế đối đầu trực tiếp với người tuyển dụng (NTD).

Chẳng hạn, nếu NTD nói: “Nhìn vào CV của anh, tôi thấy anh không thích hợp với công việc này”

Thì thay vì đưa NTD vào thế “tôi đúng, ông sai” theo kiểu: “Thưa ông, tôi có kinh nghiệm đấy chứ!”… hãy tìm một cách nói tế nhị và có sức thuyết phục hơn. Chẳng hạn: “Thưa ông, tôi đồng ý với ông, nhiều người khác khi nhìn vào CV của tôi cũng có cùng suy nghĩ như thế, nhưng nếu ông cho phép tôi giải thích, ông sẽ thấy rằng công việc trước kia của tôi ở công ty ABC... rất tương tự”

2/ Để đối tác ra điều kiện trước

Trong các quan hệ giao tiếp mang tính chất thoả thuận, đàm phán, nên để đối tác ra điều kiện trước. Chẳng hạn trong phỏng vấn tuyển dụng, NTD hỏi: “Nếu được vào làm, anh muốn mức lương bao nhiêu?”

Câu trả lời khôn khéo nhất trong trường hợp này theo tôi là: “Thưa ông tôi không có kinh nghiệm nhiều về mặt này. Một người có kinh nghiệm và kiến thức như tôi, thường thì công ty trả bao nhiêu?”

3/ Không bao giờ đồng ý ngay với những quyết định đầu tiên

Kết thúc buổi phỏng vấn tuyển dụng, NTD cho biết bạn đã được nhận vào làm với mức lương X cụ thể. Kể cả trong trường hợp bạn rất hài lòng, cũng nên có câu trả lời cân nhắc.

Thay vì vồ vập: "Cảm ơn ông, khi nào thì tôi bắt đầu công việc". Bạn nên nói: "Đây là một quyết định quan trọng, xin ông cho tôi một / hai ngày để suy nghĩ, đến ngày... giờ… cụ thể tôi sẽ xin trả lời ông".

NTD sẽ thấy bạn là người cẩn thận, khoảng thời gian đó đủ để bạn tìm hiểu thêm về công ty, phong cách làm việc, mức lương của bạn có hợp lý chưa… Và cho họ thấy quyết định vào làm việc ở công ty họ rất quan trọng với bạn, ngay cả trong trường hợp bạn bị sa thải, khả năng quyền lợi của bạn được đền đáp xứng đáng sẽ cao hơn.

4/ "Giả vờ" ngạc nhiên

Trong quan hệ mua bán thoả thuận quyền lợi hay kinh tế, đối tác của chúng ta thường đưa ra một cái giá khởi điểm thường là không chính xác nhằm “bắt mạch” mình để xem phản ứng và lên giá . Hãy “chặn mạch” bằng cách tỏ ra ngạc nhiên hoặc tức giận (tất nhiên là tuỳ chỗ tuỳ lúc).

5/ "Sếp ảo"

“Sếp ảo” (theo cách gọi của riêng tôi) vốn là một chiêu rất thường thấy trong hoạt động đàm phán, giao tiếp, mua bán… hàng ngày. “Chiêu” này hầu như nhân viên phụ trách bán hàng nào của các công ty lớn tôi đã gặp đều được đào tạo rất kỹ.

Chẳng hạn trong trường hợp bạn mua một món hàng và mặc cả với nhân viên bán hàng một giá tiền thấp hơn giá cô ta nói. Thay vì phải ở vào thế đối đầu đôi co mặc cả với bạn, cô kia sẽ nhẹ nhàng xin phép vào trong hỏi lại ý kiến của người quản lý rồi ra trả lời bạn sau.

Thực ra có thể chẳng có người nào ở phía trong cả, nhưng điều đó cho phép họ dò xét bạn (muốn, rất muốn, không muốn món hàng đó?), làm kế hoãn binh hoặc từ chối bạn mà không phải ở vào thế đương đầu.

Để chống lại “chiêu này”, bạn nên khôn khéo: “Nếu tôi đưa ra một cái giá hợp lý, chị có thể tự quyết định ngay được không?”

Hoặc đánh vào lòng tự ái: “Ồ phiền quá nhỉ, tôi nghĩ sếp của chị sẽ chẳng nghe đâu... Người am hiểu chất lượng và giá thành như chị lẽ nào không thể tự quyết định?...

6/ Đừng bao giờ chạy đua với thời gian

Đây là nguyên tắc rất quan trọng. Nếu để ý, bạn sẽ thấy nhiều công ty lớn của nước ngoài khi cử người đi hội thảo chỉ có hai ngày, xong họ đã đặt phòng khách sạn trọn cả tuần. Trong đàm phán cũng vậy, luôn tự chủ về mặt thời gian sẽ giúp bạn đứng vững ở thế chủ động.

Một ví dụ đơn giản nhất, khi có nhu cầu mua một chiếc xe máy đã qua sử dụng chẳng hạn, bạn nói bạn đã có một chiếc xe và muốn mua thêm, chứ không nên nói vừa bị mất, hỏng xe cần mua xe gấp. Cách nói đó giúp bạn hoàn toàn chủ động và không bị đối tác o ép.

7/ Đừng bao giờ xin cưa đôi, hãy cố gắng để bên kia trả giá trước

Trong quan hệ mua bán, thoả thuận kinh tế… đừng bao giờ xin cưa đôi theo kiểu: “Ông nói 40 tôi nói 20, vậy thì cưa đôi là 30 nhé?”. Nếu đối tác vẫn lắc đầu với số 30, bạn buộc phải cưa đôi lần nữa, cái giá đã chẳng phải là 35 sao?

Xin lưu ý: Những điều tôi viết trên đây, sẽ do mỗi người tự đánh giá đúng sai, hoàn cảnh áp dụng và tự cân nhắc xem những kiến thức đó có nên áp dụng không. Tôi muốn nói đến mặt đạo đức ở một số điểm tương đối duy lý. Chúc các bạn thành công và chúc một năm mới hạnh phúc! Chào thân ái ! PhiTzu.


 

   Copyright © 2005 rocktonam. Contact me at rocktonam@yahoo.com or rocktonam@gmail.com

   Or now you can send your massages to me [rocktonam] -->

   Ghi rõ nguồn rocktonam.blogspot.com khi phát hành lại thông tin từ trang blog này.