Chiều rảnh rổi ngồi code vu vơ vài dòng thế là ra được cái chương trình tán gái phong cách developer :D Chương trình này sẽ tự động mở notepad và tự động “viết vu vơ” vài dòng tâm trạng gửi tới người thương, Để tăng phần ảo diệu thì chương trình còn giả lập tiếng gỏ phím tạch tạch tạch nữa :D
Showing posts with label cpp. Show all posts
Showing posts with label cpp. Show all posts
1/14/18
5:32 PM
7/26/16
3:50 PM
Lâp trình OpenGLES - Phần 7
Nối tiếp phần 6 toàn lý thuyết về texture, phần này sẽ hướng dẩn bạn cách sử dụng những kiến thức đó vào code. Chú ý rằng texture, shader hay model đều được mình viết trong các class để dể quản lý sau này.
7/23/16
4:59 PM
Lâp trình OpenGLES - Phần 6
Phần trước mình đã hướng dẩn các bạn cách load nhân vật từ file .nfg(định dạng .got chúng ta sẽ tìm hiểu sau) nhưng nhân vật load lên còn chưa có "da", trông trắng bệch còn hơn bạch tạng. Bài này và bài tiếp theo sẽ hướng dẩn cách "đắp da" cho nhân vật.
Mình cũng xin nói luôn, loạt bài viết này sẽ không phù hợp với những bạn thiếu kiên nhẫn. Có thể đến phần 10, 11, 12 hoặc xa hơn nữa mà bạn vẩn chưa thấy "game" đâu cả. Vì đây không phải là fast food đây là chicken stew. Bạn có thể chọn đồ ăn nhanh nếu bạn không có thời gian như Unity hay Cocos2d. Còn loạt bài viết này là món gà hầm bổ dưỡng nhưng bạn thật sự phải xăng tay áo lên và vào bếp đấy, sẽ tốn chút nhiều thời gian nhưng cũng đáng để đầu tư lắm :)).
Hơi bị dài dòng rồi, let's go!
Mình cũng xin nói luôn, loạt bài viết này sẽ không phù hợp với những bạn thiếu kiên nhẫn. Có thể đến phần 10, 11, 12 hoặc xa hơn nữa mà bạn vẩn chưa thấy "game" đâu cả. Vì đây không phải là fast food đây là chicken stew. Bạn có thể chọn đồ ăn nhanh nếu bạn không có thời gian như Unity hay Cocos2d. Còn loạt bài viết này là món gà hầm bổ dưỡng nhưng bạn thật sự phải xăng tay áo lên và vào bếp đấy, sẽ tốn chút nhiều thời gian nhưng cũng đáng để đầu tư lắm :)).
Hơi bị dài dòng rồi, let's go!
7/21/16
2:23 PM
Pragma: pack keyword
Đây là keyword quy định giá trị Alignment cho các trường trong struct, union hoặc class. Mình có một bài viết về struct alignment tại đây bạn có thể tham khảo lại để hiểu rỏ hơn ý nghĩa của từ khóa pack trong bài viết này.
Cú pháp:
Cú pháp:
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )
7/18/16
5:08 PM
Lâp trình OpenGLES - Phần 5
Phần 4 chúng ta đã tìm hiểu về cách vẽ một số hình đơn giản bằng OpenGL sử dụng VBO và glDrawArrays. Phần tiếp theo sẽ hướng dẩn các bạn cách vẽ khác sử dụng IBO và glDrawElements. Với cách mới, bạn có thể sử dụng lại các vertex để vẽ các hình khác, việc này làm giảm rất nhiều dung lượng bộ nhớ cần lưu trữ cho các vertex. Đối với các hình đơn giản thì việc này không có ý nghĩa gì, nhưng với các nhân vật hoặc các hình phức tạp hơn, số vertex lên trến hàng nghìn thậm chí hàng triệu thì quả là một sự khác biệt lớn đấy. Ngoài ra mình cũng sẽ giới thiệu các bạn cách load hình từ file để có thể vẽ được những hình phức tạp. Vì mục đích nguyên cứu nên file mình đề cập sẽ có cấu trúc dạng text(không tối ưu cho kích thước và bảo mật) dể đọc, dể chỉnh sửa.
7/14/16
4:13 PM
Lâp trình OpenGLES - Phần 4
Sau khi tìm hiểu sơ lượt về shader và vertex trong phần 3, phần tiếp theo này sẽ hướng dẩn các bạn cách vẽ một hình đơn giản bằng opengl. Thực ra để vẽ hình đơn giản này thì bạn không cần dùng đến opengl, chỉ cần sử dụng một thư viện đơn giản như winbgim để vẽ. Nhưng để xây dựng một game đủ lớn với các nhân vật được nạp từ file thì bạn không thể sử dụng winbgim được nữa, lúc này opengl đủ sức để "cân" các nhân vật game này. Trong bài viết này mình chỉ hướng dẩn cách vẽ hình bằng VBO vì nó chỉ cần đẩy dữ liệu vertex đi một lần duy nhất nhờ đó tăng tốc độ vẽ.
2:36 PM
Lâp trình OpenGLES - Phần 3
Ở phần trước bạn đã tìm hiểu xong về cách tạo một cửa sổ cũng nhu một số sự kiện trong game, đọc lại ở đây. Ở phần này sẽ khái quát qua 2 khái niệm cực kỳ quan trọng trong lập trình opengl đó là shader và vertex. Vậy shader là gì? Cách định nghĩa vertex như thế nào?...tất cả sẽ được giải đáp ngay bên dưới.
7/11/16
4:42 PM
Tự viết một spyware cho riêng mình - Lưu trữ
Phần 3 mình đã giới thiệu qua về cách sử dụng các hàm API của Windows để chụp ảnh màng hình, các bạn có thể đọc lại ở đây. Phần này sẽ hướng dẩn cách lưu trữ dữ liệu tạm thời trong máy victim và cách lưu trữ trên server. Đây chỉ là cách "xôi gà" mà mình nghỉ ra, dĩ nhiên là nó không được tối ưu nhưng nó ít nhiều sẽ cung cấp cho bạn ý tưởng để lưu trữ và xử lý dữ liệu của spy.
1:42 PM
Lâp trình OpenGLES - Phần 2
Ở phần trước mình đã hướng dẩn các bạn tạo và cấu hình một project opengles, các bạn có thể đọc ở đây. Phần này mình sẽ hướng dẩn cách tạo ra cửa sổ để có thể vẽ lên đó vì đơn giản là ta không thể vẽ lên trên console rồi. Phần này không được liệt vô "core" của game vì việc thực thi Window Surface còn tùy thuộc vào từng nền tảng mà game đang chạy trên đó. Ngoài việc tạo cửa sổ mình sẽ giới thiệu qua về một số sự kiện quan trọng trong game mà bạn cần biết để xử lý thích hợp.
7/10/16
3:40 PM
Lâp trình OpenGLES - Phần 1
Sau 1 thời gian nguyên cứu web, app, mobile các kiểu thì thì bây giờ mình lại quây về nguyên cứu về game. Lúc trước mình từng viết 1 số bài lý thuyết về 1 số khái niệm trong OpenGL các bạn có thể đọc thêm ở đây và đây. Phần này mình sẽ hướng dẩn xây dựng project OpenGLES trên nền tảng win32(chỉ mới tạo và cấu hình).
Bây giờ ta sẽ tiếp cận theo cách động đến đâu giải thích đến đó chứ ngồi nói một tràng lý thuyết suông thì chán lắm :))
7/5/16
1:07 AM
Kết thúc tiến trình
Qua các bài viết trướt thì bạn đã biết cách tạo mới một tiến trình sử dụng fork rồi. Bây giờ ta sẽ tìm hiểu về các các để kết thúc một tiến trình. Ta có thể kết thúc một cách chủ động hay thụ động hoặc chờ một tiến trình kết thúc. Tùy vào từng trường hợp cụ thể ta có thể lựa chọn giải pháp thích hợp cho chương trình của mình.
12:43 AM
Tạo mới tiến trình với exec
Như đã biết thì hàm fork() sẽ tạo mới một tiến trình con bởi việc “sao chép” lại tiến trình cha. Nghĩa là nó sẽ thực thi lại chính chương trình cha đã tạo ra nó, kiểu như cha nào con nấy. Nhưng thực tế không phải lúc nào chúng ta cũng muốn “cha nào con nấy”, đôi lúc thì con sinh ra phải giống “ông hàng xóm” chứ :)). Bài viết này mình sẽ hướng dẩn cách tạo mới tiến trình con rồi thực thi mới một chương trình khác thay vì thực thi lại chương trình cha đã tạo ra nó.
12:20 AM
Tạo mới một tiến trình con(child process) bằng fork
Có lẻ các bạn đã quen với Windows, hệ điều hành máy tính phổ biến nhất thế giới. Windows được ưu chuộn vì dể sử dụng, sự hổ trợ mạnh mẻ của các hảng phần mềm, trò chơi.... Và vì vậy hệ điều hành này nắm vị trí độc tôn trên nền tảng máy tính cá nhân. Một đối thủ truyền kiếp của Windows là Linux đang ngày càng một phát triển mạnh mẽ, không chỉ hướng tới việc cung cấp nền tảng hệ điều hành cho server mà còn hướng tới người dùng cá nhân. Như các bạn đã biết, Linux là tên gọi của một hệ điều hành máy tính và cũng là tên hạt nhân của hệ điều hành. Nó có lẽ là một ví dụ nổi tiếng nhất của phần mềm tự do và của việc phát triển mã nguồn mở[1]. Trái ngược hoàn toàn với việc độc tôn của Windows, Linux cho phép các nhà phát triển từ do sử dụng mã nguồn, tự do phân phối... góp phần mở ra kỷ nguyên mà nguồn mở.
6/29/16
2:48 PM
Tự viết một spyware cho riêng mình - Capture screen
Phần 2 chúng ta đã xây dựng xong keylog, phần tiếp theo chúng ta sẽ cùng tìm hiểu cách chụp ảnh màng hình máy tính, đây cũng là một trong những tính năng khá quan trọng của spy. Các lý thuyết về phần này như Device Context(DC), PICTDESC, BITMAP trong Windows các bạn có thể đọc ngay trên trang chủ để biết thêm chi tiết. Mình sẽ nói về 2 bước chính để thực hiện đó là chụp ảnh màng hình và lưu ảnh đã chụp vào file.
6/27/16
6:23 PM
Tự viết một spyware cho riêng mình - Keyboard hooking
Phần 2 này sẽ hướng dẩn các bạn cách sử dụng keyboard hooking để ghi lại các phím mà người dùng đã nhấn. Đây cũng chính là một trong những tính năng quan trọng nhất của con spy mà chúng ta đang xây dựng. Các lý thuyết về hook nói chung và keyboard hooking trong Windows nói riêng đều có ở phần 1 hoặc bạn có thể search thêm trên google để tìm hiểu kỷ hơn về phần này. Để thực hiện hook bàn phím, mình chia ra 4 giai đoạn và sẽ được lần lượt đề cập bên dưới.
6/25/16
3:12 PM
Tự viết một spyware cho riêng mình - Tổng quan về badspy project và lý thuyết keyboard hooking
Một kỹ thuật khá hay trong Windows đó chính là hooking, chính Unikey mà ta thường dùng hằng ngày hay các chương trình keyloger cũng sử dụng kỹ thuật này. Vậy hook là gì? làm sao để sử dụng nó? câu trả lời sẽ có ngay tại đây :)). Loạt bài này mình sẽ hướng dẩn các bạn viết một con spy(not just keylog), thật ra mình cũng chỉ mới nguyên cứu về chủ đề ngày trong đồ án môn học kỳ vừa rồi nên mọi thứ đều chỉ mới ở mức beginner mà thôi :)). Toàn bộ source code của con spy(mình đặt tên là badspy) này đều có ở link cuối bài viết này, nếu bạn muốn có thể đọc tham khảo. Nội dung hôm nay chúng ta sẽ tìm hiểu về keylog(phần lý thuyết), một trong những chức năng quan trọng của spy(đây thực ra chỉ là nội dung mình copy nguyên si từ bài báo cáo ra thôi :v).
6/13/16
2:37 PM
Ghi log trong C++
Trong lúc làm đồ án có động đến việc ghi log để phục vụ debug nên phải viết ra cái tiện ích nho nhỏ này, thấy nó cũng hay nên chia sẻ cho các bạn đọc chơi.
Việc ghi log trong C++ thì dự là có nhiều thư viện hổ trợ rồi, cơ mà xài “cây nhà lá vườn” vẩn thích hơn. Log chỉ ghi ra khi ở mode debug và tự động “biến mất” ở mode release vì thế sẽ tối ưu khá nhiều cho performance. Trong tiện ích này mình sử dụng các macro để ghi log, với mode relase thì nó sẽ bị remove hoàn toàn(bước tiền biên dịch) trước khi code chính thức đc biên dịch.
Việc ghi log trong C++ thì dự là có nhiều thư viện hổ trợ rồi, cơ mà xài “cây nhà lá vườn” vẩn thích hơn. Log chỉ ghi ra khi ở mode debug và tự động “biến mất” ở mode release vì thế sẽ tối ưu khá nhiều cho performance. Trong tiện ích này mình sử dụng các macro để ghi log, với mode relase thì nó sẽ bị remove hoàn toàn(bước tiền biên dịch) trước khi code chính thức đc biên dịch.
11:58 AM
Class C++ và CreateThread Win32 API
Làm thế nào để thực thi một hàm non-static của class trong 1 thread?
Như các bạn đã biết, hàm CreateThread cần biết địa chỉ của hàm mà nó sẽ thực thi khi thread chạy(The starting address for a thread) và dĩ nhiên hàm này phải là hàm tỉnh(static function), bạn phải khai báo static nếu là class member hoặc khai báo bên ngoài class như C style.
Như các bạn đã biết, hàm CreateThread cần biết địa chỉ của hàm mà nó sẽ thực thi khi thread chạy(The starting address for a thread) và dĩ nhiên hàm này phải là hàm tỉnh(static function), bạn phải khai báo static nếu là class member hoặc khai báo bên ngoài class như C style.
6/11/16
7:37 PM
Cách khác để sao chép hoặc clear nội dung thực thể trong C++
Như đã biết thì việc sao chép nội dung của các thực thể của class trong C++ được thực hiện bằng copy contructor hoặc toán tử gán, đối với một số lớp đơn giản thì ta có thể không cần thực thi lại tụi này làm gì. Đối với các lớp có chứa con trỏ thì hầu hết trường hợp ta phải định nghĩa lại để có thể copy vùng nhớ mà con trỏ trỏ đến. Trong bài viết này mình không đi cụ thể vào cách xây dựng copy constructor hay nạp chồng toán tử gán, mình sẽ hướng dẩn các bạn một cách khác để copy nội dung của thực thể này sang thực thể khác mà không cần sử dụng đến copy constructor hay toán tử gán cũng như cách clear nội dung các trường của một thực thể một cách nhanh chóng. Dĩ nhiên cách này vẩn không thể thay thế hoàn toàn được phương pháp nạp chồng toán tử gán hay thực thi lại copy constructor, nó chỉ đơn giản là cung cấp một giải pháp khác cho bạn. Chú ý rằng các phương pháp này sẽ không thể sử dụng nếu trong class có định nghĩa các virtual method hoặc chứa các trường là con trỏ.
6/10/16
4:20 PM
Một cách khác để cấp phát bộ nhớ động trong C++
Như các bạn đã biết thì việc cấp phát bộ nhớ động sẽ tốn một khoản thời gian và cũng có thể sẽ xảy ra trường hợp việc cấp phát thất bại vì không đủ bộ nhớ chẳng hạn. Để giải quyết vấn đề này ta có thể sử dụng cách cấp phát một vùng lớn bộ nhớ ngay từ ban đầu, sau đó ta chỉ việc trỏ đúng vị trí và ép kiểu nó sang các kiểu tương ứng là được. Ví dụ thế này: bạn cần mua một số mảnh đất để trồng trọt, việc mua đất sẽ tùy vào mùa màng và thời tiết mà bạn sẽ quyết định mua thêm để trồng các loại cây khác nhau hoặc bán bớt đất. Việc mua và bán đất dĩ nhiên sẽ làm bạn tốn một khoản thời gian để làm giấy tờ các kiểu, có khi đất trống không sẵn có để bạn mua nữa. Để giải quyết vấn đề này, bạn quyết định mua luôn một vùng đất lớn, khi bạn muốn trồng một loại cây A nào đó, bạn chỉ việc xác định vị trí trống còn lại trên vùng đất đã mua kèm theo tổng kích thước cần thiết để trồng loại cây A, từ đó bạn đánh dấu khu đất đó là để trồng cây A. Cứ như vậy bạn có thể xác định các khu đất để trồng các loại cây khác dựa trên vùng đất lớn đã mua.
Subscribe to:
Posts
(
Atom
)

