THẢO LUẬN

Đúng rồi bạn. Tuy nhiên, khi bạn sử dụng thành thạo Bootstrap, bạn cũng có thể define cho mình đc nhiều thứ mà k cần sử dụng Bootstrap. Tới khi ấy, biết đâu bạn sẽ tự build cho mình đc 1 bộ framework mới thì sao 😄 Ngoài bootstrap, bạn có thể tham khảo thêm UIKit. Đây là 1 framework css khá là hay. Sau này có thời gian có thể mình sẽ giới thiệu về UIKit tới mọi người.

0

viết chán quá bạn. Bạn không dành thời gian tìm hiểu để viết bài đúng không

0

hiện tại e sử dụng rất nhiều tiện ích lên quan của BS vì vậy e nghĩ chắc chưa thể bỏ nó đc ạ 😅

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 3:58 SA

Đúng chuẩn ý luôn, cảm ơn bạn.

+1
thg 8 11, 2020 3:57 SA

ngóng phần 2 ✌️

0

Tuyệt vời quá anh Minh 😄

+1

Tiếp tục với ví dụ 5 vé và 10 người nhận vé của bạn. Với gói nhìn của mình, bạn đặt tiêu đề như vậy là chưa hợp lý. Vì fun main() = runBlocking { // COROUTINE NÀY MÌNH ĐẶT TÊN LÀ "run blocking cô rơ tin" val channel = Channel<Int>() val job = launch { for (x in 1..5) { channel.send(x * x) } }

for (x in 1..10) {
    println("Coroutine is completed?: ${job.isCompleted} / Coroutine is active?: ${job.isActive}")
    println(channel.receive())
}
println("Done! Run blocking coroutine is active?: $isActive")

} Theo đoạn code của bạn, ở đây cũng chỉ duy nhất một producer tức là coroutine con bạn tạo trong coroutine root chạy song song với coroutine root đảm nhận việc in vé. Quan trọng hơn, theo mình cũng chỉ có 1 người nhận vé, hay nói đúng hơn là 1 người nhận vé 10 lần chứ không phải là 10 người nhận vé, bởi vì chỉ có 1 consumer duy nhất trên coroutine root. Nếu bạn muốn ví dụ cho trường hợp 10 người nhận vé, mình nghĩ hãy sinh ra 10 coroutine con chạy song song hoặc tuần tự tuỳ bạn so với coroutine đóng vai trò producer in vé. Một coroutine con đóng vai trò như 1 người thực sự. Về mặt giải thích, có thể chập nhận lời giải thích của bạn, ở vé thứ 6 producer không in vé nữa nhưng consumer vẫn đang muốn lấy vé nên nó sẽ treo cho đến khi producer in thêm vé, trường hợp này là treo vĩnh viễn.

+1

Sau khi đọc bài của bạn tới mục Channels vs Flow (Hot & Cold), về cái ví dụ in 5 vé nhận 3 vé của bạn, mình có ý kiến riêng như sau: Đoạn code trong hàm main của bạn ở coroutine root, tức ở đây là runBlocking bạn tạo ra 1 coroutine con đóng vai trò như producer đẩy giá trị vào channel, coroutine này chạy song song với coroutine root bây giờ đang đóng vai trò như consumer. Bạn nói output của bạn là coroutine bị suspend forever, điều này đúng với bối cảnh của bạn tạo ra, tuy nhiên đây không hẳn là hạn chế của channel. Mình xin giải thích như sau:

  • Bạn khởi tạo một Channel<Int> với capacity mặc định là RENDEZVOUS, hiểu đại khái là chuyền tay trực tiếp từ producer tới consumer, không có bộ đêm buffer nên trong bối cảnh ví dụ của bạn, producer gửi 5 và consumer chỉ nhận 3, hay nói chính xác là producer gửi 3, consumer nhận 3. Vì sau đó consumer không nhận nữa nên producer sẽ bị suspend khi cố gắng gửi giá trị thứ 4, điều này làm cho coroutine root bị treo. Hãy thử tạo một Channel<Int> với capacity có sẵn là BUFFERED (mặc định 64), khi này producer được phép đẩy vào channel 5 giá trị (5< capacity của channel), consumer lấy ra 3 giá trị thì trong channel vẫn còn lại 2 giá trị. Tuy nhiên cả producer và consumer đều không bị treo nên lúc này coroutine root sẽ không bị treo.
+1
thg 8 11, 2020 3:00 SA

temp1.png

khi assign otherInHoa = inHoa thì chỉ assign reference thôi mà, sao 2 hàm lại khác nhau được ??

0

phần log rotate có thể config trong docker-compose file ko bác nhỉ ? hay phải config trong cấu hình của docker như trên mới được?

0

Mình thực sự khá ngại phát triển/fix bug trên môi trường Windows và mình cũng khuyên bạn nên chuyển sang làm việc trên môi trường Ubuntu càng sớm càng tốt nhé.

Hoặc một lựa chọn khác bạn có thể sử dụng môi trường Colab với support GPU sẵn rồi, như bài đã đề cập, full source code mình đã để ở trên Colab, bạn có thể chạy thử luôn https://colab.research.google.com/drive/1dd_fGnbagyYw08w-My0QCw7jbi0-EICH?usp=sharing

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 2:11 SA

ừ, cách của ban phải lấy dữ liệu ra rồi mới so sánh sau đó mới xóa , nên mình mới bảo là khó viết truy vấn sql mà.

0
thg 8 11, 2020 2:09 SA

Khiêm tốn quá bạn ơi, lần đầu tiên mình nghe từ "frontend dev nửa mùa" đó 😃

+1
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 2:06 SA

@tinhtn89 =)) cách trừ thì nó ngắn gọn hơn còn cộng thì dài hơn bạn phải lấy dữ liệu ra rồi mới so sánh create_at rồi mới xóa chứ

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 1:59 SA

khác chứ, created_at làm sao bạn cộng thêm được, nó là trường dữ liệu mà.

0
thg 8 11, 2020 1:58 SA

Tks bạn nhé, mình là frontend dev nửa mùa =))

0
thg 8 11, 2020 1:54 SA

Mình đã làm được rồi :d, do mình thiếu bước tải sonar-scanner. Cảm ơn nhiều

+1
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 1:52 SA

@tinhtn89 =)) tương tự với bạn trừ đi 5 phút, nhỏ hơn phía trên kìa. còn trường hợp t là cộng thêm, lớn hơn thôi :v

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 1:45 SA

Ý tưởng rất hay, cảm ơn bạn hỗ trợ.

+1
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 8 11, 2020 1:45 SA

Cái này viết truy vấn kiểu gì được bạn?

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí