React Native Game - Memorize Cards Game
Albert Pham April 16, 2021 Game, Projects, React, React Navtive
How big is your memory capacity? Try to remember these cards as much as possible and you will get the longest term memory. Let install and play Memorize Cards game
This is an application to form the mind. The cards will be shown in 3 seconds, and your mission is to find the cards you have seen before.
IOS: https://apps.apple.com/vn/app/memorize-cards-game/id1562798399
Google play store: https://play.google.com/store/apps/details?id=com.cardmemorize
Other game:
Virus Fighter - Kẻ diệt virus (Unity)
Android version:
https://play.google.com/store/apps/details?id=com.vnplayingcard.VirusFighter
Virus Fighter - Kẻ diệt virus (Unity)
Albert Pham March 11, 2021 Game, Projects
Virus Fighter - Kẻ diệt virus (Unity)
Virus Fighter had been written by Unity C#, Go ahead and try to see how many viruses you can kill.
Android version:
https://play.google.com/store/apps/details?id=com.vnplayingcard.VirusFighter
IOS:
Naming issue (Virus) not able to upload to apple store.
How to play
Đôi chút về Mắt Biếc
Albert Pham January 04, 2020 Chuyen Linh Tinh
Giấc mờ tàu điện ngầm
Albert Pham December 31, 2019 Chuyen Linh Tinh
Một số thay đổi trong React lifecycle version 16.3, 16.4
Albert Pham September 16, 2019 React, React Navtive, ReactJs, Tech
Lifecycle rất quan trọng trong việc xử lý, thường khi xử lý vấn đề gì liên quan tới lifecycle thì mình thường đặt câu hỏi when và where. Tùy thuộc vào từng giai đoạn từng tính chất của yêu cầu mà chúng ta xử lý ở lifecycle method khác nhau.
Ở đây mình ko đi chi tiết các methods của react lifecycle. Mình chỉ đưa ra các thay đổi trong react release gần đây.
II. Giới thiệu
Trong react thì mỗi component trong react đều có lifecycle như nhau, và lifecycle của react được chia thành 3 phần chính: mounting, updating và unmounting.
Refer link: http://projects.wojtekmaj.pl/reactlifecyclemethodsdiagram/
Mounting: Khi component được tạo và add vào DOM.
Thứ tự các methods:
Ở các phiên bản trước còn có thêm method “componentWillMount” nhưng từ bản cập nhật sau này nó đã được bỏ đi và được rename thành “UNSAFE_componentWillMount()”, và nó vẫn còn work cho đến version 17.
Unmounting: Bắt đầu remove component ra khỏi DOM.
Unmounting thì chỉ có 1 method là
Updating: xẩy ra khi props hoặc state thay đổi
Thứ tự các methods sẽ là:
- static getDerivedStateFromProps()
- shouldComponentUpdate()
- render()
- getSnapshotBeforeUpdate()
- componentDidUpdate()
Cũng tương tự như componentWillMount, thì componentWillUpdate và componentWillRecieveProps sẽ được bỏ đi trong thời gian tới, và hiện tại vẫn work cho đến version 17 với tên là:
III. Thay đổi
Thường thì tùy vào mục đích mà chúng ta xử lý ở mỗi event khác nhau. Ở version react 16.3 đã giới thiệu một số vòng đời mới nhằm thay thế cho các method cũ, để cung cấp hỗ trợ tố hơn cho bản chất không động bộ asynchronous của react.
- getDerivedStateFromProps
Nếu như ai đã từng làm react từ version 16.3 trở về trước thì có thể nó tương đồng với componentWillReceiveProps, getDerivedStateFromProps nó sẽ được invoked khi component nhận các props mới. Nhưng tới version 16.4 nó được invoked cả ngay sau khi setSate() or forceUpdate().
Nó nhận trách nhiệm đảm bảo state và props được đồng bọ, khi được yêu cầu, và nó được thay thế cho componentWillReceiveProps .
Ví dụ
Function getDerivedStateFromProps được invoked khi component đã mounted, hoặc khi nhận props mới (16.3), setstate(), foreUpdate() (16.4). Và nó sẽ được gọi nếu như parent component rerender lại. Tham số của method này là tất cả props được thay đổi gọi là nextProps, thường thì chúng ta cũng có thể so sánh giá trị hiện tại và giá trị sẽ nhận trong method này.
Ở ví dụ trên nếu như giá trị của chosen mới nhận khác với giá trị hiện tại thì chúng ta tiến hành thay đổi state, giảm tránh việc rerender lại (after setstate) component nếu như giá trị mới và giá trị hiện tại là như nhau.
Do tính chất là sẽ được gọi khi nhận prop mới, nên có thể method này được gọi nhiều lần cho single update. Để tránh việc render nhiều lần thì chúng ta có thể thực thi update một lần.
- ComponentDidMount
Ở method này thường dung để load data, call API… Ví dụ dưới chúng ta fetch data từ API:
- getSnapshotBeforeUpdate(prevProps, prevState)
- Depprecate functions các chức năng không được sử dụng nữa
- componentWillReceiveProps— UNSAFE_componentWillReceiveProps
- componentWillUpdate— UNSAFE_componentWillUpdate
IV. Kết
Tobe continues
Thì của động từ part 2 - Thì hiện tại đơn - the simple present tense
Albert Pham March 03, 2018 English, Grammar, Learning Enlgish
Thì hiện tại đơn - The simple present tense
Cách dùng:
- Diễn tả hành động xẩy ra ngay lúc nói
- Diễn tả chân lý sự thật hiển nhiên
The sky is blue.
- Diển tả thói quen, hành động xẩy ra thường xuyên
My brother plays the piano every morning.
Cấu trúc
Thể khẳng định
Subject + Vs/es + O
I am a pie lover
Thể phủ định
Subject + tobe + not + [root form of verb] + [O]
Or
Subject + do/does + not + [root form of verb] + [O]
I am not a pie lover
Thể nghi vấn (Question)
[What/how/why..] + [subject] + [root form of verb] + [O]
Or
Do/does + [subject] + [root form of verb] + [O]
Do you know how to bake a pie?
How much does Pauline love pie?
Trạng từ (Advert) thường dùng trong thì hiện tại đơn:
always, every, usually, often, generally, frequently
To be
Các động từ tobe dùng trong thì hiện tại đơn
I + am / am not
We/ They / Ns (danh từ số nhiều) + are / are not
He / She/ It + is/ is not
Do / does
I/
Khi nào dùng to be khi nào dùng trợ động từ do/does
Trong thì hiện tại đơn, thì quá khứ đơn ta dùng trợ động từ do/does khi trong câu có 1 đồng từ chính khác
Example:
Do you think kids are cute? / Do you want to have kids someday? / Does the boy tease the girl often?
Động từ chính là phần được tô đậm
Và ngược lại thì dùng động từ to Be khi trong câu không có động từ
Are these kids cute? Are these kids typical kids? Are these kids in trouble?
Vs/es là gì
Ở thì hiện tại đơn hầu hết các động từ ở thể nguyên thể không chia, trừ ngôi thứ 3 số ít thì thêm s phía sau động từ.
Example: He/she/it writes
Ngôi thứ nhất với ngôi thứ 2 số nhiều thì giữ nguyên động từ.
Example: I / you / we/ they
Nhưng có một số động từ thêm es thay vì thêm s.
Các động từ nguyên thể kết thúc bằng: O, CH, SH, TH, SS, GH, Z, khi kết hợp với ngôi thứ 2 số ít thì ta thêm es vào sau.
Ví dụ động từ Go
He/ She/ it + goes
Các động từ phổ biến:
Infinitive
|
I, You, We, They
|
He, She, It
|
to ask
|
ask / do not ask
|
asks / does not ask
|
to work
|
work / do not work
|
works / does not work
|
to call
|
call / do not call
|
calls / does not call
|
to use
|
use / do not use
|
uses / does not use
|
to have
|
have / do not have
|
has / does not have
|
Các từ dùng trong bài viết:
Vocabularies | Meaning |
Simple present tense | Thì hiện tại đơn |
Verb | Động từ |
Noun | Danh từ |
Infinitive | Nguyên mẫu |
Advert | Trạng từ |
Tease | Trêu chọc |
First-person singular | Ngôi thứ nhất số ít (I) |
Second-person singular | Ngôi thứ 2 số nhiều (you) |
Third-person singular | Ngôi thứ 2 số ít (She/he/it) |
First-person plural | Ngôi thứ nhất số nhiều (We) |
Second-person plural | Ngôi thứ 2 số nhiều (you) |
Third-person plural | Ngôi thứ 3 số nhiều (They) |
Thì của động từ part 1
Albert Pham February 27, 2018 English, Grammar, Learning Enlgish, Tenses
Thì quá khứ dùng miên tả nhừng hành động xẩy ra trong quá khứ (Giờ trước, ngày hôm qua...)
Chi tiết ở bài sau
- Thì quá khứ đơn
Last night, I read an entire novel.
I watched TV last night. - Thì quá khứ hoàn thành
I had read at least 100 books by the time I was twelve.
I had watched Harry potter last year. - Thì quá khứ tiếp diễn
I was reading Edgar Allan Poe last night. - Thì quá khứ hoàn thành tiếp diễn
I had been reading for at least a year before my sister learned to read.
- Thì hiện tại đơn
I watch TV every morning.
I read nearly every day. - Thì hiện tại hoàn thành
I have watched so many TVs show.
I have read so many books I can’t keep count. - Thì hiện tại tiếp diễn
I am reading Shakespeare at the moment. - Thì hiện tại hoàn thành tiếp diễn
I have been reading since I was four years old.
- Thì tương lai đơn
I will watch the TV on tonight.
I will read as much as I can this year.I will read as much as I can this year. - Thì tương lai hoàn thành
I will have watch TV show tonight
I will have read at least 500 books by the end of the year. - Thì tương lai tiếp diễn
I will be reading Nathaniel Hawthorne soon. - Thì tương lai hoàn thành tiếp diễn
I will have been reading for at least two hours before dinner tonight.
Thư viện MapOnly
Albert Pham May 29, 2017 MapOnly, Mapping
Hiện tại MapOnly chưa hỗ trợ mapping giữa các listing khác kiểu, nên mình để version 0.0.1. Có thời gian thì mình sẽ xem xét thêm các tính năng khác và hoàn thiện nó hơn và nâng version lên bản chính thức có version 1.0.0.
Dependences
Phiên bản 0.0.1 tương thích với .Net Framework > 4.6.1, .Net standard 2.0 và .Net CoreSetting, cài đặt
Cách thức cài đặt thì cũng giống như các thư viện khác, tải trực tiếp trên site nuget hoặc là cài đặt bằng lệnhInstall-Package MapOnly
Hoặc có thể sử dụng nuget manager search và installHướng dẫn
IOC - Inversion of Control
Albert Pham April 02, 2017
- Inversion of Control (IoC),
- Dependency Inversion Principle (DIP),
- Dependency Injection (DI),
- IoC containers.
IoC, DIP là high level design principle, nên chúng được sử dụng trong việc design lớp ứng dụng, chúng không cung cấp bất cứ chi tiết implementation cụ thể nào.
Có thể hiêu IoC thông qua ví dụ dưới đây:
Giả sử A đi làm bằng car, A tự lái xe tới công ty nghĩa là A control car. Nguyên tắc IoC là đảo ngược điều khiển, nghĩa là thay vì tự lái xe, A thuê taxi, sẽ có một tài xế lái xe. Do đó, điều này được gọi là IoC - đảo ngược điều khiển - từ A đến tài xế taxi. A không phải tự lái xe và A có thể để tài xế lái xe, A có thể tập trung vào công việc chính của mình.
III. Sử dụng factory pattern
Factory Pattern
Ở đây mình có 2 class là CustomerBusinessLogic và 1 lớp DataAcces như bên dưới:
public class CustomerBusinessLogic
{
DataAccess _dataAccess;
public CustomerBusinessLogic()
{
_dataAccess = new DataAccess();
}
public string GetCustomerName(int id)
{
return _dataAccess.GetCustomerName(id);
}
}
public class DataAccess
{
public DataAccess()
{
}
public string GetCustomerName(int id) {
return "Dummy Customer Name"; // get it from DB in real app
}
}
Lớp CustomerBusinessLogic phụ thuộc vào lớp DataAccess. Nó sẽ tạo ra 1 đối tượng của DataAccess để sử dụng các method public ở trong lớp DataAccess, cụ thể ở đây là sử dụng method GetCustomerName đẻ lấy dữ liệu khách hàng (customer data).
2. Giả sử dữ liệu khách hàng đến từ những database khác nhau hoặc là từ một web service nào đó, trong tương lai, có thể chúng ta cần tạo ra những class khác nhau. Vì thể nó sẽ ảnh hưởng tới sự thay đổi trong lớp CustomerBusinessLogic.
3. Lớp CustomerBusinessLogic tạo ra 1 đối tượng của lớp DataAccess, sử dụng từ khóa new. Có thể có nhiều lớp sử dụng lớp DataAcess và tạo ra đổi tưởng của nó. Nếu như thay đổi tên class thì chúng ta cần tìm tất cả các class có sử dụng DataAccess để sửa. Đây là là đoạn code lặp đi lắp lại đẻ tạo ra đối tượng của cùng một lass và duy trì sự phụ thuộc.
4. Bởi vì lớp CustomerBusinessLogic tạo ra một đối tượng của lớp DataAccess. Nó không thể test độc lập (TDD). Lớp DataAccess không thể thay thể với 1 mock class (có thể tìm hiểu mock test).
Để giải quyết những vẫn đề trên và nới lỏng liên kết. Chúng ta có thể sử dụng IoC và DIP principle (bài sau) cùng nhau. Nên nhớ, Ioc là một principle, không phải là một Pattern. Nó chỉ cung cấp high-level desig nhưng không cung cấp chi tiết implemenetation (thực thi). Chúng ta có thể tự do implement IoC principle theo cách mà chúng ta muốn.
Pattern implement của Ioc:
Đầu tiên tạo một lớp Factory trả về một đối tượng của DataAccess như bên dưới:
public class DataAccessFactory
{
public static DataAccess GetDataAccessObj()
{
return new DataAccess();
}
}
Bây giờ sử dụng lớp Factory trong lớp CustomerBusinessLogic để lấy đối tượng DataAccess.public class CustomerBusinessLogic
{
public CustomerBusinessLogic()
{
}
public string GetCustomerName(int id)
{
DataAccess _dataAccess = DataAccessFactory.GetDataAccessObj();
return _dataAccess.GetCustomerName(id);
}
}
Như chúng ta thấy lớp CustomerBusinessLogic sử dụng method DataAccessFactory.GetCustomerDataAccessObj() để lấy đối tượng của lớp DataAccess thay vì sử dụng từ khóa new, Do vậy, chúng ta đã đảo ngược điều khiển việc tạo ra một đối tượng của một lớp phụ thuộc từ CustomerBusinessLogic sang lipws DataAccessFactory. Đây là một ví dụ đơn giản về IoC và bước đầu để đạt được hướng tới thiếu kế loose coupled. Chúng ta sẽ không hoàn toàn tách các lớp phụ thuộc, nới lòng chỉ bằng cách sử dụng IoC. Và kèm với IoC thì chúng ta cần sử dụngDIP, Strategy pattern, và DI (Dependency Injection).Lưu ý dùng DateDiff trong sql server
Albert Pham June 24, 2016 Sql, Sql Server
Vấn đề
Một ngày đẹp trời nọ, có bài toán tính số tháng giữa 2 ngày tháng cho trước. Mình hớn hở tự tin trong sql server có datediff by month có thể giảu quyết được tất. Nhưng không phải như vậyBài toán 1
Tính số tháng giữa 2 ngày, nhưng khác tháng.
Ở hình trên mình lấy ví dụ 1 là tính tháng từ ngày 1/1/2016 cho tới hết năm là ngày 31/12/2016 kết quả khi mình xài DATEDIFF là 11
Và ví dụ 2 mình tính số tháng từ ngày 15 tháng 3 năm 2015 tới ngày 14 tháng 4 năm 2016 thì kết quả là 12.
SELECT DATEDIFF(DAY,'2016/1/1', '2016/12/31'), DATEDIFF(MONTH,'2016/3/15', '2017/3/14')
Mặc dù nếu tính theo ngày thì sẽ cho ra cùng một kết quả là 356 ngày
Thế vấn đề đây là gì, phải chăng là function datediff theo tháng bị sai.
(còn tiếp...)
Seri Sql: #4 Sql Cơ bản mệnh đề WHERE (Stop basic sql)
Albert Pham June 18, 2015 Seri hướng dẫn SQL, SQL căn bản
Syntax
SELECT FROM and WHERE condition (file operator value)
Khi dùng câu lệnh select from thì kết quả trả về là toàn bộ bản ghi trong table được chọn. Nhưng không phải lúc nào mình cũng lấy hết dữ liệu để hiện thị lên. Để lấy giữ liệu của 1 bảng dựa trên 1 điều kiện nào đó thì ta dùng mệnh đề where. Where là mệnh đề dùng để lọc giữ liệu theo một điều kiện nào đó.
Quay về ví dụ của bài trước #3, nếu ở đây yêu cầu là chỉ lấy những dữ liệu có type là Twitter thì ta viết như sau:
SELECT id, type as 'contactType'
FROM supportContacts
WHERE type ='Twitter'
Kết quả trả về 1 dòng dữ liệu thỏa mãn điều kiện
Operators
Các toán tử được dùng trong mệnh đề WHERE: =, <>, >, >=, <, <=, IN, BETWEEN, LIKE, IS NULL or IS NOT NULL.Document: https://en.wikipedia.org/wiki/Where_(SQL)
Stop
Mình nghĩ mình sẽ stop seri Sql cơ bản ở đây không phải là do là hết phần basic rồi mà bởi vì giờ đây có rất nhiều site chất lượng dễ dàng tìm kiếm và rất dễ học.Seri Sql: #3 Câu lênh cơ bản : Select, Hướng dẫn sqlfiddle
Albert Pham June 18, 2015 Seri hướng dẫn SQL, SQL căn bản
Sqlfiddle
Syntax
Cú pháp cơ bản: SELECT và FROM.Câu lênh này dùng để truy vấn dữ liệu từ một nguồn nào đó. thường thì sẽ là 1 table, có thể là 1 function.
Ví dụ ta có 1 table như sau:
CREATE TABLE supportContacts
(
id integer primary key,
type varchar(20),
details varchar(30)
);
INSERT INTO supportContacts(id, type, details)
VALUES(1, 'Email', 'admin@sqlfiddle.com');
INSERT INTO supportContacts(id, type, details)
VALUES(2, 'Twitter', '@sqlfiddle');
Để thấy dữ liệu cảu table supportContacts thì ta dùng câu truy vấn như sau:
SELECT *
FROM supportContacts
Copy đoạn code này vào SqlFillde để chúng ta thấy được kết quả:
Copy đoạn code tạo table và insert data vào table vào vùng thứ 1. sau đó click vào build Schema để sqlfidle tạo db. Sau đó copy câu lênh select vào textbox ở vùng thứ 3 trong hình. Cuối cùng bấm Run Sql và đợi. Kết quả sẽ hiện thị bên dưới ở vùng thứ 5 trên hình
Trong câu lệnh Select thường yêu cầu lấy những fields nào thì mình sẽ select fields đó, và giữa các fields cách nhau bởi dấu phẩy, Không nên dùng select *
Ví dụ ở đây mình chỉ muốn lấy Id và type thôi, khi đó câu lệnh select sẽ là:
SELECT id, type as 'contactType'
FROM supportContacts
Tên columns khi lấy ra thì mình có thể thay đổi được cú pháp as 'Tên cột'Đối với câu lênh select bình thường(ko tính toán) trong database lưu trữ như thế nào thì sẽ được lấy lên như vậy, câu lệnh select không làm thay đổi dữ liệu khi truy vấn, cho dù mình run nó nhiều lần.
Format
Viết sao cho đẹp? Từ khóa trong Sql thì ko phân biệt hoa thường như một số ngôn ngữ lập trình, nên người ta thường viết hoa từ khóa để rõ ràng, và ứng với mỗi từ khóa thì xuống hàng như mình viết ở trên. Quy ước đặt tên hay viết sao cho đẹp không phải ai cũng giống nhau.Seri Sql: #2 Database và Table
Albert Pham June 17, 2015 Seri hướng dẫn SQL, SQL căn bản
Database
Như phần trước mình có nói Database là tập hợp dữ liệu có hệ thống. Nó hỗ trợ lưu trữ và cho phép thao tác, làm cho việc quản lý dữ liệu dễ dàng hơn.

Table
Một database lưu trữ những đối tượng (object) gọi là tables ( bảng). Một bảng là 1 tập hợp dữ liệu thực thể liên quan và nó được biễu diễn dưới dạng columns và rows ( hàng và cột)
Ví dụ ta có bảng customers bên dưới:
Ví dụ ta có bảng customers bên dưới:
Fields
Trong mỗi bảng chia thành các thực thể nhỏ hơn gọi là fields, tương ứng với columns trong table. Ví dụ fields tỏng bảng customers bên trên là CustomerID, CustomerName, ContactName, Address, City, PostalCode and Country.
Rows
Mỗi bản ghi(record) là mỗi dòng, là mỗi thực thể riêng lẽ trong 1 table.
Naming convention
Có rất nhiều cách đặt tên, có thể ở công ty này đặt theo quy ước này, có thể công ty khác đăt tên theo quy ước khác, tùy theo người design ban đầu. Mục đích của việc đặt tên là đưa về một chuẩn chung, tránh sự lộn xộn, dễ dàng nhận biết mục đích nó là gì. Một số người có thể lấy db mẫu của microsoft: AdventureWorks, đặc điểm của sample này như sau:
Sử dụng tên số ít cho tables và fields
Tên Schema cho tiền tố của bảng tables (Ví dụ: auth.User, master.Category)
Quy tắc Pascal
Sử dụng tên số ít cho tables và fields
Tên Schema cho tiền tố của bảng tables (Ví dụ: auth.User, master.Category)
Quy tắc Pascal
Ví dụ cách đặt tên
Mình thì vẫn lựa chọn đặt tên theo quy tắc pascal, tên table, tên database, tên fields có nghĩa. Với index, khóa ngoại, trigger, function.. thì mình dùng dấu gạch ngang giữa các từ có nghĩa, và luôn luôn có tiền tố đầu
Ví dụ 1 function trong sql server mình thường đặt tên như sau:
fn_news_getCreatedDate
Nhìn vào có thể hiểu nó là 1 function của tin tức và nó làm nhiệm vụ lấy ngày tạo ra tin tức.
fn là viết tắt của function
news: là module tin tức
getCreatedDate: là tên của function
Ví dụ 1 function trong sql server mình thường đặt tên như sau:
fn_news_getCreatedDate
Nhìn vào có thể hiểu nó là 1 function của tin tức và nó làm nhiệm vụ lấy ngày tạo ra tin tức.
fn là viết tắt của function
news: là module tin tức
getCreatedDate: là tên của function
Database name:
Food.News, Food.Data, Food.MasterData
FoodNews, FoodData, FoodMasterData
foodNews, foodData
Trong một hệ thống có thể có nhiều database, thường người ta chia theo domain, ít có ràng buộc tới nhau. để tránh sự phức tạp khi lấy dữ liệu giữa các database.
Ở ví dụ trên có thể thấy, đây là dữ liệu về một hệ thống liên quan tới Food.
FoodNews -> Chứa những tin tức về food
FoodData -> dữ liệu chính, liên quan tơi food
FoodMasterData -> Là chứa những master data, ít bị thay đổi.
Food.News, Food.Data, Food.MasterData
FoodNews, FoodData, FoodMasterData
foodNews, foodData
Ở ví dụ trên có thể thấy, đây là dữ liệu về một hệ thống liên quan tới Food.
FoodNews -> Chứa những tin tức về food
FoodData -> dữ liệu chính, liên quan tơi food
FoodMasterData -> Là chứa những master data, ít bị thay đổi.
Table name
Auth.Users, Food.Categories
Đối với bảng thì mình vấn thích để schema rồi tới table name số nhiều, như vậy mình sẽ thấy nó rõ ràng hơn và phần biệt được giữa các module.
Một số cách đặt tên khác như:
sys_master_holiday
SysMasterHoliday
Thay vì đặt schema thì sẽ đặt prefix bên trước.
Auth.Users, Food.Categories
Một số cách đặt tên khác như:
sys_master_holiday
SysMasterHoliday
Field name
Đối với fields thì mình thường đặt tên như sau:
AccountName
chữ cái đầu mỗi tiếng thì viết hoa.
Cách đặt tên khác:
acountName
acount_name
AccountName
Cách đặt tên khác:
acountName
acount_name