All about Android, Cocos2d-x, Java Spring and WPF Feel free to contact me: [email protected]
Don't wanna be here? Send us removal request.
Link
Giả sử có API làm việc đơn giản là tăng điểm của user khi họ kill 1 con quái vật.
Nhưng user có chưởng đánh lan nên 1 lúc có thể kill 5 con. Lúc này chương trình sẽ gửi 5 request đến API tăng điểm và có thể xảy ra lỗi OptimisticLockException vì nhiều transaction cùng update 1 bản ghi.
Vậy cách giải quyết là như nào? → Bắt exception và refresh bản ghi đó rồi update lại.
0 notes
Text
Certificates, Identifiers, Devices, Profiles Provisioning và mối quan hệ giữa chúng
Tôi xuất phát với nghề lập trình ở công việc Android Developer. Với Android, việc build app, chạy app trên device hay thậm chí release CH Play rất đơn giản. Nó đơn giản như việc bạn tạo ra 1 file .exe và chạy nó trên bất cứ máy tính Windows nào vậy, chỉ khác là với Android thì bạn tạo ra file .apk.
Nhưng với iOS thì là 1 câu chuyện hoàn toàn khác, Apple luôn muốn mọi thứ thực sự chặt chẽ để đảm bảo an toàn. Nhưng cái gì cũng có 2 mặt, việc này khiến cho mong muốn build và chạy app trên device trở lên phức tạp hơn, nhiều thành phần hơn và đôi khi tôi thấy nó thật rối rắm.
May mắn thay, sau khi trải qua dự án CENSORED tôi đã phần nào hiểu về nó. Bài viết này của tôi chủ yếu chia sẻ về mối quan hệ giữa các thành phần trong việc build và chạy app iOS trên device (iPhone, iPad), thứ mà tôi tìm trên internet thấy nó khá lộn xộn.
Những thành phần tôi nói đến bao gồm: Certificates, Identifiers, Devices và Profiles Provisioning như trong menu của trang console apple developer.
Các khái niệm - IDENTIFIERS Là định danh một app, còn được gọi là App ID hay Bundle ID. Identifiers trong Apple Developer còn cho biết app này có tính năng gì nhạy cảm không như Push notification, Bản đồ, Đọc NFC, etc. Ví dụ: com.company.appname.
CERTIFICATES Là định danh một máy Mac. Dùng để xác định một máy Mac có thể tham gia vào quá trình build app được hay không. Ngoài ra, nếu bạn muốn máy Mac của mình build app có IDENTIFIERS đăng ký tính năng Push Notification thì cũng cần đăng ký thêm một Certificate cho máy Mac đó. Việc đăng ký certificate trải qua các bước: ① Tạo certificate request file ở máy Mac → ② Add Certificate ở Apple developer website → ③ Upload certificate request file đã tạo ở ① sẽ sinh ra Certificate → ④ Download Certificate về và double click để install vào máy Mac. Lưu ý rằng ở ④, máy nào tạo ① thì máy đó install mới có tác dụng.
DEVICES Nghe qua là biết rồi, để định danh cho thiết bị như iPhone, iPad có thể sử dụng app trong quá trình develop 1 app. Để thêm 1 device thì cần paste UUID của device vào là được.
PROFILE PROVISIONING Là một file dùng để build app iOS, nó để xác định phạm vi của app với 3 thành phần trên: App có identifier là gì, có tính năng gì; App chỉ có thể build từ máy Mac nào; App có thể chạy trên device nào (khi đang develop). Vì vậy khi tạo Profile Provisioning thì cần chỉ định Certificates, Identifiers, Devices. Và khi tạo xong thì cần download và double click để install vào máy Mac dùng để build app. Mối quan hệ
Sau khi đọc mục Các khái niệm thì chắc hẳn bạn đã hình dung ra phần nào mối quan hệ giữa các thành phần này rồi. Mình sẽ khái quát thành bản vẽ sau:
Thắc mắc thường gặp 1. Muốn nhiều máy Mac cùng build được app thì làm thế nào?
→ Có 2 cách: Cách 1: Tạo thêm Certificate; Cách 2: Từ máy Mac ban đầu, export certificate ra file .p12, sau đó install file .p12 này trên máy Mac mới. Cách 2 được recommend vì sẽ không bị sinh ra nhiều certificate trên Apple Developer.
Tôi không may ấn vào revoke certificate/profile provisioning thì có ảnh hưởng gì đến app đang chạy trên các device không?
→ KHÔNG ảnh hưởng trên các device đã cài app và các bản đã release trên store. Tuy nhiên máy Mac sử dụng certificate/profile provisioning đã bị revoke thì không build app được nữa.
0 notes
Text
MyBatis and Doma2: Dynamic SQL in Java Spring
Trước giờ làm với mấy chú Nhật hay sử dụng Doma2 trong Spring (hoặc seasar) để thao tác với Database. Thấy cái này cũng hay vì nó có viết được dynamic SQL (mà Doma2 gọi là 2WaySQL). Kiểu như if name != "" thì thêm điều kiện AND name like %name-truyền-vào%.
Nhìn thấy có vẻ đơn giản nhưng nếu không có cái dynamic SQL thì phải sử dụng IF hoặc CASE WHEN trong SQL làm giảm đáng kể performance, bởi index thì không nhận khi sử dụng điều kiện rẽ nhánh.
Nhược điểm của Doma2 là cộng đồng nhỏ quá, 1 phần vì nó là hàng Nhật, 1 phần vì cũng lâu đời rồi nên chẳng thấy ai dùng (ngoài Nhật và công ty outsource cho Nhật).
Mới đây mò ra cái MyBatis cũng làm được trò này mà cộng đồng to hơn Doma2 nhiều. https://mybatis.org/mybatis-dynamic-sql/docs/spring.html
0 notes
Text
WPF Webview play video (hoặc resource nào đó) file đặt ở local
Có thể làm được bằng cách: 1. C# đọc file local với output là byte[]:
string filePath = @"C:\\test.mp4"; FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); //The reader reads the binary data from the file stream BinaryReader reader = new BinaryReader(fs); //Bytes from the binary reader stored in BlobValue array byte[] blobValue = reader.ReadBytes((int)fs.Length); fs.Close(); reader.Close();
C# Gọi hàm cầu nối sang hàm JS. Vì params cho cầu nối phải là mảng String nên cần convert byte[] sang string[] base64:
try { webView.InvokeScript("playTestVideo", new string[] { Convert.ToBase64String(blobValue) }); } catch (Exception e) {}
Javascript convert từ string[] sang blob để chạy:
function playTestVideo(base64VideoData) { var byteCharacters = atob(base64VideoData); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], {type: 'video/mp4'}); var videoUrl = URL.createObjectURL(blob); $('#testVideo source').attr('src', videoUrl); $('#testVideo').load(); }
Nhược điểm: Với video nặng thì sẽ khá ngốn RAM vì phải load all vào bộ nhớ. Có lẽ sẽ cần load từng phần với video nặng.
0 notes
Text
Lỗi củ chuối trên Edge Browser
(Lâu lắm mới vào quét mạng nhện) Mấy hôm vừa rồi đau đầu vì 1 lỗi cực củ chuối, làm mình muối mặt với bên Nhật bủn :(
Chuyện là làm Angular, chuyển từ màn hình A -> B, màn hình B sẽ chạy 1 list các video nên khách hàng muốn preload video khi vào màn hình A để sang B chạy video cho nhanh.
Mình đã làm và test rất OK, trên Edge thì ko test đc vì video khác host nên dính lỗi CORs, mà trên Edge thì ko biết bypass cái đó như nào nên thôi cứ gửi sang Nhật, chắc là không sao đâu... Nhưng cuộc sống không giống cuộc đời, khách test trên Edge thì dính lỗi mới cay: Click button để chuyển từ A sang B thì B trắng xóa hoặc chỉ load đc 1 phần.
Hóa ra lỗi vì Edge nó giới hạn lượng request đồng thời, max là 6 (https://docs.microsoft.com/en-us/microsoft-edge/devtools-guide/network#stalled). Nên khi preload video (khoảng 30 cái) sẽ khiến màn hình B không còn chỗ để gửi request nữa.
Kết thúc điều tra lỗi mất 2 ngày :(
0 notes
Text
[Spring][Hibernate] Sometime i save entity then query entity, the result is empty. Why?
In my case, when save into db, i save with:
`created_date = new Date()`
When i query:
`select * from Foo where create_date <= NOW()`
So, created_date is JVM time, and query is database time. I guess that, they have a bit difference, so created_date not smaller than NOW().
0 notes
Link
Full text search tiếng Nhật khả thi đó chứ
0 notes
Photo
SQL <-> Java type
Source: http://www.service-architecture.com/articles/database/mapping_sql_and_java_data_types.html
0 notes
Text
Unbelievable HTML bug
I receive html from customer:
``` <p class=“buttonXYZ”><a href=“”>cancel</a></p> <p class=“buttonXYZ”><a href=“”>OK</a></p> ```
And result is two horizontal button with a small margin. I do almost same work: ``` <p class=“buttonXYZ”><a href=“”>cancel</a></p><p class=“buttonXYZ”><a href=“”>OK</a></p> ```
But two button not have margin. So I inspect customer element, there are NOT any margin or padding, but it still have space between two button. After half day i swim in this issue, i found the problem is: If you write <p> <p> (have blank space), two button have space, if you write <p><p>, two button not have space.
0 notes
Text
SpringMVC cache not working when call method inside class
http://stackoverflow.com/questions/16899604/spring-cache-cacheable-not-working-while-calling-from-another-method-of-the-s
-> So i moved @Cacheable to DAO class :(
0 notes
Text
SpringMVC can't load js, css local
Add this to web.xml:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
0 notes
Text
Hibernate default value not working
Solved: Add @DynamicInsert to Entity Class
http://stackoverflow.com/questions/21983230/default-value-not-working-in-hibernate
0 notes
Text
Canvas drawText note
canvas.drawText(String text, float x, float y, Paint paint)
X: calculate from left of text.
But Y: calculate from baseline.
Paint.ascent is negative number
Paint.descent is positive number
ascen and descent is base on typeFace(font) and font size.
0 notes