Avatar
0
e2al3qakmdd1okym Beginner
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&lt;String&gt;</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&lt;String&gt;</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>
Answer
Avatar
1
Shi Shi Beginner
Shi Shi Beginner
jwt in java
em chào mọi người, mọi người cho e hỏi e dùng thuật ES256 để gen token <p> nhưng khi có token để verify ví dụ như này </p> <p> public key : <div class="markdown-block position-relative overflow-auto source-"> <pre> MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE02Ar8685UapqDlOT8TneixaeR2Uu0tRu0R8WTG5ATA7j3Nk9x6poNYiH/Ez6jhwQg/ocioHsjzOOStUeSN8aIg== </pre> </div>và token : </p> <div class="markdown-block position-relative overflow-auto source-"> <pre> eyJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJ0ZXN0LW5vYyIsImF1dGgiOiJCSV9FWFBPUlQiLCJlbWFpbCI6ImFiYy5jb20udm4iLCJmdWxsX25hbWUiOiJCVSBOT0MiLCJST0xFX0pXVCI6IkJJX0VYUE9SVCIsIk1OVl9KV1QiOiJ0ZXN0LW5vY19ub2MiLCJleHAiOjk5OTk5OTk5OTk5OTk5fQ.xdtY5Rbay7I5733gBOzSoPFrADCwqE7PhuNGd0zdkyB81wbGunFny2CjagQfgVr_kg0RviUmusjGmjiVk3zB_Q </pre> </div><p> thì khi verify tại sao e thêm 1 ký tự bất kỳ vào cuối token nó vẫn verify thành công ạ, nhưng thêm đến ký tự thứ 2 vào cuối hoặc chỉ thêm ký tự . vào cuối thì verify thất bại, nếu theo nguyên tắc e làm sai khác token đi so với bán đầu nó phải verify thất bại luôn chứ ạ, mong mọi người giải đáp giúp e, e cảm ơn. </p> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-k">public</span> <span class="pl-k">class</span> GenToken { <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-k">void</span> main(String[] args) <span class="pl-k">throws</span> Exception { KeyPair keyPair = generateECKeyPair(); String publicKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()); String privateKeyBase64 = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); String jwtToken = createJwtToken(publicKeyBase64, privateKeyBase64); } <span class="pl-k">private</span> <span class="pl-k">static</span> KeyPair generateECKeyPair() <span class="pl-k">throws</span> NoSuchAlgorithmException, InvalidAlgorithmParameterException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(<span class="pl-s">"EC"</span>); ECGenParameterSpec ecGenParameterSpec = <span class="pl-k">new</span> ECGenParameterSpec(<span class="pl-s">"secp256r1"</span>); keyPairGenerator.initialize(ecGenParameterSpec); <span class="pl-k">return</span> keyPairGenerator.generateKeyPair(); } <span class="pl-k">private</span> <span class="pl-k">static</span> String createJwtToken(String publicKeyBase64, String privateKeyBase64) { Date expirationDate = <span class="pl-k">new</span> Date(99999999999999999L); <span class="pl-k">return</span> Jwts.builder() .setSubject(<span class="pl-s">"test-noc"</span>) .claim(<span class="pl-s">"auth"</span>, <span class="pl-s">"EXPORT"</span>) .claim(<span class="pl-s">"email"</span>, <span class="pl-s">"abc.com.vn"</span>) .claim(<span class="pl-s">"full_name"</span>, <span class="pl-s">"BU"</span>) .claim(<span class="pl-s">"ROLE_JWT"</span>, <span class="pl-s">"EXPORT"</span>) .claim(<span class="pl-s">"MNV_JWT"</span>, <span class="pl-s">"test-manv"</span>) .setExpiration(expirationDate) .signWith( SignatureAlgorithm.ES256, getPrivateKey(privateKeyBase64) ) .compact(); } <span class="pl-k">private</span> <span class="pl-k">static</span> PrivateKey getPrivateKey(String privateKeyBase64) { <span class="pl-k">try</span> { byte[] keyBytes = Base64.getDecoder().decode(privateKeyBase64); KeyFactory keyFactory = KeyFactory.getInstance(<span class="pl-s">"EC"</span>); <span class="pl-k">return</span> keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); } <span class="pl-k">catch</span> (Exception e) { <span class="pl-k">throw</span> <span class="pl-k">new</span> RuntimeException("Error loading <span class="pl-k">private</span> key", e); } } </pre> </div><p> còn đây là class verify token của e </p> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-k">public</span> <span class="pl-k">class</span> JwtProcess { SignatureAlgorithm algorithm; <span class="pl-k">private</span> PublicKey getPublicKey(String publicKeyBase64) <span class="pl-k">throws</span> Exception { algorithm = SignatureAlgorithm.ES256; byte[] decoded = Base64.getDecoder().decode(publicKeyBase64); X509EncodedKeySpec spec = <span class="pl-k">new</span> X509EncodedKeySpec(decoded); KeyFactory kf = KeyFactory.getInstance(algorithm.isRsa() ? <span class="pl-s">"RSA"</span> : <span class="pl-s">"EC"</span>); <span class="pl-k">return</span> kf.generatePublic(spec); } <span class="pl-k">public</span> <span class="pl-k">boolean</span> verifyToken(String token, String publicKeyBase64) { <span class="pl-k">try</span> { PublicKey publicKey = getPublicKey(publicKeyBase64); Jwts.parserBuilder().setSigningKey(publicKey).build().parseClaimsJws(token); <span class="pl-k">return</span> true; } <span class="pl-k">catch</span> (Exception e) { e.printStackTrace(); <span class="pl-k">throw</span> <span class="pl-k">new</span> ObjectException(<span class="pl-s">"</span> Could <span class="pl-k">not</span> verify JWT token integrity! <span class="pl-s">"</span>); } } <span class="pl-k">public</span> JwtClaims decodeToken(String token, String publicKey) <span class="pl-k">throws</span> Exception { Claims claims = Jwts.parser() .setSigningKey(getPublicKey(publicKey)) .parseClaimsJws(String.valueOf(token)).getBody(); <span class="pl-k">return</span> <span class="pl-k">new</span> JwtClaims( claims.getSubject(), claims.get(<span class="pl-s">"auth"</span>).toString(), claims.get(<span class="pl-s">"email"</span>).toString(), claims.get(<span class="pl-s">"full_name"</span>).toString(), claims.get(<span class="pl-s">"ROLE_JWT"</span>).toString(), claims.get(<span class="pl-s">"MNV_JWT"</span>).toString(), claims.get(<span class="pl-s">"exp"</span>).toString() ); } } </pre> </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
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
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
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