22 tháng 11, 2016

Tạo column kiểu số có giá trị tự động tăng trong Oracle Database

Để tạo được một column có kiểu là NUMBER mà giá trị của column đó có thể tự động tăng khi thực hiện câu lệnh INSERT trong hệ quản trị cơ sở dữ liệu Oracle ta sẽ phải sử dụng đến SEQUENCE kết hợp với TRIGGER.

Muốn thực hiện được điều này, đầu tiên phải tạo một SEQUENCE:

CREATE SEQUENCE name_of_sequence
  START WITH 1
  INCREMENT BY 1
  MAX VALUE 999999
  CACHE 100;

Đến đây, mỗi khi thực hiện câu lệnh INSERT, chỉ cần thực hiện như sau là đã có thể lấy được giá trị tăng kế tiếp để insert vào database:

INSERT INTO table_name(column_increment, other_column) 
  VALUES (name_of_sequence.NEXTVAL, other_column_value);

Ngoài ra, để thực hiện insert giá trị tự động tăng này vào column mà không cần gọi trực tiếp đến column đó trong câu lệnh, ta sẽ phải tạo ra một TRIGGER để thực hiện được điều này.

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT name_of_sequence.NEXTVAL
    INTO :new.primary_key_column
  FROM dual;
END;

Từ phiên bản Oracle 11.1 về sau, ta có thể đơn giản khối lệnh tạo TRIGGER bên trên như sau:

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.primary_key_column := name_of_sequence.NEXTVAL;
END;

20 tháng 11, 2016

Cài đặt và tùy biến Fedora Linux 24 trên máy tính Sony VAIO SVF14217SGB (Phần 1)

I. Cài đặt Fedora Linux lên máy

Tải file iso từ trang chủ của Fedora và sử dụng phần mềm Rufus tạo một usb boot cài đặt Fedora, sau đó tiến hành cài đặt bình thường.

II. Cài đặt và cấu hình Fedora Linux

1. Cài đặt wireless driver

Máy tính Sony VAIO SVF14217SGB sử dụng broadcom chipset BCM43142, driver của chipset này không còn được hỗ trợ cho Linux từ trang chủ Broadcom. Vì vậy, để có thể sử dụng được wifi ta sẽ phải cài đặt gói broadcom-wl từ RPM Fusion.

Để máy tính có thể sử dụng được wifi, ta cần phải kết nối internet thông qua dây nối và thực hiện các bước sau:

1.1. Thêm rpmfusion repository:

$ su -c 'dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm'

1.2. Update lại toàn bộ hệ thống:

$ sudo dnf update

1.3. Sau khi update thành công, tiến hành build kernel mới nhất:

$ sudo dnf install kernel-devel -y

Sau khi build thành công, khởi động lại hệ thống, và chọn kernel mới nhất từ menu boot.

1.4. Cài đặt gói broadcom-wl

$ sudo dnf install broadcom-wl

Khởi động lại một lần nữa sẽ thấy menu setting cho wifi. Quá trình cài đặt hoàn tất.

2. Cài đặt, chỉnh sửa font mặc định và font chuyển đổi trên Fedora Linux.

Cài đặt các font cần thiết vào thư mục /usr/share/fonts (nếu muốn sử dụng cho tất cả user) hoặc ~/.local/share/fonts (nếu chỉ sử dụng cho user hiện tại).

Sau khi đã có các font cần sử dụng, tiến hành tạo cấu hình font cho Fedora Linux như sau:

2.1. Tạo file cấu hình font

Tiến hành tạo file fonts.conf tại thư mục /etc/fonts (nếu muốn tùy biến cho tất cả user) hoặc tại thư mục ~/.config/fontconfig/ (nếu chỉ muốn tùy biến cho user hiện tại).

2.2. Đặt nội dung sau vào file cấu hình và login lại vào hệ thống.

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<!-- Set preferred serif, sans serif, and monospace fonts. -->
  <alias>
    <family>serif</family>
    <prefer><family>Noto Serif</family></prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Arimo</family></prefer>
  </alias>
  <alias>
    <family>sans</family>
    <prefer><family>Arimo</family></prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer><family>Monaco</family></prefer>
  </alias>
  <!-- Fedora font -->
  <match target="pattern">
    <edit name="dpi" mode="assign">96</edit>
  </match>
  <match target="font">
    <edit mode="assign" name="antialias" >
      <bool>true</bool>
    </edit>
  </match>
  <match target="font">
    <edit mode="assign" name="hinting" >
      <bool>true</bool>
    </edit>
  </match>
  <match target="font">
    <edit mode="assign" name="hintstyle" >
      <const>hintslight</const>
    </edit>
  </match>
  <match target="font">
    <edit mode="assign" name="rgba" >
      <const>rgb</const>
    </edit>
  </match>
  <match target="font">
    <edit mode="assign" name="lcdfilter">
      <const>lcddefault</const>
    </edit>
  </match>
  <!-- Aliases for commonly used MS fonts. -->
  <match>
    <test name="family"><string>Arial</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Arimo</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Helvetica</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Arimo</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Verdana</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Arimo</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Tahoma</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Arimo</string>
    </edit>
  </match>
  <match>
    <!-- Insert joke here -->
    <test name="family"><string>Comic Sans MS</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Arimo</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Times New Roman</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Tinos</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Times</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Tinos</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Courier New</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Cousine</string>
    </edit>
  </match>
</fontconfig>

III. Cài đặt bộ gõ Tiếng Việt

Ta sẽ sử dụng input method framework Fcitx với engine Fcitx-Unikey để gõ Tiếng Việt trên Fedora Linux.

Thực hiện các bước sau để cài đặt:

1. Thực hiện các lệnh cài đặt fcitx sau đây:

$ sudo dnf install fcitx
$ sudo dnf install kcm-fcitx
$ sudo dnf install fcitx-unikey
$ sudo dnf install fcitx-qt5
$ sudo dnf install fcitx-configtool

2. Tạo cấu hình cho fcitx

Tạo file fcitx.sh trong thư mục /etc/profile.d/, và thêm vào nội dung sau:

#!/bin/bash
export XMODIFIERS="@im=fcitx"
export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx

3. Khởi động lại hệ thống và mở fcitx để gõ Tiếng Việt

Note : để gõ được chữ ư=uw ơ=ow chọn Enable Marco trong phần cấu hình của Fcitx.

15 tháng 9, 2016

Kiểm soát quyền truy cập tới các thuộc tính của một Class trong Java

            | Class | Package | Subclass | Subclass | World  |
            |       |         |(same pkg)|(diff pkg)|        |
————————————+———————+—————————+——————————+——————————+————————+
public      |   +   |    +    |    +     |     +    |   +    |
————————————+———————+—————————+——————————+——————————+————————+
protected   |   +   |    +    |    +     |     +    |   o    | 
————————————+———————+—————————+——————————+——————————+————————+
no modifier |   +   |    +    |    +     |     o    |   o    |
————————————+———————+—————————+——————————+——————————+————————+
private     |   +   |    o    |    o     |     o    |   o    |
--------------------------------------------------------------
+ : accessible
o : not accessible

13 tháng 9, 2016

Tạo Trigger tự động ghi lại thời gian sửa đổi lần cuối của dữ liệu trong PostgreSQL

1. Tạo Trigger Function

Tạo Trigger Function trên column có tên last_updated:

CREATE OR REPLACE FUNCTION public.update_timestam()
  RETURNS trigger AS
$BODY$
BEGIN
    NEW.last_updated = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql;

2. Tạo Trigger

Tạo Trigger cho bảng tbl_books.

CREATE TRIGGER trigger_upd_timestamp_last_updated_tbl_books
  BEFORE UPDATE
  ON public.tbl_books
  FOR EACH ROW
  EXECUTE PROCEDURE public.update_timestamp();

Note: bảng tbl_books phải có column last_updated.

Một số lệnh khi sử dụng PostgreSQL

# Import sql dump file trong postgresql database:
$ psql -h hostname -d databasename -U username -f file.sql

# Kiểm tra <code>postgres client</code> version:
$ psql -V

# Để có thể thao tác trên postgres server ta cần kết nối tới postgres server, 
# để làm được điều này cần phải login vào hệ thống với quyền của postgres user.
$ sudo su - postgres

# Sau khi đã kết nối với postgres server, ta có thể thực hiện kết nối với database mặc định postgres như sau:
$ psql

# Kết nối với một database bằng một user cụ thể:
$ psql -d database_name -U user_name

Kết nối với database khác:

postgres=# \c database_name

Liệt kê toàn bộ relation của một database:

database_name-# \d

Liệt kê toàn bộ schema của một database:

database_name-# \dn

Liệt kê toàn bộ table của một database:

database_name-# \dt

Liệt kê toàn bộ sequence của một database:

database_name-# \ds

Hiển thị mô tả chi tiết một table:

database_name-# \d table-name

Hiển thị database đang connect:

bashdatabase_name-# \c

Thay đổi màu sắc highlight Logcat trong Android Studio

Với màu sắc highlight Locat mặc định trong theme Dracula thì rất khó để nhận ra từng loại log.

Darcula theme Logcat highlighting

Ta có thể sửa lại màu sắc highlight Logcat theo theme Android Holo để dễ dàng nhận biết từng loại log khác nhau.

Holo theme Logcat highlighting

Để làm được điều này ta thực hiện như sau:

  • Trên thanh công cụ menu chọn File|Settings
  • Tiếp theo trong phần Settings, chọn Editor|Colors & Fonts|Android Logcat
  • Click vào Save As… button và tạo color schema mới
  • Thay đổi tất cả màu sắc theo ‘Holo theme colors’ (Bỏ lựa chọn ‘Use inherited attributes’ đối với từng loại màu)
Assert:  #AA66CC
Debug:   #33B5E5
Error:   #FF4444
Info:    #99CC00
Verbose: #FFFFFF
Warning: #FFBB33
Holo theme colors

Cài đặt Genymotion trên Ubuntu

1. Cài đặt VirtualBox

Mở Terminal thực hiện lệnh sau:

$ sudo apt-get install virtualbox

2. Cài đặt Genymotion

Vào trang chủ của Genymotion đăng ký tài khoản (nếu chưa có) và tải về phiên bản mới nhất.

Thay đổi quyền truy cập tập tin, cho phép thực thi đối với tập tin vừa tải về.

Ví dụ:

$ chmod +x ~/Downloads/genymotion-2.8.0-linux_x64.bin

Tạo thư mục cài đặt Genymotion, và đặt tập tin đã tải về vào đó.

Ví dụ:

$ mkdir ~/Programs
$ mv ~/Downloads/genymotion-2.8.0-linux_x64.bin ~/Programs

Thực hiện cài đặt tập tin bên trong thư mục vừa tạo.

$ cd ~/Programs
$ ./genymotion-2.8.0-linux_x64.bin

2 tháng 4, 2016

Enable Icons Menus Trong Hệ Điều Hành Linux

Mặc định trong UbuntuFedora icon menu bị tắt đi. Dưới đây là cách bật icon menu trong hệ điều hành Linux:
Để bật chế độ menuicon, cần thực hiện lệnh sau:
#!/bin/bash
~$ gsettings set org.gnome.desktop.interface menus-have-icons true

hoặc:

~$ gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gtk/ButtonImages': <1>, 'Gtk/MenuImages': <1>}"

Password confirm validator sử dụng Hibernate Validator

Cách tạo và kiểm tra tính hợp lệ của mật khẩu xác nhận khi đăng kí tài khoản sử dụng hibernate-validator

...
@Transient
private boolean passwordConfirmValid;
public void setPasswordConfirmValid(boolean passwordConfirmValid) {
this.passwordConfirmValid = passwordConfirmValid;
}
@AssertTrue(message = "Password do not match.")
public boolean isPasswordConfirmValid() {
if (this.password == null) {
passwordConfirmValid = this.password_again == null;
} else {
passwordConfirmValid = this.password_again.equals(this.password);
}
return passwordConfirmValid;
}
...
view raw Account.java hosted with ❤ by GitHub
...
<div class="form-group">
<sForm:label path="account.password" title="Password" cssClass="control-label col-sm-2">Password:</sForm:label>
<div class="col-sm-6">
<sForm:password path="account.password" title="Password" placeholder="Password" cssClass="form-control" />
<sForm:errors path="account.password" cssClass="error" />
</div>
</div>
<div class="form-group">
<sForm:label path="account.password_again" title="Password Again" class="control-label col-sm-2">
Password Again:</sForm:label>
<div class="col-sm-6">
<sForm:password path="account.password_again" title="Password Again" placeholder="Password Again"
class="form-control" />
<sForm:errors path="account.password_again" cssClass="error" />
<sForm:errors path="account.passwordConfirmValid" cssClass="error" />
</div>
</div>
...

Tùy chỉnh ngoại lệ không tìm thấy tài nguyên khi duyệt web trong Spring MVC

@Controller
public class BookController {
private static final Logger logger = LoggerFactory.getLogger(BookController.class);
@Autowired
@Qualifier("bookService")
private BookService bookService;
@Autowired
@Qualifier("cartBean")
private Cart cartBean;
@ExceptionHandler(ResourceNotFoundException.class)
public String handleResourceNotFoundException(HttpServletRequest request) {
HttpSession session = request.getSession(true);
session.setAttribute("cartBean", cartBean);
return "404page";
}
@RequestMapping(value = "/book/detail/{bookId}")
@SuppressWarnings("unchecked")
public String details(@PathVariable("bookId") long bookId, Model model, HttpServletRequest request) {
logger.info("Show Book Detail Page");
HttpSession session = request.getSession(false);
Book book = null;
if (session != null && session.getAttribute("books") != null) {
List<Book> books = (List<Book>) session.getAttribute("books");
for (Book b : books) {
if (b.getId() == bookId) {
book = b;
model.addAttribute("book", b);
break;
}
}
if (book == null) {
throw new ResourceNotFoundException();
}
} else {
book = bookService.findBook(bookId);
if (book == null) {
throw new ResourceNotFoundException();
}
model.addAttribute("book", book);
}
return "book-detail";
}
}
@Controller
@SessionAttributes(names = "cartBean")
public class ResourceNotFoundController {
@Controller
@SessionAttributes(names = "cartBean")
public class ResourceNotFoundController {
@Autowired
@Qualifier("cartBean")
private Cart cartBean;
@RequestMapping("/404")
public String handleResourceNotFound(Model model, HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null) {
model.addAttribute("cartBean", cartBean);
}
return "404page";
}
}
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
private static final long serialVersionUID = -3329819391367130855L;
}

Tạo desktop launcher cho Eclipse trong hệ điều hành Linux

1. Tạo file eclipse.desktop

Sử dụng một editor bất kì để tạo file trong thư mục /usr/share/applications.

Ví dụ sử dụng gedit:

$ sudo gedit /usr/share/applications/eclipse.desktop

2. Thêm nội dung sau vào file vừa tạo và lưu lại.

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse
Comment=Eclipse Mars 4.5.1
Exec=/path/to/your/eclipse_folder/eclipse
Icon=/path/to/your/eclipse_folder/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true

1 tháng 4, 2016

Cách tạo mã tự động tăng trong PostgreSQL

Ví dụ tạo cột book_id tự động tăng trong bảng tbl_books

  1. Tạo sequences tự động tăng giá trị cho cột book_id:

    CREATE SEQUENCE public.book_id_seq
    INCREMENT 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    START 10000
    CACHE 1;
    ALTER TABLE public.book_id_seq
    OWNER TO postgres;
    view raw book_id_seq.sql hosted with ❤ by GitHub
  2. Tạo bảng tbl_books sử dụng sequences đã tạo trước đó:

    CREATE TABLE public.tbl_books
    (
    book_id bigint NOT NULL DEFAULT nextval('book_id_seq'::regclass),
    CONSTRAINT pk_book_id PRIMARY KEY (book_id)
    )
    WITH (
    OIDS=FALSE
    );
    ALTER TABLE public.tbl_books
    OWNER TO postgres;
    view raw tbl_books.sql hosted with ❤ by GitHub

Cài đặt Oracle JDK trong Ubuntu

  1. Thông báo cho hệ thống biết nơi chứa jdk
  2. $ sudo update-alternatives --install "/usr/bin/java" java "/opt/java/oracle_jdk/bin/java" 1
    $ sudo update-alternatives --install "/usr/bin/javac" javac "/opt/java/oracle_jdk/bin/javac" 1
    $ sudo update-alternatives --install "/usr/bin/jar" jar "/opt/java/oracle_jdk/bin/jar" 1
    $ sudo update-alternatives --install "/usr/bin/javaws" javaws "/opt/java/oracle_jdk/bin/javaws" 1

  3. Mở file PATH của hệ thống:
  4. Mở Terminal và gõ lệnh sau:

    $ sudo gedit /etc/profile.d/jdk.sh

    hoặc:

    $ sudo vi /etc/profile.d/jdk.sh

  5. Sửa file PATH của hệ thống:
  6. Thêm vào các dòng lệnh sau:

    #!/bin/bash
    export JAVA_HOME=/opt/java/oracle_jdk
    export PATH=$PATH:$JAVA_HOME/bin

  7. Logout hoặc khởi động lại.
Lưu ý: Cài đặt Maven tương tự nhưng chỉ cần sửa PATH của hệ thống là được.

16 tháng 1, 2016

Một số thẻ trong HTML5

  1. Thẻ <site>
  2. Thẻ <site>: Xác định tên của một tác phẩm (ví dụ: một quyển sách, một bài hát, một bức tranh, một chương trình truyền hình...)

    <img src="https://cdn-images-1.medium.com/max/600/1*Yja7DqjrBPJuHaw1QZ6iwg.jpeg" width="220" height="277" alt="The Scream">
    <p><cite>The Scream by Edward Munch. Painted in 1893.</p>
    

    Kết quả:

    The Scream

    The Scream by Edward Munch. Painted in 1893.

  3. Thẻ <mark>
  4. Thẻ <mark>: Sử dụng khi muốn làm nổi bật một đoạn văn bản

    <p>Do not forget to buy <mark>milk</mark> today.</p>

    Kết quả:

    Do not forget to buy milk today.

8 tháng 1, 2016

Một số annotation trong Spring

Sau đây là một số annotation trong Spring Framework cần biết:

Spring Core annotation

@Autowired: Tự động liên kết các bean được sử dụng trong các class với các bean được Spring Container sinh ra và quản lý.

// @org.springframework.beans.factory.annotation.Autowired
@Service
public class BookServiceImpl implements BookService {
 
  @Autowired
  private BookDao bookDao;

  @Autowired
  private CustomerDao customerDao;
   
  ...
}

@Scope: mặc định trong Spring, hầu hết scope phổ biến cho các autodetected componentssingleton (singleton: Với mỗi bean, Spring IoC Container chỉ tạo duy nhất một đối tượng), để thay đổi phạm vi ta sử dụng @Scope annotation).

// @org.springframework.context.annotation.Scope
@Component
@Scope("request")
public class ContactResource {
...
}

Stereotyping Annotations

@Component: dùng để đánh dấu một class sẽ được tạo bean

// @org.springframework.stereotype.Component
@Component
public class ContactResource {
...
}

@Repository: dùng để đánh dấu các lớp Repository hoặc Dao của Spring. Mọi truy cập dữ liệu logic tới cơ sở dữ liệu sẽ đặt trong các lớp này.

// @org.springframework.stereotype.Repository
@Repository
public class BookDaoImpl implements BookDao {
...
}

@Service: dùng để đánh dấu các lớp Service. Tất cả xử lý nghiệp vụ logic sẽ đặt trong các lớp Service.

// @org.springframework.stereotype.Service
@Service
public class BookServiceImpl implements BookService {
...
}

Transaction Annotations

@Transactional: dùng để đánh dấu các class có sử dụng đến transaction, các transaction này sẽ được trao cho Spring quản lý.

// @org.springframework.transaction.annotation.Transactional
@Service
@Transactional(readOnly = true)
public class BookServiceImpl implements BookService {
 
  @Autowired
  private BookDao bookDao;
 
  @Transactional
  public Book findByName(String name) {
 
    Book book = bookDao.findByName(name);
    return book;
  }
  ...
}

Spring MVC Annotation

@Controller: dùng để đánh dấu lớp Controller

// @org.springframework.stereotype.Controller
@Controller
public class LoginController {
...
}

@RequestMapping: dùng để ánh xạ tới các URL lên toàn bộ một class hay một phương thức xử lý riêng. Thông thường dùng để ánh xạ một request path (hoặc path pattern) tới một controller.

// @org.springframework.web.bind.annotation.RequestMapping
@Controller
@RequestMapping("/login")
public class LoginController {
 
  @Autowired
  private UserService userService;
...
}

@RequestParam: dùng để gán một request parameter vào một parameter của phương thức.

// @org.springframework.web.bind.annotation.RequestParam
@Controller
@RequestMapping("/user")
public class LoginController {
 
  @RequestMapping("/login")
  public String listCompanies(@RequestParam String username, @RequestParam String password) {
    if(username.equals("admin") && password.equals("mypass")){
       return "welcome";
    } else {
       return "login?login=fail";
    }
  }
...
}

@InitBinder: dùng để đánh dấu một phương thức có tùy biến các ràng buộc dữ liệu.
@SessionAttribute: Chỉ định một modelAttribute sẽ được lưu trong session.

Spring Security Annotation

@PreAuthorize: được dùng để cho phép hoặc từ chối sử dụng một phương thức. Trong ví dụ dưới đây, chỉ những đối tượng user có quyền Admin mới có thể xóa được một đối tượng contact:

// @org.springframework.security.access.prepost.PreAuthorize
@Transactional
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void removeContact(int id) {
    contactDao.removeContact(id);
}