Posts

Showing posts from February, 2019

PLSQL Tutorial

https://www.dotnettricks.com/learn/sqlserver/difference-between-stored-procedure-and-function-in-sql-server http://index-of.co.uk/Database/Oracle%20Database/Oracle%20PL-SQL%20Programming,%206th%20Edition.pdf https://www.plsql.co/ 1. Khai báo biến tên_biến  kiểu_dữ_liệu  [default] [giá_trị_khởi_tạo] ví dụ: name varchar(20) default "Nguyen Huy Bo"; point number(10,2) default 22 ;       giá trị lớn nhất là   9999999999,99 PI constant double default 3.14; DECLARE    --global variable    a integer := 10;    b integer := 20;    c integer;    f real; BEGIN    c := a + b;    f := 70.0/3.0;    DECLARE       -- Local variables       num1 number := 195;       num2 number := 185;    BEGIN       -- code here    END; END; / IF THEN END IF; IF (a <= 20) THEN --...

TimerTask

Khi bạn cần phát triển một service chạy thực thi một công việc Cronjob theo thời gian, theo chu kì, delay 1 thời gian .... Lúc đó bạn có thể nghĩ ngay đến TimerTask là một core java class. Không cần API thư viện ngoài :-)

Thread.join()

Ví dụ trong main thread có khởi tạo và chạy 2 thread1 và thread2 nếu main thread gọi thread1.join() --> đồng nghĩa với việc main thread sẽ chạy tới câu lệnh Thread1.join() sau đó nó sẽ dừng lại và không chạy tiếp các câu lệnh bên dưới. Nó sẽ chờ cho Thread1 hoàn thành rồi nó mới chạy tiếp. Ví dụ thực tế cho dễ hiểu. Bạn cần in một chương trình tính Tích giai thừa từ 1 đến 100 và bạn có 2 người(2 CPU có khả năng tính toán) song song như vậy bạn sẽ lập một chương trình  Thread t1 tính tích 1-> 50 Thread t2 tính tích 51-> 100 Và sau khi tính song thì bạn sẽ in kết quả ra màn hình  t1.result * t2.result Nhưng vấn đề là nếu bạn start t1 và start t2 cùng một lúc thì chương trình sẽ chạy và in ra tích t1.result* t2.result ngay sau đó trong khi t1 và t2 vẫn đang tính toán vậy làm thế nào để in ra kết quả khi cả 2 tính toán xong ngay sau khi bạn gọi t1.start và t2.start bạn phải gọi t1.join() và t2.join() ngay sau đó. Điều đó có ng...

Runable vs Callable

Runable là một interface mà nó dùng cho viêc thực hiện một công việc mất nhiều thời gian phản hồi ngay lập tức Bạn sẽ không thể nhận kết quả là 1 giá trị khi thực hiện xong Runable Vậy việc lấy giá trị sau khi thời gian chạy như vậy thì làm thế nào??? Bạn hoàn toàn có thể dùng biến share giữa các luồng để check và lấy giá trị Với sự phức tạp việc quản lý task khi dùng chung biến share Java đã phát triển một interface Callable Callable chạy task ngầm như Runable nhưng nó hỗ trợ trả về dữ liệu sau khi thực hiện xong task do vậy chúng ta có thể truy cập giá trị dễ dàng vậy làm cách nào để lấy giá trị đó Chúng ta phải dùng một Class là Future để thực hiện việc lấy dữ liệu thông qua Future.get()  là phương thức để lấy dữ liệu, khi phương thức get() được thực hiện nó sẽ block luồng hiện tại và chờ đợi khi có dữ liệu trả về vậy điều gì nếu hàm get() bị timeout khi dữ liệu không trả về sau 1 thời gian -- Luồng sẽ bị timeout theo Vậy Completeable sẽ giải quyết được đi...

CGlib in java

http://jexp.ru/index.php/Java_Tutorial/Spring/MethodInterceptor https://javax0.wordpress.com/2016/01/20/java-dynamic-proxy/ Bạn đã từng nghĩ về AOP trong Spring Làm thế nào nó hoạt động được hoặc bạn từng nghĩ viết hàm loging cho method một class nào đó mà không cần sửa class đó hãy nghĩ tới CGlib ví dụ bạn có một class như bên dưới và có 2 methods public class PersonService {     public String sayHello(String name) {         return "Hello " + name;     }     public Integer lengthOfName(String name) {         return name.length();     } }

BeanGenerator and how to use it

Chúng ta có thể dễ dàng tạo ra một class POJO hay một Bean bằng cách lập trình động, động ở việc thêm thuộc tính cho nó, kiểu dữ liệu các thuộc tính, động ở việc set giá trị thuộc tính bằng cách gọi đúng tên theo quy ước lạc đà BeanGenerator beanGenerator = new BeanGenerator(); beanGenerator.addProperty("name", List.class); Object myBean = beanGenerator.create(); Method setter = myBean.getClass().getMethod("setName", List.class); List<String> list= new ArrayList<String>(); list.add("Bộ"); setter.invoke(myBean, list); Method getter = myBean.getClass().getMethod("getName"); System.out.println(getter.getDeclaringClass());

JOIN vs JOIN FETCH in JPA hibernate

Ví dụ bạn có một Student Entity và một Country entity trong Student entity có một khóa ngoại tới Country entity JOIN khi dùng thì nó tương tự như câu lệnh JOIN trong SQL, nhưng khi Đối tượng Student được trả về thì nó sẽ hoặc load cả Country entity hoặc là không load Contry(Nếu bạn để là Lazy thì nó sẽ k load Country còn nếu để là Eager thì nó sẽ load Country) do đó khi bạn dùng student.getCountry() nó có thể trả về Null hoặc là lỗi. Còn nếu bạn dùng JOIN Fetch khi load Student Join fetch với Country thì nó sẽ load cả đối tượng Contry bất kể bạn để load là Lazy hay là Eager vì vậy bạn có thể dùng student.getCountry().getName() là có giá trị

@Lob in JPA, Hibernate

http://www.java2s.com/Tutorials/Java/JPA/0250__JPA_Lob_Column.htm The following code shows how to save byte array to database with @Lob annotation. LOBs have two types in the database: character large objects, called CLOBs, and binary large objects, or BLOBs. A CLOB column holds a large character sequence, and a BLOB column can store a large byte sequence. The Java types mapped to BLOB columns are byte[] Byte[] , and Serializable types, while char[] Character[] , and String objects are mapped to CLOB columns. @Lob private byte[] picture; //BLOB or @Lob private Byte[] picture; //BLOB @Lob private char [] picture; // CLOB or @Lob private Character[] picture; //CLOB

Use @PrimaryKeyJoinColumn

http://www.java2s.com/Tutorials/Java/JPA/0730__JPA_OneToOne_Primary_Key_Join.htm @Entity public class Person {   @Id   @GeneratedValue(strategy=GenerationType.IDENTITY)   private long id;       private String name;   @OneToOne   @PrimaryKeyJoinColumn   private Department department;    when you want to use Person's id to join with Department's id If in Person entity have a FK with name "departmentID" then you should use @JoinColumn

Proceduce in SpringBoot and RepositoryCustom is the best way

0. Tạo Proceduce  Delimiter $$ Create proceduce 'get_all_employees'() Begin     select * from employees; end 1. Khai báo ở @Entity Entity @Table(name = "employees") @Data @NamedStoredProcedureQueries({         @NamedStoredProcedureQuery(name = "getAllEmployees",                                     procedureName = "get_all_employees",         resultClasses = Employees.class) }) public class Employees implements Serializable {     @Id     @Column(name = "employeeID")     private long employeeID;     @Column(name = "firstName")     private String firstName;     @Column(name = "lastName")     private String lastName;     @Column(name = "address")     private String address; } Và Call ở @Repository @Procedure(name = "getAllEmployees") List<Employees>...

Serverlet flow

1. Ban đầu Có 1 thằng lắng nghe có request đến (Đánh chống, chuông vào cửa) --> Đưa nó đến ServerletContainer 2. Tiếp theo đia qua 1 số cửa Fiter để biết ông này thuộc loại nào (Người màu vàng, trắng đen, gầy béo, cao thấp) --> Thuộc serverlet Context 3. Gặp ông điều phối Dispatch Serverlet (Điều các kiểu loại người đi vào các Châu lục , phòng ban) 4. Gặp chị Lễ tân (Interceptor)để check thẻ ra vào phòng ban --->thuộc Spring Context 5. Sau khi hỏi chị lễ tân ok thì vào đúng phòng ban Controller làm việc với đúng thằng Serverlet https://qiita.com/kazuki43zoo/items/757b557c05f548c6c5db

Là đàn ông

Bài viết này Tiến sĩ Lý Khai Phục, cựu Phó tổng giám đốc Microsoft toàn cầu trong thập kỷ 90 và cựu Phó tổng giám đốc Google châu Á năm 2005, muốn gửi những lời khuyên chân thành nhất tới những người đàn ông ở độ tuổi từ 20 đến 25. 27-12-2017 Khi 20 đến 30 mà chưa lập nghiệp, bạn đã bỏ lỡ cơ hội cả đời 26-12-2017 5 sự thật đơn giản về cuộc đời, không biết sớm sẽ mãi hối hận 26-12-2017 Tìm hoài đam mê nhưng chưa thấy: Đây là 3 câu hỏi đơn giản giúp bạn tìm ra... Đàn ông tuổi 25: Hãy yêu tiền, yêu vật chất, hãy dùng tiền để sống cho ra sống Nếu bạn là đàn ông, nếu bạn đã hai mươi, nhưng bạn chưa hai lăm tuổi, bạn buộc phải tìm được một thứ gì đó ngoài tình yêu, giúp đôi chân bạn đứng vững vàng trong cuộc đời này. Bạn phải bắt đầu nghĩ cách để kiếm ĐỦ và sống ĐƯỢC. Tôi chưa từng bao giờ nghĩ bằng cấp là thứ quan trọng, thiên tài với danh nhân đâu phải từ lò luyện và trường lớp mà ra. Nhưng nếu bạn không học tới nơi tới chốn, thì dù có đi làm cửu vạn, ngay cả bao cát cũng sợ ...

Topic in firebase

DELETE iid.googleapis.com/iid/v1/IID_TOKEN/rel/topics/TOPIC_NAME – Nick Unuchek Sep 15 '17 at 7:56 GET DETAIL https://iid.googleapis.com/iid/info/nKctODamlM4:CKrh_PC8kIb7O ...clJONHoA?details=true and insert your API_KEY in your Request HEADERS Authorization: key=YOUR_API_KEY CREATE First, given that IID_TOKEN is your registration token and TOPIC_NAME is the topic you want to create, you need to create topic by making a POST request to https://iid.googleapis.com/iid/v1/IID_TOKEN/rel/topics/TOPIC_NAME

Cấu hình HTTPS trong tomcat

<Connector port=" 443 "     // 8443 protocol="HTTP/1.1"    //or protocol="org.apache.coyote.http11.Http11NioProtocol"                                   maxThreads="150"                                       scheme=" https "                                           secure=" true "                                                 SSLEnabled="true" keystoreFile= "conf/keystore.key"  keystorePass=" 123456 " clientAuth="false" /> Lưu ý cách tạo keystore. Nếu dùng cho web gọi service thì không cần mua SSL cert Nếu dùng cho andr...

Config max Heap size, initial heap size, stack size

java -Xmx1024M -Xms1024M -Xss4m -jar *filename*.jar Xmx --> max heap size Xms --> initial heap size Xss --> stack size or in eclipse: Run configuration --> Agurement tab

Xử lý API google Login

1. Check bởi Endpoint sau  https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123 XYZ123 chính là token cần truyền

Xử lý API facebook login

1. The official graph endpoint for inspecting access tokens is: GET graph.facebook.com/debug_token? input_token=[user_access_token]& access_token=[app_token_or_admin_token] Example response: { "data" : { "app_id" : 138483919580948 , "application" : "Social Cafe" , "expires_at" : 1352419328 , "is_valid" : true , "issued_at" : 1347235328 , "metadata" : { "sso" : "iphone-safari" }, "scopes" : [ "email" , "publish_actions" ], "user_id" : 1207059 } } Yêu cầu phía mobile gửi một cái mã  user_access_token Sau đó Phía server cần verify cái mã này bằng API bên trên Vấn đề là đào đâu ra cái mã này  app_token_or_admin_token GET graph.facebook.com/debug_token? input_toke...

Save vs persist

Save nó sẽ trả về một đối tượng đã chèn vào Persist nó sẽ không trả về Điểm chung của cả 2 là đều đẩy một đối tượng vào trạng thái Persistence

Hàm update() và merge() trong hibernate

1. Đơn giản nhất Hãy hiểu về hàm update như ý nghĩa của cái tên đó là update một cái gì đó ( đó chính là một đối tượng có giá trị ID rõ ràng) ví dụ: Session session = factory . openSession ( ) ; Transaction tx = session . beginTransaction ( ) ; Student student = new Student ( ) ; student . setId ( 111 ) ; student . setName ( "chandra shekhar" ) ; student . setRollNumber ( 8469 ) ; session . update ( student ) ; tx . commit ( ) ; session . close ( ) ; Đoạn code trên chạy đẹp do là đối tượng đã được thiết lập ID. Quá đơn giản Nếu ID k có trong DB là lỗi ngay Và nó là lý do sinh ra hàm saveOrUpdate(); :-))) 2. Một chút phức tạp  Trường hợp này đối tượng được load hoặc get, findxxx,.... từ DB Session session = factory . openSession ( ) ; Transaction tx = session . beginTransaction ( ) ; Student student = session . load ( Student . class , 111 ) ;...

PostgreSQL in Hibernate

Do not use this key word in table name in Hibernate JPA USER it can cause serious errors

Proceduce Hibernate

1. Create store proceduce ----- STORED PROCEDURE QUERY #1 ----- DELIMITER $ CREATE PROCEDURE findAllEmployees ()     BEGIN         SELECT * FROM employee;     END $ DELIMITER ; ----- STORED PROCEDURE QUERY #2 ----- DELIMITER $ CREATE PROCEDURE findEmployeeByDepartment (IN emp_department VARCHAR(200))     BEGIN         SELECT * FROM employee emp WHERE emp.edept = emp_department;     END $ DELIMITER ; ----- STORED PROCEDURE QUERY #3 ----- DELIMITER $ CREATE PROCEDURE findEmployeeCountByDesignation (IN emp_designation VARCHAR(200), OUT designation_count INT(50))     BEGIN         SELECT COUNT(*) INTO designation_count FROM employee emp WHERE emp.edesig = emp_designation;     END $ DELIMITER ; 2. Create Entity @Entity @Table(name= "employee") public class Employee {     @Id     @GeneratedValue(strategy= GenerationType.IDENTITY)     pr...