Thông tin nhóm Riêng tư

administrators

Administrators

Danh sách thành viên

  • RE: Clean code in with project example

    @hitech-qb structure khá ổn, cho mình hỏi pattern này là gì vậy bác?

    được đăng trong Blogs
  • RE: Giúp structure cơ bản của một project Rest API

    @Ky-Su-Phan-Mem đã nói trong Giúp structure cơ bản của một project Rest API:

    Hi,

    Mình là một Front-end Mobile developer, dạo này thích đổi gió nên chọn Go và sau một thời gian học Go mình quyết định xây dựng một backend Restful api cơ bản với database MySQL MariaDB.

    Vì là front-end dev nên mình khác bỡ ngỡ với các components/module... của một project Go.

    Xin giúp mình một sample về Structure thông dụng của một project Go - nhất là backend.
    Các frameworks hữu ích...

    Xin chân thành cảm ơn,

    Mình sử dụng GinGonic cho Restful API Server và đang sử dụng skeleton này, khá là clean và dễ hiểu: https://github.com/hyperjiang/gin-skeleton 😁

    được đăng trong Thảo luận chung
  • RE: Có ai đã từng làm việc tại cty Designveloper chưa cho e xin tí review với ạ được đăng trong Chuyện trò linh tinh
  • [Free Version] ImageSearch 2019

    icon.png

    Lời mở đầu

    Như các bạn đã biết, sau thành công từ phiên bản ImageSearch 2016 được lập trình bằng C# của mình trước đây thì phiên bản 2016 này vẫn chưa thực sự làm mình hài lòng với những yêu cầu mà mình mong muốn:

    • Tốc độ xử lý chậm và chậm hơn với những hình ảnh phức tạo hay có kích thước lớn
    • Chưa tương thích với nhiều hệ điều hành khác nhau bởi sử dụng .Net Framewor làm cốt lõi
    • Chưa đáp ứng đủ nhu cầu sử dụng cho việc tìm kiếm nhiều ảnh cùng lúc
    • Tốc độ thực thi còn khá chậm

    Vì thế nên mình đã ấp ủ trong nhiều năm về một phiên bản ImageSearch có thể khắc phục được những nhược điểm trên và mình đã chọn Golang & C cho dự án lần này và kết quả đã đạt được như mong đợi 😜

    Các bạn xem thêm chi tiết ở bài đăng: https://www.facebook.com/groups/autoitscript/2725087497716753

    Trợ giúp từ cộng đồng

    Mỗi feedback và góp ý từ anh em về yêu cầu tính năng, báo lỗi sẽ giúp mình xây dựng một phiên bản v2 tốt hơn cho mọi người (Phiên bản hiện tại là phiên bản free với các tính năng đủ xài).

    Tải và xài ngay và luôn

    Phiên bản free này bao gồm 2 chức năng chính cũng tương tự với các bản ImageSearch/BmpSearch cũ trên forum AutoIt là searchImageFromFilesearchImageOnScreen.

    Chi tiết cách sử dụng, ý nghĩa các tham số sẽ được mô tả trong file Demo mẫu mà mình code bằng AutoIt.

    Link tải: https://1drv.ms/u/s!Ak2-OfmfoaR4hsY86qRgNck0_bZrrQ

    Chúc các bác cuối tuần vui vẻ 😁

    được đăng trong Hộp đen
  • RE: Goroutines - Cách tiếp cận dễ hiểu

    Bài này anh thấy khá chi tiết, đầy đủ kèm ví dụ dễ hiểu với Goroutine, em tham khảo xem nha: https://vgolang.com/topic/37/bài-22-cơ-chế-truyền-dữ-liệu-giữa-các-goroutine

    được đăng trong Thảo luận chung
  • Socket server với Golang và socket.io - Ứng dụng chat realtime đơn giản

    maxresdefault (2).jpg

    Ứng dụng thực tiễn

    Áp dụng vào trong một bối cảnh cụ thể và chúng ta có thể thấy được websockets quan trọng như thế nào. Tưởng tượng rằng chúng ta có một ứng dụng chat có thể lấy về tất cả các tin nhắn gần nhất từ máy chủ duy nhất và đẩy lên tất cả các itn nhắn mới lên cùng một máy chủ.

    Sử dụng REST API?

    Để có thể làm được real-time chat, bạn phải gửi yêu cầu liên tục đến server API để lấy về những tin nhắn mới nhất.

    Điều này dẫn đến việc có khoảng 60 yêu cầu gửi lên mỗi phút cho một client. Nếu chúng ta có thể xây dựng thành công một dịch vụ và càng ngày chúng ta sẽ có nhiều traffic hơn và "khủng bố" ứng dụng của chúng ta, máy chủ của chúng ta sẽ bắt đầu bị quá tải bởi hàng triệu request API mỗi phút.

    Ví dụ về Socket

    Nếu chúng ta cân nhắc về viễn cảnh sử dụng websockets thay thế cho REST API:

    • Mỗi client sẽ duy trì chỉ duy nhất một kết nối đến máy chủ.
    • Với 1000 client chúng ta chỉ cần duy trì 1000 kết nối socket.
    • Nếu một người gửi một tin nhắn, sau đó máy chủ sẽ đẩy tin nhắn và cập nhật đến 1000 client khác.
    • Với phương thức này chúng ta làm giảm tối đa network traffic đến server. Chúng ta sẽ tiết kiệm được kinh phí cho số lượng ứng dụng server và chúng ta cần chạy và chúng ta có thể xử lý hàng ngàn clients mà không cần tốn quá nhiều công sức và chi phí.

    Triển khai Golang Server

    Để triển khai một websocket với Go, chungs ta có khá nhiều sự lựa chọn. Trong bài viết này mình sẽ sử dụng giải pháp phổ biến nhất đó là socket.io

    Cài đặt go-socket.io

    Chúng ta có thể cài đặt package sử dụng go get như bên dưới:

    go get github.com/googollee/go-socket.io
    

    Và sau đó chúng ta include nó vào chương trình Go như sau:

    import "github.com/googollee/go-socket.io"
    

    Server đơn giản

    Chúng ta hãy xem ví dụ mẫu dưới đây:

    package main
    
    import (
    	"log"
    	"net/http"
    
    	socketio "github.com/googollee/go-socket.io"
    )
    
    func main() {
    
    	server, err := socketio.NewServer(nil)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	server.On("connection", func(so socketio.Socket) {
    
    		log.Println("on connection")
    
    		so.Join("chat")
    
    		so.On("chat message", func(msg string) {
    			log.Println("emit:", so.Emit("chat message", msg))
    			so.BroadcastTo("chat", "chat message", msg)
    		})
    
    		so.On("disconnection", func() {
    			log.Println("on disconnect")
    		})
    	})
    
    	server.On("error", func(so socketio.Socket, err error) {
    		log.Println("error:", err)
    	})
    
    	http.Handle("/socket.io/", server)
    
    	fs := http.FileServer(http.Dir("static"))
    	http.Handle("/", fs)
    
    	log.Println("Serving at localhost:5000...")
    	log.Fatal(http.ListenAndServe(":5000", nil))
    }
    

    Hãy cùng phân tích mã nguồn trên nào

    Ở mã nguồn mẫu trên chúng ta sẽ làm mọi thứ trong hàm main(). Đầu tiên chúng ta định nghĩa một socket.io server mới bằng cách gọi socketio.NewServẻ(nil) trước khi định nghĩa các phương thức hoạt động và xử lý lỗi.

    Bên trong hàm server.On('connection',...) chúng ta sẽ log ra những kết nối thành công trước sau đó join phòng chat sử dụng so.Join("chat").

    Sau đó chúng ta sẽ chỉ định điều gì sẽ xảy ra khi chúng ta nhận được một tin nhắn mới từ một socket đã kết nối. Mỗi khi server của chúng ta nhận được event này chúng ta gọi so.BroadcastTo("chat", "tin nhắn", msg) sẽ gửi message đến tất car các socket đang kết nối ở thời điểm hiện tại. Điều này có nghĩa là một client có thể thấy được tất cả các tin nhắn gửi đến từ các client khác.

    Cuối cùng chúng ta định nghĩa cho event "disconnection", trong ví dụ hày chúng ta chỉ đơn giản log ra client đã ngắt kết nối.

    Giao diện kết nối cho ứng dụng

    Okay, chúng ta cần một giao diện đơn giản để test xem ứng dụng có hoạt động như mong muốn không.

    Hãy tạo một file index.html bên trong thư mục dự án.

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Go WebSocket Tutorial</title>
      </head>
      <body>
        <h2>Hello World</h2>
    
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
        <script>
          const socket = io("http://localhost:5000/socket.io/");
        </script>
      </body>
    </html>
    

    Sau đó chạy websocket server bằng cách gọi:

    $ go run main.go
    
    2019/03/12 07:54:06 Serving at localhost:5000...
    2019/03/12 07:54:15 on connection
    2019/03/12 07:54:16 on connection
    

    Server đang chạy ở cổng 5000 với URL http://localhost:5000. Bạn có thể mở URL này trên trình duyệt và xem những kết nối mới trong output log của server.

    Bây giờ, bạn đã xây dựng một giao diện kết nối trực tiếp đến Go websocket server thành công rùi đấy 😁

    Mì ăn liền

    https://github.com/TutorialEdge/Go/tree/master/go-websocket-tutorial

    được đăng trong Blogs
  • Hướng dẫn cài đặt và sử dụng Go Dep

    4e7edae6-594e-4067-ac92-3d451e98c2e4-image.png

    Go Dep là một công cụ chủ yếu dành cho các nhà phát triển, để hỗ trợ công việc cài đặt và phân phối mã nguồn. Nó không dành cho người dùng cuối đang cài đặt Go - đó là công việc của Go Get.

    Bài viết này sẽ giúp các bạn tìm hiểu cài đặt và sử dụng Go Dep cho dự án.

    Phiên bản

    Các bạn nên sử dụng phiên bản đã được released của dep sẽ ổn định và đảm bảo hơn.

    Cài đặt

    Các bản cài đặt có thể tải về trên trang chủ. Các bạn có thể sử dụng script install.sh để tự động cài đặt trên nền tảng local của các bạn.

    $ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
    

    MacOS
    Cài đặt và cập nhật phiên bản mới nhất với Homebrew:

    $ brew install dep
    $ brew upgrade dep
    

    Arch Linux
    Cài đặt dep package:

    pacman -S dep
    

    Cài đặt từ mã nguồn

    Đoạn mã dưới đây sẽ cài đặt bản phát hành dep mới nhất từ mã nguồn và biên dịch sang nhị phân để hoạt động.

    Lưu ý rằng phương pháp này không được khuyến khích sử dụng bởi nó không đảm bảo sự ổn định mà chỉ phù hợp với những người sẵn sàng thử nghiệm và cung cấp các thông tin phản hồi nhanh!

    go get -d -u github.com/golang/dep
    cd $(go env GOPATH)/src/github.com/golang/dep
    DEP_LATEST=$(git describe --abbrev=0 --tags)
    git checkout $DEP_LATEST
    go install -ldflags="-X main.version=$DEP_LATEST" ./cmd/dep
    git checkout master
    

    Cài đặt ngay trên môi trường phát triển

    Nếu bạn muốn hack go dep, hãy thử cài đặt nó với go get

    go get -u github.com/golang/dep/cmd/dep
    

    Lưu ý rằng dep yêu cầu Go workspaceGOPATH hoạt động. Hãy đảm bảo bạn cấu hình tất cả những yêu cầu cần thiết trên trước khi cài đặt Go Dep

    Tạo một project mới

    Sau khi bạn đã cài đặt Go Dep, bạn cần chọn một thư mục root cho project của bạn. Bạn cần phải lựa chọn thư mục root phù hợp với yêu cầu phát triển của bạn. Có 4 trường hợp cơ bản sau:

    • Một dự án có thể được chia sẻ hay import bởi những dự án hay lập trình viên khác. Trong trường hợp này hãy lựa chọn đường dẫn import tương ứng với VCS root với vị trí network của nó, ví dụ:
    $GOPATH/src/github.com/golang/dep.
    
    • Một dự án hoàn toàn cục bộ, bạn không có ý định đẩy nó lên server trung tâm (như Github chẳng hạn). Trong trường hợp này, mọi thư mục con bên dưới $GOPATH/src đều hợp lý.

    • Một dự án cần một repository lớn sẽ phức tạp đôi chút. Go Dep hiện vẫn chưa hỗ trợ, có lẽ là trong tương lai

    • Hãy coi toàn bộ GOPATH là một dự án duy nhất, trong đó $GOPATH/src là root. Hiện tại Dep không hỗ trợ điều này - nó cần một đường dẫn nhập không rỗng để là gốc của namespace cho dự án của bạn.

    Chúng ta giả định rằng trường hợp đầu tiên là phổ biến nhất. Hãy tạo và di chuyển dự án vào đường dẫn như sau:

    $ mkdir -p $GOPATH/src/github.com/me/example
    $ cd $GOPATH/src/github.com/me/example
    

    Okay, chúng ta bắt đầu khởi tạo dự án:

    $ dep init
    $ ls
    Gopkg.toml Gopkg.lock vendor/
    

    Trong một dự án mới như này, tất cả những tập tin và thư mục vendor sẽ rỗng.

    Đây là thời điểm thích hợp để chúng ta thiết lập quản lý phiên bản, như git chẳng hạn. Mặc dù dep không có cách nào để kiểm soát, quản lý phiên bản của dự án nhưng nó có thể giúp việc kiểm tra các thay đổi được thực hiện dễ dàng hơn. Về cơ bản, đó là cách tốt nhất để phát triển các phần mềm hiện đại!

    Tới đây, dự án của chúng ta đã được khởi tạo, chúng ta đã sẵn sàng để bắt đầu lập trình. Bạn có thể mở một file .go lên vằ bắt đầu "hack" rồi. Hoặc bạn có thể thêm vào trước những project/package mà bạn đã biết là sẽ dùng đến sử dụng câu lệnh sau:

    $ dep ensure -add github.com/foo/bar github.com/baz/quux
    

    Okay, đến đây là kết thúc hướng dẫn căn bản cài đặt và sử dụng Go Dep rồi.
    Chi tiết về một số các câu lệnh căn bản thường dùng, các bạn có thể tham khảo thêm ở đây: https://golang.github.io/dep/docs/daily-dep.html

    Chúc các bạn sẽ tạo được các project "ngon lành" trong tương lai! 😂

    được đăng trong Blogs
  • RE: Tính dãy Fibonacci?

    @wuuyi awesome example bro 😉

    được đăng trong Blogs
  • RE: Suggest fullstack web framework nhanh

    @esoftcard Mình suggest Gingonic hoặc Echo 😁

    được đăng trong Thảo luận chung
  • RE: Mã màu và "struct màu"

    Bài chất quá bác 😂

    được đăng trong Blogs