Phân Biệt Toán Tử == Và Phương Thức Equals() Trong Java.

19:46 HungPV7 Blog 1 Comments

Tôi nghĩ còn nhiều bạn chưa phân biệt rõ sự khác nhau giữa toán tử “==” và phương thức equals() trong Java, đặc biệt là khi so sánh chuỗi String trong Java.
Hôm nay tôi viết bài này để các bạn cùng tham khảo.

VD: Tôi có đoạn code như sau:

String a = new String(“hungpv”);
String b = new String(“ hungpv”);

System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?false

System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?true

Vậy tại sao kết quả lại khác nhau?

Trong JAVA, có 2 kiểu biến: biến tham trị và tham chiếu.
Biến kiểu tham trị bao gồm các kiểu nguyên thủy của JAVA như: int, long, double…
Biến kiểu tham chiếu bao gồm: String, array, kiểu đối tượng…

Khi sử dụng biến kiểu tham trị, JAVA chỉ cho phép bạn sử dụng toán tử so sánh “==”.
Khi sử dụng biến kiểu tham chiếu, JAVA cho phép sử dụng cả toán tử “==” và equals(). 
Tuy nhiên, khi sử dụng toán tử “==”, bộ xử lý của JAVA sẽ so sánh xem 2 biến tham chiếu này có trỏ đến cùng một đối tượng hay không, còn nếu bạn sử dụng phương thức equals(), bộ xử lý JAVA sẽ so sánh giá trị của 2 biến tham chiếu đó. Điều này lý giải tại sao ở ví dụ trên, khi sử dụng phép toán: a.equals(b) => kết quả trả về bằng true, trong khi a==b => kết quả trả về lại bằng false.

Để hiểu hơn, tôi xét thêm một ví dụ nữa:

String a = new String(“hungpv”);
String b = a;

System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?true
System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?true


1 nhận xét:

[ADO.NET] Lesson 02: Đối tượng SqlConnection

22:49 HungPV7 Blog 0 Comments

Lesson này sẽ mô tả về đối tượng SqlConnection và cách để kết nối tới database. Qua đó, bạn sẽ hiểu được các kiến thức về tạo, sử dụng và quản lý các đối tượng connection sao cho hiệu quả trong ADO.NET

Giới thiệu

Điều đầu tiên bạn cần là tạo một kết nối để xác định database nào cần làm việc. Nó sẽ quản lý tất cả các logic ở mức thấp kết hợp với các giao thức đặc trưng của database. Công việc mà bạn cần làm chỉ là tạo một đối tượng connection, mở kết nối và đóng kết nối sau khi đã hoàn thành công việc.
Mặc dù làm việc với connection rất đơn giản trong ADO.NET, bạn vẫn cần hiểu về connection để có một quyết định đúng khi viết mã lệnh truy xuất dữ liệu. Phải hiểu rằng mỗi kết nối là một tài nguyên quan trọng. Nếu bạn chỉ có một ứng dụng làm việc với database trong máy, bạn có thể không cần quan tâm đến nó. Tuy nhiên, với các ứng dụng doanh nghiệp, hàng trăm người dùng khắp công ty kết nối tới cùng một database. Mỗi kết nối  giống như một đường đây và số lượng của chúng nằm trong mức giới hạn. Trường hợp bạn có thể thấy rõ hơn là  một web site được truy cập với hàng trăm nghìn lượt mỗi ngày. Ứng dụng sẽ bắt và giữ các kết nối, điều này có thể gây ra những ảnh hưởng nghiêm trọng đến hiệu suất và vận hành của ứng dụng.
Mô hình sau cho ta thấy cách mà SqlConnection được sử dụng bởi các đối tượng ADO.NET khác:

Tạo một đối tượng SqlConnection

Một đối tượng SqlConnection giống như các đối tượng khác trong C#. Bạn chỉ cần khai báo một thể hiện của SqlConnection, như dưới đây:
SqlConnection conn = new SqlConnection(
“Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI”);
Đối tượng SqlConnection trên sử dụng constructor với một tham số kiểu string. Tham số này được gọi là chuỗi kết nối (connection string). Table 1 mô tả các phần của một connection string.
Table 1.  ADO.NET Connection String chứa các cặp key/value để xác định cách tạo một kết nối đến database.  Chúng bao gồm vị trí, tên của database và và chế độ bảo mật.
Connection String Parameter NameDescription
Data SourceIdentifies the server.  Could be local machine, machine domain name, or IP Address.
Initial CatalogDatabase name.
Integrated SecuritySet to SSPI to make connection with user’s Windows login
User IDName of user configured in SQL Server.
PasswordPassword matching SQL Server User ID.
Integrated Security sẽ bảo mật khi bạn làm việc trên một máy đơn. Tuy nhiên, bạn sẽ thường xuyên cần phải định rõ mức bảo mật dựa trên SQL Server User ID với quyền hạn được xác định cho ứng dụng bạn sử dụng. Đoạn mã sau sử dụng một connection string với tham số User ID và Password:
SqlConnection conn = new SqlConnection(
“Data Source=DatabaseServer;Initial Catalog=Northwind;User ID=YourUserID;Password=YourPassword”);
Lưu ý Data Source được gán cho DatabaseServer để chỉ ra rằng bạn có thể định danh một database trên một máy khác, thông qua mạng LAN, hoặc qua Internet. Ngoài ra, User ID và Password được thay thế cho tham số Integrated Security.

Sử dụng SqlConnection

Mục đích của việc tạo một đối tượng SqlConnection là để các mã lệnh ADO.NET khác có thể làm việc được với database. Các đối tượng ADO.NET khác, như SqlCommand và SqlDataAdapter dùng một connection như một tham số. Quá trình sử dụng SqlConnection gồm các bước sau:
  1. Tạo một SqlConnection.
  2. Mở connection.
  3. Truyền connection  cho các đối tượng ADO.NET khác.
  4. Thực hiện các thao tác database với các đối tượng ADO.NET này.
  5. Đóng connection.
Chúng ta đã thấy cách để tạo một đối tượng SqlConnection. Những bước còn lại, mở, truyền, sử dụng và đóng connection được thể hiện trong Listing 1.
Listing 1.  Using a SqlConnection
using System;
using System.Data;
using System.Data.SqlClient;
 
/// <summary>
/// Demonstrates how to work with SqlConnection objects
/// </summary>
class SqlConnectionDemo
{
    static void Main()
    {
        // 1. Instantiate the connection
        SqlConnection conn = new SqlConnection(
            "Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
 
        SqlDataReader rdr = null;
 
        try
        {
            // 2. Open the connection
            conn.Open();
 
            // 3. Pass the connection to a command object
            SqlCommand cmd = new SqlCommand("select * from Customers", conn);
 
            //
            // 4. Use the connection
            //
 
            // get query results
            rdr = cmd.ExecuteReader();
 
            // print the CustomerID of each record
            while (rdr.Read())
            {
                Console.WriteLine(rdr[0]);
            }
        }
        finally
        {
            // close the reader
            if (rdr != null)
            {
                rdr.Close();
            }
 
            // 5. Close the connection
            if (conn != null)
            {
                conn.Close();
            }
        }
    }
}
Mã lệnh sử dụng connection là một SqlCommand – đối tượng thực hiện truy vấn đến bảng Customers trong database. Tập kết quả trả về dưới dạng một SqlDataReader và vòng lặp while đọc cột đầu tiên của mỗi dòng trong tập kết quả này, chính là cột CustomerID. Chúng ta sẽ thảo luận về đối tượng SqlCommand và SqlDataReader trong lesson sau. Hiện tại, điều quan trọng là bạn cần hiểu rằng các đối tượng sử dụng SqlConnection để biết được database nào sẽ được truy xuất.
Khi bạn sử dụng xong đối tượng connection, bạn phải đóng nó. Thực hiện thất bại có thể gây ra các hậu quả nghiêm trọng đến hiệu suất và khả năng của ứng dụng. Như bạn thấy trong Listing 1: phương thức Close() được gọi trong một khối finally và chúng ta đảm bảo rằng connection sẽ khác null trước khi đóng nó.
Lưu ý rằng chúng ta bao đoạn mã ADO.NET trong một khối try/finally. Khối finally giúp đảm bảo rằng một phần mã lệnh sẽ được thực thi, bất kể một ngoại lệ có xảy ra hay không. Bởi vì các connection là một tài nguyên hệ thống ít ỏi, bạn sẽ cần phải chắc chắn rằng chúng được đóng trong khổi finally.
Một điểm bạn nên làm khi đóng connection là đảm bảo connection khác null. Nếu có sai sót xảy ra khi tạo connection, nó sẽ là null và bạn không nên cố đóng một connection không hợp lệ, điều này sẽ gây ra một ngoại lệ.
Ví dụ này cho thấy cách để dùng đối tượng SqlConnection với SqlDataReader – đối tượng yêu cầu bạn phải thực hiện một lệnh đóng connection rõ ràng. Tuy nhiên, khi dùng mô hình dữ liệu ngắt kết nối, bạn không cần phải mở và đóng connection thủ công. Chúng ta sẽ xem xét về vấn đề này trong lesson sau khi tìm hiểu về đối tượng SqlDataAdapter.

Tổng kết

Các đối tượng SqlConnection cho phép các đối tượng ADO.NET khác biết database nào sẽ được truy xuất và cách để tạo một connection. Chúng được tạo bằng cách truyền một connection string với một danh sách các cặp key/value để định nghĩa connection. Các bước mà bạn quản lý một connection là tạo, mở, truyền (cho các đối tượng ADO.NET khác), sử dụng và đóng. Hãy đảm bảo đóng connection một cách chính xác khi bạn đã làm việc xong với nó để chắc chắn rằng bạn không có một sự rò rỉ tài nguyên kết nối.

HungPV

0 nhận xét:

[ADO.NET] Lesson 01: Giới thiệu về ADO.NET

22:41 HungPV7 Blog 0 Comments

Lesson này sẽ giới thiệu các khái niệm chính của ADO.NET và các đối tượng mà bạn sẽ học trong các bài tiếp theo. Ngoài việc hiểu rõ hơn về khái niệm ADO.NET, bạn sẽ được biết thêm về các khái niệm cơ bản khác như data provider và các đối tượng connection, command, DataReader, DataSet, DataAdapter.

Giới thiệu

ADO.NET là một bộ các thư viện hướng đối tượng (OOP) cho phép bạn tương tác với dữ liệu nguồn. Thông thường thì dữ liệu nguồn là một cơ sở dữ liệu (database), nhưng nó cũng có thể là file text, exel hoặc XML. Theo những mục tiêu của hướng dẫn này, chúng ta sẽ chỉ xem xét tới cách ADO.NET làm việc với database.
Như bạn có thể biết rằng, có rất nhiều loại database hiện nay như Microsoft SQL Server, Microsoft Access, Oracle, Borland Interbase, và IBM DB2,… Để làm rõ hơn phạm vi của loạt bài này, tất cả ví dụ sẽ sử dụng SQL Server.

Data Provider

Chúng ta biết rằng ADO.NET cho phép tương tác với các loại dữ liệu và kiểu database. Mỗi loại dữ liệu cần một cách thức khác nhau để có thể truy xuất. Các loại dữ liệu cũ sử dụng giao thức ODBC, các loại dữ liệu mới hơn sử dụng giao thức OleDb. Vì vậy cần có một thư viện thống nhất để làm việc với chúng, đây chính là lý do mà ADO.NET được tạo ra.
ADO.NET cung cấp một cách thức chung để tương tác với nguồn dữ liệu, nhưng với mỗi loại dữ liệu bạn phải sử dụng một thư viện khác nhau. Các thư viện này được gọi là Data Provider và thường được đặt tên theo giao thức hoặc loại dữ liệu mà chúng cho phép bạn truy xuất. Table 1 liệt kê các data provider phổ biến, tiền tố (prefix) API mà chúng sử dụng và kiểu dữ liệu mà bạn có thể làm việc.
table 1.  ADO.NET Data Providers are class libraries that allow a common way to interact with specific data sources or protocols.  The library APIs have prefixes that indicate which provider they support.
Provider NameAPI prefixData Source Description
ODBC Data ProviderOdbcData Sources with an ODBC interface.  Normally older data bases.
OleDb Data ProviderOleDbData Sources that expose an OleDb interface, i.e. Access or Excel.
Oracle Data ProviderOracleFor Oracle Databases.
SQL Data ProviderSqlFor interacting with Microsoft SQL Server.
Borland Data ProviderBdpGeneric access to many databases such as Interbase, SQL Server, IBM DB2, and Oracle.
Một ví dụ có thể giúp bạn hiểu nghĩa của API prefix. Một trong những đối tượng ADO.NET bạn sẽ học là connection, chúng cho phép thiết lập một kết nối đến nguồn dữ liệu. Nếu bạn dùng OleDb Data Provider để kết nối, bạn sẽ cần dùng để đối tượng connection tên là OleDbConnection. Tương tự, đối tượng connection sẽ dùng prefix là Odbc hoặc Sql cho đối tượng OdbcConnection hoặc SqlConnection để kết nối với nguồn dữ liệu tương ứng. Như đã nói lúc đầu, ta sẽ học cách làm việc với SQL Server nên các đối tượng API của chúng ta sẽ có prefix là Sql.
(Vẽ theo hình minh họa “ADO.NET data access architecture” từ MSDN: http://msdn.microsoft.com/en-us/library/aa302163.aspx)

Các đối tượng của ADO.NET

ADO.NET bao gồm nhiều đối tượng bạn có thể dùng với dữ liệu. Phần này giới thiệu một vài đối tượng chính bạn sẽ sử dụng. Theo tiến độ trong các bài viết sau, bạn sẽ khám phá thêm nhiều đối tượng ADO.NET và cách chúng được sử dụng trong mỗi lesson riêng. Các đối tượng dưới đây bắt buộc bạn phải biết để làm việc với dữ liệu khi dùng ADO.NET.
SqlConnection
Để tương tác với database, bạn phải có một kết nối tới nó. Kết nối giúp xác định database server, database name, user name, password, và các tham số cần thiết để kết nối tới database. Một đối tượng connection được dùng bởi đối tượng command vì thế chúng sẽ biết database nào để thực thi lệnh.
SqlCommand
Quá trình tương tác với database cần phải biết hành động nào bạn muốn xảy ra. Điều này được thực hiện bởi đối tượng command. Bạn dùng đối tượng command để gửi một câu lệnh SQL tới database. Một đối tượng command dùng một đối tượng connection để xác định database nào sẽ được truy xuất. Bạn có thể dùng một đối tượng command riêng lẻ để thực thi lệnh trực tiếp, hoặc để gắn một tham chiếu của đối tượng command cho một SqlDataAdapter – đối tượng giữ các command sẽ làm việc trên một nhóm dữ liệu như sẽ đề cập tới trong phần dưới.
SqlDataReader
Nhiều thao tác dữ liệu đòi hỏi bạn chỉ lấy một luồng dữ liệu để đọc. Đối tượng data reader cho phép bạn lấy được kết quả của một câu lệnh SELECT từ một đối tượng command. Để tăng hiệu suất, dữ liệu trả về từ một data reader là một luồng dữ liệu fast forward-only. Có nghĩa là bạn chỉ có thể lấy dữ liệu từ luồng theo một thứ tự nhất định. Mặc dù điều này có lợi về mặt tốc độ, nhưng nếu bạn cần phải thao tác dữ liệu, thì một DataSet sẽ là một đối tượng tốt hơn để làm việc.
DataSet
Đối tượng DataSet là một thể hiện của dữ liệu trong bộ nhớ. Chúng chứa nhiều đối tượng DataTable, bên trong DataTable lại có nhiều column và row, giống như các database table thông thường. Bạn thậm chí có thể định nghĩa dữ liệu giữa các table để tạo các quan hệ parent-child. DataSet được thiết kế đặc biệt để giúp quản lý dữ liệu trong bộ nhớ và để hỗ trợ các thao tác không cần kết nối (disconnected) trên dữ liệu. DataSet là một đối tượng được dùng bởi tất cả Data Provider, đó là lý do tại sao nó không có một Data Provider prefix trong tên gọi.
SqlDataAdapter
Đôi lúc dữ liệu mà bạn làm việc là read-only và bạn ít khi cần thay đổi dữ liệu nguồn. Vài trường hợp cần lưu trữ tạm dữ liệu trong bộ nhớ để hạn chế truy xuất đến database. Data adapter làm điều này dễ dàng bằng cách giúp bạn quản lý dữ liệu trong chế độ ngắt kết nối. Data adapter sẽ đổ vào DataSet khi đọc dữ liệu và thực hiện thay đổi dữ liệu một lượt vào database.
Data adapter chứa một tham chiếu đến đối tượng connection và mở/đóng kết nối tự động khi đọc và ghi dữ liệu vào database. Hơn nữa, data adapter chứa đối tượng command cho những thao tác SELECT, INSERT, UPDATE và DELETE trên dữ liệu. Bạn sẽ có một data adapter được định nghĩa cho mỗi table trong một DataSet và nó sẽ quản lý các giao tiếp với database cho bạn. Tất cả những gì bạn cần làm là chỉ cho data adapter khi nào nạp hoặc ghi vào database.

Tổng kết

ADO.NET là một kĩ thuật .NET để thao tác với nguồn dữ liệu. Bạn có một vài Data Provider, cho phép bạn giao tiếp với các nguồn dữ liệu khác nhau, dựa trên giao thức mà chúng dùng hoặc kiểu database. Không cần quan tâm đến điều này, với mỗi Data Provider được sử dụng, bạn sẽ dùng các đối tượng tương tự nhau để thao tác với dữ liệu. Đối tượng SqlConnection cho phép bạn quản lý một kết nối đến nguồn dữ liệu. SqlCommand cho phép bạn gửi lệnh đến dữ liệu. Để đọc dữ liệu nhanh theo cơ chế forward-only, sử dụng SqlDataReader. Nếu bạn muốn làm việc với dữ liệu đã ngắt kết nối, dùng một DataSet và hiện thực việc đọc và ghi đến dữ liệu nguồn bằng một SqlDataAdalter.
HungPV

0 nhận xét:

React Native vs Ionic: A Side-by-Side Comparison

23:02 HungPV7 Blog 0 Comments


The purpose of this article is to highlight the most important conceptual differences between Ionic and React Native (RN), this will hopefully give you the information you need to make an educated choice about the stack that will work best for your project.

Hybrid and native apps

Before diving in the differences between Ionic and RN, let’s briefly remind ourselves what hybrid and native apps are. Hybrid apps are essentially websites embedded in a mobile app through what we call a webview. They are developed using HTML5, CSS, and Javascript, and execute the same code regardless of the platform in which they run. They can, with tools like PhoneGap and Cordova, use the native features of a device, like GPS or camera.
Native apps are developed in the language required by the platform it targets, Objective-C or Swift for iOS, Java for Android, etc. The code written is not shared across platforms and their behavior varies. They have direct access to all features offered by the platform without any restriction.
react native vs ionicClick the image to enlarge the infographic. Click here for detailed information about native and hybrid apps.

Native, or hybrid?

Ionic

Ionic is a typical hybrid development framework. It uses web technologies to write and render the application, and requires PhoneGap/Cordova bridges to access native features. Then it will try to reproduce native behaviors to provide the best user experience.
What about Ionic Native you’re asking? Don’t be mistaken by the name. Ionic Native is a new name for what used to be called ngCordova. It’s simply the new Ionic way to use existing Cordova and PhoneGap plugins. Ionic Native will not make your app native.

React Native

Developing in React Native is primarily done with Javascript, which means that most of the code you need to get started can be shared across platforms. However, where hybrid apps render using HTML and CSS, React Native will render using native components. This means that the user experience will generally be closer to other native apps as they will follow the patterns imposed by the operating system. Often, this also comes with better performance and smoother animations.
The hiccup is that this only works when the bridging components have been written for React Native. A decent set of native components is provided by default, but if you are a native app developer, do not expect to find all the components you are used to.

Verdict

While the result of RN is native, it requires bridge components to be written for each platform in order to use them, which brings it back closer to a hybrid framework.

Write once, run everywhere

Ionic

A typical hybrid app will run the same code regardless of the platform, and that is what Ionic is capable of doing. However, in order to feel more “native”, Ionic will adapt a few of its behaviors according to the platform. If you use tabs, they will be displayed just as recommended by the platform—at the bottom of the screen in iOS, and at top in Android.

React Native

The goal of RN is not to provide a way to write once, and run everywhere. Rather, they want developers to use the components which best follow the native behaviors of the platform. For example, Android has a highly customizable toolbar; iOS does not. You can use the toolbar for Android but you’ll have to use something different for iOS. Don’t worry, many components have an equivalent; and if there’s no equivalent, it’s easy enough to separate the platform-specific logic.

Verdict

With Ionic, you definitely do not have to worry about platform-specific behaviors. But with React Native you may have to in order to provide the most seamless experience for your users.

The language stack

Ionic

Ionic is a framework based on Angular, a Javascript framework. It uses HTML templates for its views. It is in line with the Mode-View-Controller pattern as views and logic are clearly separated.

React Native

React Native is based on the Javascript framework React and, thus, uses Javascript code that resembles HTML but essentially isn’t—they call it JSX. With that, the display logic is blended in with the business logic. Ultimately, this is not a problem as most developers will feel at ease with JSX. But if you’re working in a team with designers, collaborating with them will not be as straightforward as editing template files and writing CSS. I’m not saying it will take weeks for them to get used to it, but they might need to be taught what is going on. JSX is not HTML; it is styled slightly differently and does not offer the entire set of CSS rules browsers typically support.

Verdict

With Ionic you will be in a more familiar territory: classic HTML and CSS. With React Native, you will have to learn how to style and create your user interfaces using their own HTML-like components, it’s not hard, but it’s new.
react native vs ionicFig. 1: Snippet of React’s JSX on the left, Ionic 2 template on the right.

Testing during development

Ionic

When developing an app, it is very important to get immediate feedback. There is nothing more frustrating than having to wait a while to see if two pixels of margin is looking good or if three pixels is better. With Ionic, you can instantly preview your app in your browser and mobile devices. It instantly refreshes as you make changes to your application.

React Native

Forget about testing in your browser, RN produces native rendering remember? That’s not a problem though, with React Native you see the result of your modifications as you make them. No need to recompile, rebuild, etc.; the result is instant in an emulator or a real device. Pretty amazing!

Verdict

Both are brilliant—but a little different—in that regard. Instant feedback you want; instant feedback you’ll get!

What else do they come with?

Ionic

Working with Ionic is a bit like working with a CSS framework like Bootstrap. It comes with lots of components that are pre-made and pre-styled. You want to display a list of items, and for each you need an avatar, a little description, and a date? Done, they have a component for that!

React Native

As React Native wants to rely on native behaviors, they typically do not try to replicate them. The styling is for you to do. Most of the time, only the components which already exist natively are available, rarely non-native ones. However, if you want to write a true native component and use it in your views, you can do so with React Native.

Verdict

Ionic clearly gives you a head start here. Do not worry too much about the styling, apply a few classes and you’re good to go.

Plugins and community

When I choose an Open Source project to use, I find it very important to assess how vivid the community around it is. This directly impacts how easily you can find information online, answers to your questions, or getting bugs fixed.

Ionic

PhoneGap and Cordova have been around for a while so there is a high chance that a plugin already exists to expose the native feature you need in your webview. They also have a marketplace where developers sell, and offer, Ionic plugins.

React Native

A lot of plugins are already available on NPM for React Native. There’s even a plugin to use PhoneGap/Cordova plugins, which means that you instantly inherit the hundreds of mature plugins from the other community.

Verdict

As of this day, React Native has more stars on Github than Ionic, about 36,000 vs. 25,000, respectively. Though, Ionic has more questions on Stackoverflow than React Native. They also inherit the community they are based on, namely Angular and React. We can safely say that they both have a very healthy ecosystem.

Supported platforms

Both Ionic and React Native support Android and iOS. And for bonus points, Windows Universal Platform support officially comes with Ionic 2, and is currently maintained as a separate plugin for React Native.

React Native vs Ionic: Which is better?

I can’t tell you which is better because I firmly believe that it depends on many factors: you, your project, your user requirements, the acquired skills of your team, etc. They both do different things, and both do it well. It’s like comparing an Xbox and a Playstation, MacOS and Windows, a car and a motorcycle. Neither is better than the other.
However, I can tell you which one I prefer. It is React Native. I personally value the native rendering more than the rest. To me, apps need to be extremely fast and responsive, and in React Native, I have found a good compromise between writing pure native applications, or pure hybrid apps.
Now, my best advise to you is to try them out both, pick one, and make the best out of it!
Psst. If you’re interested in a code comparison, I wrote a very simplistic todo app for both Ionic and React Native on Github.

0 nhận xét:

NodeJS Xu hướng lập trình hiện nay. (PHP vs Nodejs)

11:16 HungPV7 Blog 1 Comments

Lịch sử Node.js tóm tắt
Node.js được Ryan Dahl giới thiệu 2009 cho phép lập trình JavaScript phía server. Trước đây JavaScript chỉ được coi là một ngôn ngữ đơn giản tạo hiệu ứng hoạt hình, tương tác phía trình duyệt. Cho đến khi Google Chrome sử dụng V8 engine, một bộ dịch, thực thi mã JavaScript nhanh nhất thế giới tính đến nay. V8 được viết bằng C/C++, mã nguồn mở, cho phép bên thứ 3 toàn quyền sử dụng, triển khai trên hệ điều hành khác nhau: Windows, Linux, Unix, MacOSX. Node.js được xây dựng trên V8 và thư viện LibUV cho phép lệnh thực thi hiện tại không ngăn các lệnh kế tiếp chạy luôn: cơ chế Non-Blocking I/O.

Cơ chế Non Blocking I/O giúp máy chủ tạo ít process (hoặc thread) hơn, ít phải luân chuyển giữa các thread để xử lý các tác vụ. Máy chủ web Nginx cũng là một ví dụ tốt Non Blocking I/O chạy tốc độ vượt trội, tốn ít bộ nhớ so với máy chủ Apache sử dụng thread switching và thread pool để hứng, xử lý các yêu cầu.
Khi tiến hành nhiều phép đo đạc tốc độ trên môi trường máy ảo giống hệt nhau về cấu hình, chúng tôi nhận thấy một thực tế không thể chối cãi, web site viết trên Node.js + Express luôn chạy nhanh hơn 1.5 - 2.5 lần web site PHP + Phalcon cùng cấu trúc, cùng hệ cơ sở dữ liệu, cùng cấu hình máy ảo. Trong nhóm các framework PHP, Phalcon luôn là đứng đầu bảng về tốc độ. Tốc độ xử lý của Phalcon trong vài trường hợp còn nhanh hơn cả HHVM. 
Có một số ý kiến cho rằng: hiện nay chi phí thuê máy chủ ngày càng rẻ. Chỉ với 20$/tháng, đã có thể thuê một máy chủ ảo hóa 2 core 3.4 GHz, 2 GRAM DDR3, 40 G ổ cứng SSD, rẻ hơn so với năm 2012 khoảng 4 lần. Vậy nếu PHP là một ngôn ngữ phổ biến dễ học, có rất nhiều framework tuyệt vời như WordPress, Joomla, Drupal, Magento, có sẵn các theme giao diện tuyệt đẹp chỉ mất khoảng 40 - 120 USD, người dùng có mọi thứ từ một bộ CMS ổn định đến giao diện đồ họa cấu hình là chạy. Tuy nhiên trang web load chậm không phải lúc nào cũng thiếu RAM hay CPU Core. Nếu xử lý không đúng chỗ thì việc bổ xung RAM, hay CPU Core không cải thiện được triệt để.
Thời gian tải trang (page load time) cốt tử cho sự thành bại của doanh nghiệp kinh doanh trên Internet
Thời gian tải trang (page load time) càng nhanh, trải nghiệm người dùng càng tốt, người dùng sẽ xem nhiều trang hơn, xác suất quyết định mua hàng dễ dàng hơn và ngược lại:
  • Hầu hết người duyệt web bỏ cuộc hoặc chuyển qua web site khác nếu phải chờ hơn 6-10 giây
  • Page load time từ 4 giây đã có 25% lượng người duyệt web bỏ đi
  • 1 giây chậm đi khi hiển thị trang, tỷ lệ chuyển đổi thành công từ xem sang đặt hàng (coversion rate) giảm 7%
Tham khảo thêm bài phân tích ở đây SEO 101: How Important is Site Speed in 2014? có thể tóm tắt thêm
  • 51% người mua hàng ở Mỹ phàn nàn web site quá chậm khiến họ không thể đặt hàng.
  • Năm 2010, một trang cần 6 giây để tải thì tỷ lệ chuyển đổi thành công giảm 40%, còn năm 2014, tỷ lệ này giảm sâu hơn còn 50%.
  • 47% người duyệt web muốn trang hiện ra trong vòng dưới 2 giây
  • Khi người dùng sử dụng di động, hành vi chuyển qua lại giữa các ứng dụng, web site càng gấp gáp và ngắn. Người dùng mất tập trung hơn, trang web chậm, giao diện kém thân thiện khiến người dùng nhanh chóng bỏ qua và không bao giờ quay lại lần 2.
PHP ngôn ngữ thống trị thế giới web
  • PHP được Ramus Lerdorf sáng tạo ra năm 1995, cách đây 20 năm. Phiên bản phổ biến hiện nay là 5.6. Bản 6.x gần như sẽ bị bỏ qua mặc dù đã được lên lộ trình và phát triển cách đây vài năm. PHP 7 đã ra mắt tháng 10  2015.
  • Thế mạnh của PHP đó là cộng đồng đông đảo, mã nguồn mở cực kỳ phong phú. Số lượng việc làm cho lập trình viên PHP lớn.
  • PHP dễ học và dễ viết: dev có thể chèn mã PHP cùng với mã HTML. Tư duy lập trình tuần tự, mã HTML của trang web có thể coi là một chuỗi được cộng lại rồi trả về trình duyệt
  • Web site PHP chạy tốt trong môi trường shared hosting. Một web server có thể  chứa nhiều web site con, có tên miền riêng biệt để giảm chi phí.
Điểm yếu của PHP có thể khiến PHP thoái trào hoặc ít nhất cho Node.js cơ hội vượt lên
  • PHP không hỗ trợ non blocking sẵn mà phải sử dụng một số thư viện như React đã rất cũ. Tư duy lập trình tuần tự blocking rất dễ với người mới học, dễ debug, nhưng rất tệ khi xử lý các tác vụ tốn thời gian, buộc các tác vụ kế tiếp phải đợi
  • PHP không hỗ trợ sẵn web socket mà phải sử dụng thư viện ngoài như Rachet không đảm bảo chạy trên tất cả các hệ điều hành. Việc không hỗ trợ lập trình Web Socket, real time notification, chat, khiến cho web site PHP buộc phải sử dụng công nghệ ngoài để hỗ trợ, và thường là Node.js, Socket.io hoặc mua dịch vụ ngoài như Zopim Chat
  • Callback được giới thiệu trong PHP 5.4 . Nhưng hầu hết lập trình PHP vẫn viết web site theo phương pháp cổ điển, tuần tự từ trên xuống dưới.
  • Rất nhiều lập trình phàn nàn về tốc độ thực thi của PHP. FaceBook sáng tạo ra HHVM để biên dịch mã PHP ra bytecode tương tự như Java - Java Virtual Machine. Phalcon viết thư viện framework bằng C biên dịch ra extension. Những cố gắng này rõ ràng được đền đáp trong một số trường hợp, nhưng nó không giải quyết hết gốc rễ của lập trình blocking. Trong công ty, có một nhân viên rất giỏi, xử lý công việc rất nhanh, ai cũng phải hỏi ý kiến anh ta, việc nào cũng đến tay anh ta, một ngày kia, nhân viên giỏi này bị ốm, hoặc có quá nhiều việc dồn dập đến, mọi nhân viên khác đều phải chờ đợi.
So sánh tốc độ PHP web site vs Node.js web site 
Hiện giờ chưa có nhiều benchmark nghiêm túc, công bằng để so sánh PHP vs JavaScript - Node.js. Vì trải nghiệm người dùng về tốc độ hiển thị trang web là quan trọng nhất, việc so sánh khập khiễng gây tranh cãi mất thời gian. Tôi cố gắng sử dụng các công nghệ hỗ trợ giống hết nhau, trên máy chủ giống hệt về cấu hình, tạo ra một lượng dữ liệu đủ lớn 50,000 bản ghi, một web site đủ độ phức tạp gồm khác với những các benchmark trước đây khá cẩu thả chỉ trả về một chuỗi Hello World đơn giản rồi dùng Apache Benchmark. Web site 2 đội cùng viết là gồm 100 category, mỗi category có 500 mặt hàng, có phân trang, có ảnh riêng cho từng mặt hàng.... Với Node.js site.

HungPV

1 nhận xét: