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>
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<String, String> information = <span class="pl-k">new</span> HashMap<>();
// 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() > 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 > 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>
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>
maxhistory logback not working
Em chào anh và mọi người<p>
Em có làm file logback và em có thêm phần "< maxHistory > 30 < / maxHistory >" để lưu log trong 30 ngày nhưng nó lại không hoạt đông. Em có tham khảo nhiều tài liệu trên mạng nhưng không được. Anh và mọi người ở đây đã ai làm về phần này có thể tư vấn cho em được không ạ
</p>
<p>
Em xin cảm ơn
</p>
Multiple tenant multiple database .net core
Hi mọi người!
<p>
</p>
<p>
Em đang học thiết kế ứng dụng mô hình SaaS Applications. Em muốn làm mô hình dạng mỗi shop sẽ là 1 database riêng biết. Em cũng mới chuyển qua .net core nên có 1 số câu hỏi như sau mong mọi người giúp:
</p>
<ol>
<li>Khi nhiều shop thì cách mình định danh shop đó như thế nào ạ?</li>
<li>Khi mà làm mô hình thế thì cần tìm hiểu thêm về những vấn đề gì (ví dụ cân bằng tài server....). Cái này hệ thống lớn mới cần nhưng em cũng muốn tìm hiểu coi nó sẽ như thế nào</li>
</ol>
<p>
Mọi người ai có kinh nghiệm giải đáp giúp em ạ. Có cái ví dụ nào cho e thì càng tốt ạ. Em cảm ơn mọi người.
</p>
Dự án NFT đơn giản với Metamask và Web3: Khởi tạo dự án
Dự án của chúng ta sẽ sử dụng java web, cấu trúc thư mục sẽ kiểu thế này:
<p>
</p>
<img src="https://stackask.com/wp-content/uploads/2021/12/Screen-Shot-2021-12-16-at-12.26.01-PM.png" alt="" class="alignnone size-full wp-image-3757" />
<p>
</p>
<ol start="1">
<li>file pom:
</li>
</ol>
<p>
</p>
<pre><span><span><span><?</span>xml version=<span>"1.0"</span> encoding=<span>"UTF-8"</span><span>?></span></span>
<span><<span>project</span> <span>xmlns</span>=<span>"http://maven.apache.org/POM/4.0.0"</span>
<span>xmlns:xsi</span>=<span>"http://www.w3.org/2001/XMLSchema-instance"</span>
<span>xsi:schemaLocation</span>=<span>"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span>
<span><<span>modelVersion</span>></span>4.0.0<span></<span>modelVersion</span>></span>
<span><<span>parent</span>></span>
<span><<span>groupId</span>></span>com.tvd12<span></<span>groupId</span>></span>
<span><<span>artifactId</span>></span>ezyfox<span></<span>artifactId</span>></span>
<span><<span>version</span>></span>1.0.2<span></<span>version</span>></span>
<span></<span>parent</span>></span>
<span><<span>groupId</span>></span>org.example<span></<span>groupId</span>></span>
<span><<span>artifactId</span>></span>nft-game-web<span></<span>artifactId</span>></span>
<span><<span>version</span>></span>1.0.0<span></<span>version</span>></span>
<span><<span>properties</span>></span>
<span><<span>ezy.http.version</span>></span>0.2.0<span></<span>ezy.http.version</span>></span>
<span><<span>ezy.platform.version</span>></span>0.0.1a<span></<span>ezy.platform.version</span>></span>
<span></<span>properties</span>></span>
<span><<span>dependencies</span>></span>
<span><<span>dependency</span>></span>
<span><<span>groupId</span>></span>com.tvd12<span></<span>groupId</span>></span>
<span><<span>artifactId</span>></span>ezyhttp-server-boot<span></<span>artifactId</span>></span>
<span><<span>version</span>></span>$</span><span>{ezy.http.version}</span><span><span></<span>version</span>></span>
<span></<span>dependency</span>></span>
<span><<span>dependency</span>></span>
<span><<span>groupId</span>></span>org.youngmonkeys<span></<span>groupId</span>></span>
<span><<span>artifactId</span>></span>ezyplatform-devtools<span></<span>artifactId</span>></span>
<span><<span>version</span>></span>$</span><span>{ezy.platform.version}</span><span><span></<span>version</span>></span>
<span></<span>dependency</span>></span>
<span></<span>dependencies</span>></span>
<span></<span>project</span>></span></span>
</pre>
<p>
</p>
<ol start="2">
<li>File NftGameStartup:
</li>
</ol>
<p>
</p>
<pre>
package org.example.nft_game;
import com.tvd12.ezyhttp.core.boot.EzyHttpApplicationBootstrap;
public class NftGameStartup {
public static void main(String[] args) throws Exception {
EzyHttpApplicationBootstrap.start(NftGameStartup.class);
}
}
</pre>
<p>
</p>
[Deep Learning] Làm thế nào để xác định được cái hàm tuyến tính nào cần dùng
Bài toán của anh là recommendation: matching sự kiện có liên quan đến người dùng nhất để bán. Ngày trước anh dùng phương pháp tìm hàm sai số với Linear Regression. Thực ra lúc đó anh cũng đoán mò cái hàm ban đầu là <code>f(x) = a1x1 +a2x2 + .. + anxn + b;</code> cơ mà anh cứ sợ nó sai. Theo anh hiểu thì có 2 cách để xác định cái hàm tuyến tính ban đầu:
<p>
</p>
<ol start="1">
<li>Sử dụng công cụ đồ hoạ chiếu tất cả các điểm về dạng đồ thì 2 chiều từ đó nhìn vào mật độ phân bố để đoán ra được hàm tuyến tính
</li>
<li>Có 1 định lý toán học nào đó hoặc có 1 kiểu toán học nào đó có thể áp dụng để suy ra được cái hàm tuyến tính ban đầu này
</li>
</ol>
<p>
</p>
<p>
Anh hiểu vậy đúng không em?
</p>
Chạy test ezyhttp bị lỗi
Em clone ezyhttp về, xong chạy <code class="markdown-inline">com/tvd12/ezyhttp/core/boot/test/BootApp.java</code> nhưng bị Exception:
<p>
</p>
<img class="alignnone size-full wp-image-1344" src="https://stackask.com/wp-content/uploads/2021/09/Screenshot-from-2021-09-05-13-33-45.png" alt="" />
Volatile boolean khác gì AtomicBoolean
Volatile boolean khác gì so với AtomicBoolean?
cannot find symbol class QAbstractAuditingEntity does not exist intellij
Chào các anh chị và các bạn rất mong được sự hỗ trợ ạ. <p>
Khi em mvn compile project A có import 1 dependency /lib/filename-SNAPSHOT.jar thì xảy ra lỗi ạ!
</p>
<p>
Lớp AbstractAuditingEntity của em thì ở trong gói jar ạ.
</p>
<img src="/api/v1/media/a4ad6f3840f9cbbaa0801dad730fb9d9d1a03c529911dcaafde3b8200dd88a01.png" alt="Screenshot 2023-06-14 100549.png">
Bug sai đường dẫn khi config ckeditor lên live
Em đang làm cho dự án thì khi config ckeditor chạy trên uat thì vẫn chạy được nhưng khi đưa lên live lại dính lỗi because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
<p>
Theo như em thấy thì cái đường dẫn css nó bị thay đổi dẫn đến nó không nhận cái css của ckeditor.
</p>
<p>
ở UAT đường link đó là:
</p>
<p>
</p>
<p>
+ <em><strong>:8080/js/vendor/CKFinderJava/ckeditor/skins/moono-lisa/editor.css?t=H5SC
</strong></em>
Nhưng khi lên live thì lại là:
</p>
<p>
+ <em><strong>.com.vn/review/mail/skins/moono-lisa/editor.css?t=H5SC
</strong></em>
</p>
<p>
Nó bị mất js/vendor/CKFinderJava/ckeditor/ và ghi đè lên đó là /review/mail/
</p>
<p>
Không biết em cần config như nào để không bị như vậy ạ?
</p>
Background activity bị auto scale khi bàn phím số hiện lên
Mình newbie kotlin đang tập viết app android, hiện mình gặp 1 vấn đề là cái background activity bị auto scale khi bàn phím số hiện lên để nhập thông tin. Ngoài ra dùng constraint layout nên các view cũng bị thay đổi vị trí. Rất mong các anh chị đi trước hướng dẫn cách xử lý.