Con trỏ hàm trong Java

Tuy được vay mượn rất nhiều từ C/C++, nhưng một số thứ vốn rất quen thuộc với lập trình viên lại không xuất hiện trong Java. Con trỏ và con trỏ hàm là một ví dụ. Trong cái khó lại ló cái khôn, interface là cách dễ nhất để thực hiện điều này.

Ở đây tôi minh họa bằng chương trình tính 2 số dựa trên hàm callback được truyền vào (cộng, trừ…).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface IOperator {
    public int Execute(int a, int b);
}
 
public class OperatorPlus implements IOperator {
    public int Execute(int a, int b) {
        return a + b;
    }
}
 
public class OperatorMinus implements IOperator {
    public int Execute(int a, int b) {
        return a - b;
    }
}

Tạo một interface toán tử, sau đó 2 class toán tử cộngtrừ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class FunctionPointerImplement {
 
    public static void main(String[] args) {
        System.out.println(DoMathematical(12, 6, new OperatorPlus()));
 
        IOperator minus = new OperatorMinus();
        System.out.println(DoMathematical(20, 9, minus));
 
        IOperator plus = new OperatorPlus();
        System.out.println(DoMathematical(32, 187, plus));
    }
 
    public static int DoMathematical(int a, int b, IOperator Operator) {
        return Operator.Execute(a, b);
    }
}

Hàm DoMathematical sẽ được gọi và nhận vào 2 toán hạng cùng với toán tử cần thực hiện.

Posted in Programming | Tagged , | Leave a comment

Sub-string trong C

substr là dành cho string trong C++, mà mình lại đưa nó vào mã C.

Ok, vậy tương đương với nó là copy chuỗi đó bắt đầu tự địa chỉ của ký tự cần cắt cho đến độ dài cần thiết.

1
2
memcpy (buff, &(inpStr[startPos]), strLen); // or strncpy
buff[strLen] = '\0';
Posted in Programming | Tagged , | Leave a comment

Linus Torvalds giành giải thưởng công nghệ tương đương với Nobel: giải Công nghệ Thiên niên kỷ

[Linus Torvalds wins the tech. equivalent of a Nobel Prize: the Millennium Technology Prize — ZDNet]

Cha đẻ của Linux — Linus Torvalds — là một trong hai người được Giải thưởng Công nghệ Thiên niên kỷ (Millennium Technology Prize). Giải thưởng này được ví như lĩnh vực công nghệ của giải Nobel.

Linus Torvalds, cha đẻ của Linux, đã giành giải thưởng công nghệ cao quý nhất

Linus Torvalds, cha đẻ của Linux, đã giành giải thưởng công nghệ cao quý nhất

Bạn có thể giành giải Nobel vật lý, hóa học và y học, nhưng còn công nghệ? Câu trả lời là không. Tuy nhiên, vẫn có giải thưởng Công nghệ Thiên niên kỷ. Đây là giải thưởng công nghệ lớn nhất thế giới. Nó được trao mỗi hai năm dành cho sáng tạo mang tính công nghệ góp phần cải thiện đáng kể chất lượng cuộc sống của con người, hiện tại và trong tương lai. Năm nay, Linus Torvalds, cha đẻ của Linux, và tiến sĩ Shinya Yamanaka, người tìm ra cách mới để tạo các tế bào thân (cuống) mà không dùng các tế bào phôi, cả hai đã giành được giải thưởng Công nghệ Thiên niên kỷ 2012.

Giải thưởng được trao bởi Viện hàn lâm Công nghệ Phần Lan (Technology Academy of Finland), là một trong các giải thưởng lớn nhất thế giới với các ứng viên được tìm thấy từ khắp nơi trên thế giới từ tất cả các lĩnh vực công nghệ. Hai nhà phát minh sẽ chia nhau số tiền một triệu Euro. Người chiến thắng cuối cùng sẽ được công bố bởi tổng thống nước Cộng hòa Phần Lan trong một nghi lễ đặc biệt vào ngày 13 tháng sáu 2012.

Gallery: The 20 most significant events in Linux’s 20-year history

Những người giành giải thưởng trước đây bao gồm giáo sư Tim Berners-Lee, người sáng tạo ra Web, giáo sư Robert Langer cho sáng chế của ông và sự phát triển các chất liệu bộ phận nhân tạo mang tính cách tân cho điều khiển việc giải phóng chất kích thích và sự tái tạo mô; và giáo sư Michael Gratzel cho các phát triển sáng tạo của ông trong các tế bào năng lượng mặt trời (Dye-sensitized solar cell).

Theo Jim Zemlin, giám đốc điều hành tại Linux Foundation, “giải Công nghệ Thiên niên kỷ cũng giống như giải Nobel Hòa bình của công nghệ”. “Linus Torvalds là hiện thân của sáng tạo và tinh thần cộng tác mà giải thưởng này nhắm đến, và chúng ta chúc mừng anh với huy chương to lớn này”.

Để đáp lại giải thưởng này, theo Linus, “Phần mềm rất quan trọng trong thế giới hiện đại không hẳn phải được phát triển thông qua mã nguồn mở. Sức ảnh hưởng thật sự của Linux là cách cho phép mọi người và các công ty xây dựng trên nó để làm công việc của họ. Chúng ta cuối cùng đã chỉ ra rằng “dữ liệu chỉ là dữ liệu”, và chúng ta không có tất cả các kênh giao tiếp đặc biệt điên cuồng này cho các hình thức khác nhau của dữ liệu”.

Liệu có phải là xứng đáng? Phán xét này dành cho bạn. Kể từ khi Torvalds tạo ra Linux năm 1991, nó đã trở thành hệ điều hành xuất hiện nhiều nhất trên thế giới, sức mạnh của các điện thoại Android phổ biến và 9 trên 10 thị trường tài chính; nó chạy Amazon, Facebook, Google, Twitter và các mạng lớn khác. Nó là hệ điều hành thống trị siêu máy tính, hỗ trợ 9 trong số 10 hệ thống chính này, và là nền tảng ưa thích cho điện toán đám mây. Yes, tôi nghĩ chúng ta có thể nói rằng giải thưởng này là hoàn toàn xứng đáng.

Chúc mừng Linus!

Posted in Computer | Tagged , | Leave a comment

The Hacker News Magazine

Issue 07 | December 2011 | Who we are?

THN Magazine is a free monthly magazine designed to spread awareness and knowledge about cyber security. Our goal is to provide the most up-to-date information on a wide variety of topics that relate to hackers and security experts worldwide.

We welcome contributions from readers and hackers like YOU! Simply submit your idea or article to thehackernews@gmail.com and your submission could be featured in our next edition.

Some topics of interest include, but are not limited to:

  • New attack and defense techniques
  • Vulnerability discovery
  • Small tactics and techniques; Big attacks and impact
  • Mobile hacking
  • Professional exploit development
  • Security and hacking events around the world
  • Technical book reviews
  • Security and hacking threats
  • Security tools
  • Expert interviews

All Issues Download Free

Posted in Book | Tagged , , | Leave a comment

Entry test tại Global CyberSoft

Đã giải quyết xong vấn đề việc làm, nên việc có được vào làm tại Global CyberSoft (GCS) trong lúc này hay không, không còn quan trọng. Nhưng entry test vào ngày 30/3 vừa rồi thì không thể bỏ qua, vì nó có thể giúp tích lũy thêm chút ít kinh nghiệm.

Test ở GCS khá sát với thực tế, nào là OOP, các loại diagram, design pattern, đọc code, SQL, và 2 câu cuối cùng là tự code trên giấy bằng bất kỳ ngôn ngữ nào mà bạn biết.

#1 Nghịch đảo chuỗi theo từ

Cho 1 chuỗi, ví dụ “student am I”, nghịch đảo chuỗi này theo từ để có được kết quả “I am student”.

Lúc đó, mình lại quên mất triết lý UNIX, code tất cả trong một hàm và kết quả là rất khó đọc, khó hiểu và rất nhiều bug.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void swap_char (char *chr1, char *chr2)
{
  char tmp = *chr1;
  *chr1 = *chr2;
  *chr2 = tmp;
}
 
void reverse_string (char *str, int from, int to)
{
  while (from < to) swap_char (&(str[from++]), &(str[to--]));
}
 
char * reverse_word (const char *str)
{
  int from, to;
  int length = strlen (str);
 
  char *buffer = (char*) calloc (length + 1, sizeof (char));
  strcpy (buffer, str);
 
  // Reverse entire the string
  reverse_string (buffer, 0, length - 1);
 
  // Then, reverse again for each words
  for (from = 0, to = 0; to <= length; to++)
  {
    if (buffer[to] == ' ' || buffer[to] == '\0')
    {
      // Don't reverse if word has only one-character
      if (from != to - 1) reverse_string (buffer, from, to - 1);
      from = to + 1;
    }
  }
 
  return buffer;
}
 
int main (int argc, char **argv)
{
  printf ("%s\n", reverse_word ("student am I"));
  printf ("%s\n", reverse_word ("Fool a You"));
  printf ("%s\n", reverse_word ("string a is this"));
 
  return 0;
}

#2 Tính tổng tất cả các ký số trong số nguyên

Cho một số nguyên, ví dụ 3672, tính tổng tất cả các ký số trong số nguyên này
ví dụ: 3 + 6 + 7 + 2 = 18

Nếu kết quả có từ 2 ký số trở lên, lặp lại bước trên cho đến khi chỉ còn 1 ký số
ví dụ: 1 + 8 = 9 → stop

Sao suy nghĩ của mình lúc đó lại đơn giản quá vậy, chuyển số này thành chuỗi, duyệt từng ký tự rồi tìm kết quả dựa trên mã ASCII.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int sum_up_all_digits (int number)
{
  int result = 0;
 
  while (number != 0)
  {
    result += (number % 10);
    number /= 10;
  }
 
  return result;
}
 
int one_digit (int number)
{
  while (number >= 10) number = sum_up_all_digits (number);
 
  return number;
}
 
int main (int argc, char **argv)
{
  printf ("%d\n", one_digit (3672));
  return 0;
}
Posted in Diary | Tagged , | Leave a comment
  • Email Newsletter

    Đăng ký nhận thông báo khi có bài viết mới qua email.

  • Subscribe to RSS feed Add to Circles Follow on Twitter Send an e-mail