Trích dẫn




Only a person who risks is truly free.


Ảnh

Ảnh

Chủ Nhật, 25 tháng 10, 2015

Thứ Năm, 3 tháng 9, 2015

Một vấn đề được giải quyết

Rất hay coi show này. Jimmy và khán giả đều tin rằng mình được "decision" nhưng thực ra là không :))
https://www.youtube.com/watch?v=gHEOFx9YWKU&list=RDiuBtCLg4BJg&index=4

Chủ Nhật, 30 tháng 8, 2015

Định lý Dirichlet và bữa cơm tối

Ví dụ bạn chịu trách nhiệm phải dọn cơm tối cho gia đình. Nhiệm vụ của bạn chỉ là lấy đũa cho các thành viên của gia đình. Trời thì lại bị cúp điện, chả nhìn ra cây đũa nào với cây đũa nào. Hôm qua có một buổi tiệc mừng bạn vào đại học, thế là có rất nhiều loại đũa được đưa vào trong kệ bát đĩa mà chưa phân loại (giả sử số đôi đũa mỗi loại đều nhiều hơn số người). Vậy làm thế nào để lấy đủ đũa cho đình mà mỗi chiếc trong đôi ko khác loại. :D yes, Dirichlet theorem. 
Có thể thấy là tùy vào số loại đũa mà bạn cần lấy số đũa cần thiết. Ví dụ gia đình 4 người, có 1 loại đũa thì hẳn là lấy 8 cây, 2 loại đũa thì lấy 9 cây, 3 loại thì lấy 10 cây. 
Một ứng dụng vui vẻ của định lý Dirichlet. 

Thứ Tư, 19 tháng 8, 2015

Google trên command line


Lập trình viên thì nên hạn chế sử dụng chuột :D đang sài cmd mà cứ phải chuyển tab qua trình duyệt để tìm kiếm thì "mệt" quá, nhất là những vẫn đề chỉ cần xem ví dụ là hiểu hoặc chỉ cần liếc sơ qua google là được, thì làm ngay trên cmd là quá tiện. Mình mới viết cái script trên python 2.7 để "google".
Có một số lỗi nhỏ nhưng không ảnh hưởng gì, lần sau có cập nhật thì mình sẽ tìm cách sửa luôn và update thêm tính năng qua trang và truy cập link, cũng đơn giản nhưng đang bận quá :D đồng thời thêm một số option.
Các bạn có thể build thành exe và tạo biến môi trường cho nó, mình thì build thành go.exe, giờ chỉ cần "go Vu Ngoc Minh Hoang" là xong. Rất tiện.
Trên terminal cũng tương tự.
---------------------------
# -*- coding: utf8 -*-

# Dev: Vu Ngoc Minh Hoang  
# Public: 19-08-2015
# Version: 1.0
# Example: go Vu Ngoc Minh Hoang
from urllib2 import urlopen
from urllib2 import HTTPError
import urllib2
import sys
import re
import string
def mergerURL():
url = 'https://www.google.com/search?q='
for i in range(1,len(sys.argv)):
url = url + str(sys.argv[i]) + '+'
return url

if __name__ ==  '__main__':
#fake the mozilla headers
header = {'User-Agent' : 'Mozilla/5.0 (X11; U; Linux i686; en-US)AppleWebKit/533.2(KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2'}

#merger url
url = mergerURL()

#make request
req = urllib2.Request(url, headers=header)

#creat streamreader
try:
fpage = urlopen(req);
except HTTPError, e:
print "Error: ", e.code, e.reason

print "Read data complete"
#regex
ftitle = re.compile(r'<!--m-->.*?\)">(.*?)</a></h3>.*?<!--n-->')
flink = re.compile(r'<h3 class="r"><a href="(.*?)"')
fcontent = re.compile(r'<span class="st">(.*?)</span><')
###ftitle = re.compile(r'<!--m-->(.*?)<!--n-->')
#fix content
fix = re.compile('(<em>)|(</em>)|(&nbsp)|(</span>)|(<span class="f">)|(<wbr>)')

while True:
lnk = fpage.readline();
#print lnk
if not lnk:
break
else:
rtitle = ftitle.findall(lnk)
rlink = flink.findall(lnk)
rcontent = fcontent.findall(lnk)
if rtitle:
for i in range(len(rtitle)):
print u"[*]", rtitle[i],'\n|', rlink[i], '\n|', fix.sub('',rcontent[i]), '\n'
fpage.close()

#Mình đã update một số option và ngôn ngữ tiếng việt, trên cmd có vẻ như không hiển thị được tiếng việt, tạm thời sử dụng trên powershell nhé :D nhớ chọn font Consolas để hỗ trợ unicode
#Lần update tiếp theo không biết làm gì nhỉ? Truy cập link?
#Mình đã update phần setup cho nó, có vẻ hơi khó chịu khi nó đòi chạy với quyền Admin, nhưng để mình tìm cách fix đã
Chờ feedback của các bạn, các update mới nhất đều có trên github
Link GitHub: https://github.com/RokHoang/Google

Thứ Năm, 9 tháng 7, 2015

Project dịch video hướng dẫn lập trình Android

Các bạn có thể tham gia tự do, sử dụng Slack để trao đổi với nhau trong Project. (daynhauhoc.slack.com)
Project dịch phụ đề khóa học Android trên Youtube:
http://daynhauhoc.com/t/project-dich-phu-de-khoa-hoc-android-tren-youtube-grin/9248 
https://www.youtube.com/playlist?list=PLAwxTw4SYaPnMwH5-FNkErnnq_aSy706S

Thứ Sáu, 26 tháng 6, 2015

Chơi microcorruption.com

Một dạng CTF chơi khá vui
"Mở tung chương trình ra và hiểu nó hơn cả người viết nó"
microcorruption.com
Hiện mình đang đứng cứng ngắc ở level whitehorse :(( có lẽ chỉ cần ghi đè lên bộ nhớ thôi nhưng sao không pass qua được.

Thứ Tư, 17 tháng 6, 2015

Thứ Ba, 16 tháng 6, 2015

Thứ Hai, 15 tháng 6, 2015

Some applications of Linear Tranformation

I have found some links of Linear Tranformation. What is image and kernel of LT?
Mathinsight
HMC
and I also have solution for "Fibonanci". It uses LT and mutiple of vector.
Phd_NQH
how did they found the matrix to solve the problem?

Thứ Bảy, 13 tháng 6, 2015

Quine

I will show you a script that prints itself. The scripts like this is called "Quine". It is useful for writing a virus or doing something...

#include <stdio.h>
int main()
{
char *c="#include <stdio.h>%cint main(){%c%cchar *c=%c%s%c;%c%cprintf(c,10,34,c,34,10,10,10);%c%creturn 0;%c}";
printf(c,10,10,9,34,c,34,10,9,10,9,10);
return 0;
}

It is not complicated but you may need some trick to write Quine-script. You can write a program that rewrite any script to the Quine-Script.



Dọn phòng học

Cũng không bày biện nhiều :D rất thích nghe nhạc




Thứ Sáu, 12 tháng 6, 2015

Obfuscated C code

Tránh reverse-engineering (RE) mà lại còn được luyện mắt.
Bài của TS Ngô Quang Hưng: Thuật toán tồi tệ nhất

Asm trên 8086 và 80386

80386 sẽ hỗ trợ nhiều hơn đặc biệt là thực hiện lệnh ở Protected Mode, các flag cũng được tăng thêm và đổi tên một chút.
http://webcache.googleusercontent.com/search?q=cache:http://www.embeddedcraft.org/compareprocessor.html

Thứ Hai, 8 tháng 6, 2015

Tìm bao lồi của một tập điểm

Tìm bao lồi của tập hợp điểm: Đây là bài toán rất hay gặp. Hay còn gọi là bài toán "Gift Wrapping". Cho n điểm trên mặt phẳng tìm một hình đa giác lồi bao trùm các điểm đó. Ý tưởng để tìm khá đơn giản.
Step 1: Tìm một điểm chắc chắn thuộc đa giác lồi.
Step 2: Tìm các điểm tiếp theo sao cho gốc của nó và cạnh trước nó lớn nhất.
Step 3: Dừng lại khi điểm đầu điểm cuối trùng nhau.

step 1 chúng ta có thể tìm điểm ngoài cùng bên trái (tọa độ x nhỏ nhất) làm điểm khởi đầu.
step 2 thì chúng ta tính góc các cạnh và tìm được điểm tiếp theo. Với điểm thứ 2 thì chúng ta so với vector j (trục tung).

Mở rộng: Tìm chu vi hình chữ nhật nhỏ nhất chứa các điểm này? (Best Fit Rectangle)



Chúng ta cũng sẽ tìm bao lồi của tập hợp đỉnh và quy về bài toán tìm hình chữ nhật ngoại tiếp đa giác.
Để tìm hình chữ nhật một cách đơn giản thì ta giả sử một cạnh của đa giác cũng là cạnh của hình chữ nhật đó. Như hình bên dưới.


Khi đã có cạnh đáy thì ta chỉ cần tìm điểm cách xa cạnh đó nhất và lấy đó làm chiều cao của hình chữ nhật. Với hình đa giác n đỉnh thì ta cần thực hiện n*(n-2) phép tính để tìm ra hình chữ nhật đó.
Thường dùng trong các game va chạm, kiểm tra va chạm giữa 2 vật thể hoặc tìm chu vi sân nhỏ nhất.

Thứ Bảy, 16 tháng 5, 2015

Nước ngoài đi học vật lý


Người mặc áo xanh trong video là Dan Burns. Ông này đề xuất ra một "Visualized" cho trọng lực. Chỉ với một tấm màn, chục viên bi (thêm một cây gậy) là có thể mô phỏng được rất nhiều tính chất của trọng lực. Theo như trong video thì ổng nói có thể biểu diễn được lực hút của 2 vật, sự mất dần năng lượng, quỹ đạo của các vệ tinh, earth system, năng lượng tối, tương tác giữa trái đất và mặt trăng lên 1 vật thể,...
Thiết nghĩ, trường học ở Việt Nam đã cung cấp đầy đủ thiết bị rồi. Thay tấm màn xanh bằng tấm màn cửa lớp học, bi thì lấy bi bị tịch thu của học sinh (cái này thì thừa), cây gậy thì thay bằng cây thước. Chả cần tốn chi phí gì thêm mà có khi học sinh cấp 1 cũng có thể hiểu được về mấy thứ phức tạp này.

Thứ Năm, 7 tháng 5, 2015

Nghệ thuật truy vết

Tình hình là hôm bữa bị đánh rơi cái ví. Cả tuần chả tập trung vào việc gì được. Dán tờ rơi, huy động nhân lực khắp nơi, nay có người gọi điện báo trả.
Ok, nghệ thuật truy vết (series này để ăn mừng)
Truy vết (Trace) thường được dùng cùng với các thuật toán quy hoạch động. Một bảng giá trị cho trước và từ đó dò tìm ra các bước đã đi qua :D rất hay rất hay
continous...

Chủ Nhật, 26 tháng 4, 2015

Vài blog hay :D

Mình đang theo dõi vài blog này, nhiều kiến thức quá
http://vuontoanblog.blogspot.com/2015/04/Taylor-series.html
http://thichhoctoan.net/page/2/
https://vuhavan.wordpress.com/

Thứ Bảy, 25 tháng 4, 2015

Đi tìm bội chung nhỏ nhất (3 số). BCNN của 3 số liên tiếp.

Hôm nay lên đồng, từ cái chương trình cơ bản phát triển lên thành chương trình tối ưu luôn (maybe) :D
Có một bạn, chia sẻ trên daynhauhoc một chương trình để tìm BCNN của 3 số.
Các bước tìm của bạn ấy như sau:
  1. Tìm max của 3 số, ta gọi là GREATEST
  2. Vào for cho i chạy từ GREATEST đến vô cùng, nếu i chia hết cho 3 số thì là số cần tìm. 
Lang thang vào, thấy hợp lý quá. Cơ mà, để ý, thằng GREATEST+1, GREATEST+2 cũng không chia hết cho GREATEST. Ít nhất thì nó cũng phải bằng 2 lần GREATEST thì mới chia hết cho GREATEST chứ. Thế là một cải tiến mới ra đời. (Cải tiến 1)
  1. Tìm max của 3 số, ta gọi là GREATEST
  2. Kiểm tra GREATEST có phải BCNN hay không.
  3. Vào for cho i chạy từ GREATEST*2 đến vô cùng, nếu i chia hết cho 3 số thì là số cần tìm. 
Lại lên đồng, mình thấy thằng (GREATEST*2)+1 cũng đâu có chia hết cho GREATEST đâu. Thằng (GREATEST*3)+1 cũng không chia hết luôn. Rồi, cải tiến, again (Cải tiến 2)
  1. Tìm max của 3 số, ta gọi là GREATEST
  2. Vào for cho i chạy từ 1 đến vô cùng, nếu i*GREATEST chia hết cho 2 số thì là số cần tìm.
Lần cải tiến vừa rồi thì lời hơn nhiều, chỉ phải kiểm tra chia hết cho 2 số còn lại thôi. Các cải tiến trên đều dựa theo điều kiện cần "Nếu một số là BCNN của 3 số thì nó cũng là bội của mỗi số".

Vậy còn cải tiền nào nữa không?
Còn!!! Chúng ta có thể cải tiến thằng (Cải tiến 1) lên theo hướng khác. Nếu chúng ta biết các số còn lại có chứa các số nguyên tố nào mà GREATEST chưa có. Ta chỉ cần nhân vào và kiểm tra tịnh tiến cho i tăng dần. Có thể dễ thấy với trường hợp sau. 
a=10 b=6 c=18. GREATEST=18, tồn tại 3 snt là 2,3 và 5, 2 và 3 thì ở trong 18 rồi vậy thì . ta sẽ kiểm tra số 18*5.
Cách này thì dùng cho 3 số với khoảng cách lớn và số cũng phải bự nữa.
Vậy BCNN có gì phải chú ý nữa không. Với những cảm giác như ở những cải tiến trước, ta cảm thấy 3 số liên tiếp nhau sẽ có BCNN là tích của 3 số. Ồ, sau khi ngủ dậy mình lại có một cảm giác khác. nếu a là số chẵn thì BCNN bằng tích 3 số chia 2. nếu a lẻ thì bằng tích 3 số. Muốn biết rõ hay không thì phải chứng minh đã. Chứng minh = yên tâm.

Xét trường hợp a và c là số lẻ, b là số chẵn.
a=2k+1, b=2k+2, c=2k+3
tìm bội chung nhỏ nhất của 2 số a và c đã. Ta có BCNN=(a*c)/UCLN(a,c)
UCLN của a và c có thể tìm theo thuật toán Euler và UCLN của 2 số đó = 1.
Vậy BCNN của a và c là a*c.
Ta sẽ phải tìm BCNN của a*c và b. Tích a*c=4k^2+8k+3

Về bài toán tìm bộ ba Pytago có tổng bằng một số

Bài này làm lâu rồi, hôm nay thấy nên khui lại.
Đề: Tìm bộ ba a, b, c thỏa mãn a^2+b^2=c^2, đồng thời a+b+c=X.
Mình dùng phương pháp bộ 3 số pytago tổng quát. Trong bài này thì mình sẽ lấy X=1000:D.

Công thức sau tổng quát tất cả các bộ ba số Pythagoras (không đơn trị):
a = k*(2mn)
b = k*(m2 - n2)
c = k*(m2 + n2)
trong đó m và n là hai số nguyên dương với m > n và k là số nguyên dương tùy ý.

ok, a+b+c=1000 <=> k*(2mn+2m2) = 1000 <=> k*m*(m+n)=500 (*)
Mà các số k,m,n là các số nguyên dương vậy số 1000/2 phải có ít nhất 2 ước số (k có thể bằng 1). Cách này có thể dùng để kiểm tra bài toán có nghiệm hay không với mỗi X.
Để tìm nghiệm nhanh hơn thì mình sẽ dùng ước số của 500 để chọn nhanh hơn.
Ta có 500=2.2.5.5.5 có 5 nhân tử. trong (*) ta nhận thấy có 3 thành phần là k,m và (m+n). Vậy thì có bao nhiêu cách chia 5 phần tử 2,2,5,5,5 thành 3 nhóm. Ta có thể chia 1-1-3,1-2-2, và các hoán vị.

Thứ Sáu, 24 tháng 4, 2015

Về câu chuyện du hành thời gian

Suốt 12 năm học phổ thông, môn lý là môn học đã nhất, gần gũi với thực tiễn. Đến năm lớp 10, cũng không nhớ năm nào nhưng mà cái năm học về các định luật bảo toàn. Mấy cái định luật bảo toán mới là mấu chốt của vấn đề, từ đấy các định luật đấy mới thi triển ra hàng ngàn công thức khác nhau. Bài dễ thì áp công thức vào, còn bài khó thì cứ lôi các định luật bảo toàn ra, quây quần vật lộn với nó ắt sẽ ra, không ra nữa thì chắc đề sai. Đến khi học về thuyết tương đối, cái thuyết này cũng một dạng bảo toàn, năng lượng và khối lượng có thể chuyển hóa cho nhau đều được.

Sau này, có nghe về sự tương đối giữa không-thời gian. Cũng chả nhớ đọc ở đâu hay nghe từ ai về cái gọi là "tương đối giữa không-thời gian", chắc là Star Trek. Cơ mà mình nghĩ thế này, thời gian nó cũng chỉ là một cái mốc để đánh dấu không gian, và không gian cũng là một cái mốc để đánh dấu thời gian. Ví dụ bạn đi coi phim ngoài rạp, bạn đến lúc 6:00 thì đó chính là cột mốc để đánh dấu "không gian" phim age of ultron. Còn bạn đi coi age of ultron thì đó chính là một cột mốc đánh dấu bạn đang ở "thời gian" 6:00.

Nhưng để nói rõ về không gian đã. Không gian là một trạng thái, nó rất nhiều yếu tố, nhiệt độ, ấp suất,... tất cả các yếu tố mà chúng ta cố gắng kể ra được vẫn chỉ là một phần nhỏ so với các yếu tố mà không gian đó có. Thời gian, nó không có đơn vị, nó chỉ là một cột mốc thôi, và chúng ta không thấy nó, nhưng chúng ta so sánh nó với thời gian khác cũng được.

Đó là suy nghĩ của mình về cái gọi là "tương đối không-thời gian". Và không thời gian này sẽ giống như một dòng sông, trôi theo một hướng nhất định. Ví dụ, bạn để một trái banh trên máng trượt, thả tay ra, sau một thời gian, banh lăn xuống. Thời điểm ban đầu, bạn đánh dấu trạng thái bằng không gian, ở trên đỉnh máng. Thời điểm sau bạn đánh dấu bằng trạng thái banh trượt xuống máng. Tức là nó sẽ trôi, không gian sẽ trôi, thời gian cũng sẽ trôi. Nếu bạn ở một không gian A, thì thời điểm tiếp theo bạn sẽ phải trôi đến một không gian B, không thể trôi đến không gian C. Nếu bạn đặt trái banh lên đầu máng thì nó sẽ trôi đến cuối máng. không thể trôi ra ngoài, nếu trôi ra ngoài thì tức là không gian A đã bị biến đổi. Vậy muốn nó ngừng trôi, hãy dừng tất cả lại. Vậy muốn nó trôi ngược, hãy đảo ngược các bước.
Vậy còn về chuyện tiên đoán tương lai, có rất nhiều người làm được điều đó đấy chứ. Lưu ý rằng chúng ta chỉ tiên đoán được trong một tương lai "gần". Vì sao nó lại "gần" vì chúng ta thu hẹp không gian lại. Chúng ta thu hẹp không gian lại thành một không gian hoàn hảo, ít yếu tố hơn. Lại một sự tương quan nữa giữa không-thời gian. Thời gian nhỏ, không gian nhỏ, thời gian lớn, không gian lớn. Thời điểm càng gần nhau, không gian càng ít sự thay đổi.

Và du hành thời gian <=> sắp xếp lại trật tự không gian ở một thời điểm nào đó. Bạn ở một không gian nhất định thì bạn cũng sẽ ở một thời gian nhất định. Vậy nếu có 2 không gian giống y hết nhau tại 2 thời điểm khác nhau thì chuyện gì sẽ xảy ra. Vâng, chúng ta sẽ trôi theo một vòng tròn hoặc vòng số 8 :)).

Vậy thì ở đời thực có thể gặp không gian giống nhau tại 2 thời điểm khác nhau hay không. E rằng rất khó, vũ trụ đang nở ra, không gian thay đổi ngay lập tức, rất khó. Nhưng đừng lo, có một giả thuyết cho rằng, sau khi vũ trụ đã nở ra hết sức thì nó sẽ thu lại. Nhưng hãy nhớ rằng, đó là truyện của vũ trụ, còn trái đất của chúng ta thì đang bị tàn phá, đến nỗi không khôi phục được, huống chi là chuyện du hành thời gian. Nhưng hãy cứ hi vọng, có thể chúng ta sẽ gặp lại nhau tại bài viết này lần sau... :))

Thứ Năm, 16 tháng 4, 2015

Destructor, tưởng rõ mà vẫn chưa rõ

Như mình được học thì có 3 cách truyền tham số vào một hàm:

  1. Truyền tham trị
  2. Truyền tham chiếu (cho C++)
  3. Truyền địa chỉ (aka chuyền tham số, mà không rõ nên để địa chỉ nhé)
Hồi đầu mình học C/C++, thì mình chủ yếu dùng truyền địa chỉ và truyền tham trị. Nếu biến truyền vào hàm để thay đổi thì mình thích dùng truyền địa chỉ hơn vì nó rõ ràng. Địa chỉ là một thứ rất rõ ràng, phân biệt giữa ô nhớ này với ô nhớ kia. Truyền vào hàm sử dụng cũng đơn giản nữa. Nếu muốn dùng địa chỉ cho việc gì đó cứ để tên biến. Muốn truy xuất giá trị của ô có địa chỉ đó thì dùng phương thức dereference (đặt * trước tên biến).
Còn truyền tham chiếu? Ông này thì của C++. Cả một tháng nay toàn sài cái này. Cũng không có gì phức tạp lắm nếu truyền bình thường, y chang thằng truyền địa chỉ mà đỡ phức tạp hơn khi sử dụng. Thấy sài sướng quá nên chuyển hẳn qua tham chiếu sài. Sài cho đã mới biết là chưa đọc hướng dẫn sử dụng... (tai hại chưa)
Rồi hôm nay có làm về struct, cụ thể là làm cái destructor cho List. Oái ăm, chương trình bị lỗi, cái danh sách liên kết tự nhiên bị destruct hết, đáng lẽ sau khi thoát chương trình thì nó sẽ destruct chứ, sao đang chạy mà lại destruct. Hàm đầu tiên cho thằng List vào là hàm input(vì danh sách thay đổi nên mình cho nó truyền tham chiếu vào hàm). Sau đó mình cho nó vào hàm output(không có thay đổi gì trong danh sách nên cho truyền tham trị thôi). Ngon lành, in ra hết giá trị trong List, rồi giờ cho thằng List nhảy sang hàm khác làm, ngay khúc này bị lỗi. Cứng người, debug thì phát hiện ra sau khi thoát hàm output thì cái List cũng tự động thực hiện destructor luôn. LẠ, lên mạng tìm hiểu. Có ba thứ cần tìm hiểu:
  1. Phương thức destructor(when, how)
  2. Reference(what, how)
  3. Passing by Reference and Pointer(giống nhau và khác nhau)
Gặp những trường hợp lỗi này đúng là quý báu, lỗi 1 mà học được 10. cái thứ 3 thì cũng biết một ít thôi, 2 anh Ref và Poi này chỉ khác nhau một chút. Poi là một biến nhưng giá trị nó chứa là địa chỉ, Ref anh này chỉ là một alias (một nick name khác). Khi chúng ta gọi tên của một biến, thì chương trình sẽ tìm xem ô nhớ nào có tên như thế (tùy vào scope) -> Tức là một ô nhớ sẽ có nhiều tên, và thằng Ref sẽ là cách để ô nhớ đó có thêm một tên. không có gì ghê gớm lắm. Vậy mình dùng Pointer cũng bị lỗi này thôi.
Tìm trên mạng cũng không có gì thêm về ý 2 và 3. Vậy thì chắc là do anh destructor rồi.
Có 2 thời điểm destructor sẽ được thực hiện:
  • Khi đối tượng ra khỏi scope của nó
  • Khi ta gọi hàm hủy của đối tượng(chỉ thực sự bị hủy khi ra khỏi scope)
Nói chung là ra khỏi scope của nó thì nó sẽ gọi destructor. Ok, xem lại trưởng hợp lỗi nào, để xem scope của List ở đâu. Scope của một đối tượng là gì, đó chình là khu vực mà nó được biết đến, làm sao để biết đến, nó phải được khai báo. Ta xem lại hàm output, ta khai báo List như một tham trị (cách truyền này sẽ copy thằng List ra một bản sao khác), và tất nhiên sau khi out ra khỏi scope output thì nó sẽ hủy thằng List bản sao này, và thằng bản chính kia lại không sao. Xui thay thằng List lại chứa những địa chỉ. Thế thì khi hủy nó sẽ hủy đi các ô được cấp phát động được gọi sâu bên dưới, và thằng List bản chính chỉ giữ lại một đỉa chỉ trỏ đến một nơi hư không ~~ 
Vậy thì khi truyền tham chiếu thì như thế nào, tất nhiên scope của thằng List này sẽ nằm ở hàm main. Và khi kết thúc chương trình thì mới bị hủy theo kế hoạch.

Thứ Ba, 17 tháng 3, 2015

[Hướng dẫn] Thực hiện giải mã mật mã Vigenere khi không có khóa

Hôm nay đổi gió tí không thiên về kĩ thuật nữa :D làm một cái giải mã cho tươi mới.

1/ Giới thiệu sơ lược: Mật mã Vigenere(VG) được ra đời cách đây khá lâu, đây là một cải tiến của mật mã Ceasar. Sự khác nhau của Ceasar và Vigenere nằm ở độ dài của khóa. Đối với Ceasar thì mã khóa chỉ là một số chỉ "độ dịch chuyển", số này có thể chuyền thành một chữ cái để trở thành một key. Trong khi đó VG thì sử dụng một từ để mã hóa. Sự khác biệt này tạo cho VG một sự phức tạp trong quá trình cố gắng giãi mã không khóa.

2/ Cách mã hóa của VG: Mã khóa của VG là một từ vì vậy mỗi chữ cái trong đoạn văn bản rõ sẽ được mã hóa bằng cách dịch chuyển một đoạn bằng key của chữ cái trong từ mã khóa.

3/ Cách giải mã: Bằng cách thống kê các bộ 3 hoặc bộ 4 trong văn bản mã hóa, từ đó xác định 2 yếu tố của khóa đó chính là:

  • Độ dài mã khóa.
  • Kĩ tự của các chữ cái trong mã khóa.

4/ Cách tiến hành:  
Ở hướng dẫn này thì mình sẽ dùng thống kê các bộ 3. Và giải mã một đoạn văn bản tiếng Anh.
Bước 1: Gồm 3 công việc:

  • Tìm và đếm các bộ ba trong đoạn văn bản mã hõa
  •  Xác định độ dài giữa những bộ ba giống nhau.
  •  Tìm ước số của độ dài này

Đến đây đã, sau đó sẽ tiếp tục các step sau.
Tại sao chúng ta phải quan tâm đến ước số của các độ dài. Vì mật mã Virgenere dùng một key là một từ khóa, nó có một độ dài nhất định, mình gọi là L. Vậy thì sau nhiều lần nhảy lên L chữ cái, thì chúng ta có thể gặp được một chữ cái được mã hóa bằng 1 chữ cái ở một vị trí nhất định của từ khóa. Độ dài khóa sẽ quyết định điều này
VD: Mình có một đoạn văn bản mã hóa sau (không cần nhìn vào để rối mắt làm gì)

KXTGOBGVNGRLDMKGNVOSNLHKQPESREJSWLOUQERMBZMGUTEJQQEHEFRPEKTRTXEVTYKRKANXCFOMTYQATGCFOTLWTVCRDANPGERKHRXIGGTCKXTDEWWVTZEIVLAFOEGWIVEZHCOMWRPXTGLVCVNZONVSSGLMGXHWRLDMKUUSGPOGKEQJUJTYGVYGUYCZEUODGXOLHVTMGZTGNECWGVVXIFGYGPPOIKJWODVZPKTZEIWFICCLDIIKNFVGHWAKKRGLHVTIAJEHWMNLICNMOFPFUWITICKXIWSSWXOFLPQREUOITICLSFNYTAOEJINUENKXHGUKMROOIEILOOTFUSLNERTYBAKTWFEATZURESRCAMMHOJUMBDEKJMSKIOUXEHGLKHEOICNXACEPQYTZRFWKHWVVTCTZIEICOMNVGHTGKEQAWZEEKXCGMVUXOKOCXMNYTYGVUTIBEYBWIKKWRWACNCSAMGNIYGUAWWTZAMGXOXOCNSWLHVUXEHSRPHYGUNKPLTEJQPVANXVLEJUSKOCMBVKRLWSJVLAFTNQQIFUKGW

Bây giờ chúng ta sẽ thống kê các bộ ba-> tìm độ dài giữa các bộ ba-> tìm ước 
Ở trên là bảng thống kê các bộ ba và ước số của độ dài khóa. Lưu ý ở đây là mình giả định rằng từ khóa sẽ nhỏ hơn 20 chữ cái, nên mình chỉ chọn các ước nhỏ hơn 20. Nếu tăng lên thì các ước số cũng ít xuất hiện hơn. Có thể an tâm với test này.
Từ bảng này chúng ta sẽ quyết định độ dài khóa là bao nhiêu. Các bạn có thể thấy ở cột 2, 3 và 6 xuất hiện nhiều nhất. Chúng ta sẽ nghi ngờ rằng từ khóa có thể có độ dài là 2 hoặc 3 hoặc 6.
Tất nhiên giả định này rất hợp lý vì sự lặp lại các từ khóa này theo một chu kì sẽ tạo nên nhiều sự xuất hiện lại các bộ ba, được mã hóa từ một bộ ba văn bản rõ bằng một đoạn con của từ khóa.
Với 3 sự lựa chọn là 2 hoặc 3 hoặc 6. Chúng ta sẽ thử với 3 lựa chọn này, nhưng mình sẽ "gợi ý" bạn nên dùng 6, vì đó là đáp án, ok? :))

Bước 2: Khi đã có một độ dài khóa giả dịnh, từ đây chúng ta sẽ tìm xem từ khóa là gì
ở bước này, độ dài khóa đã biết, vậy thì chúng ta cũng biết được chu kì lặp lại của từ khóa để mã hóa. Vậy thì giả sử từ khóa có 6 chữ cái, mình gọi là ABCDEF, bây giờ thì nhìn vào đoạn mã hóa, các chữ cái cách nhau 6 vị trí sẽ được mã hóa bởi một chữ cái của từ khóa. Vậy thì công việc bây giờ chỉ là thống kê và tìm chữ cái đó tương tự như giải mã Ceasar.

VD: mình lấy đoạn đầu tiên của đoạn văn bản script
KXTGOBGVNGRL
chữ K và G sẽ được mã hóa bởi chứ cái A  .lưu ý A chỉ là tên gọi của kí tự đầu tiên của khóa thôi, muốn biết kí tự khóa đó là gì thì tới step 3.
Bước 3: Chúng ta sẽ xác định từng kí tự một của từ khóa. Sự dụng phương pháp giải mã Ceasar
Bắt đầu, chúng ta sẽ đếm các kí tự ở vị trí thứ nhất của từ khóa. A xuất hiện bao nhiều lần, C xuất hiện bao nhiều lần,... sau đó tính tần suất xuất hiện các kí tự đó.
ở đây mình có một bảng tần xuất xuất hiện của kí tự ở vị trí đầu tiên. Ở trên là một bảng tần xuất chuẩn (tần xuất xuất hiện các kí tự tiếng Anh). Ở dưới là bảng tần xuất mà chúng ta thống kê được ở vị trí đầu tiên. Khi mình dịch chuyển đi 3 vị trí (tức là dùng mã khóa "C") thì thấy có một sự tương đồng nhẹ ở 2 bảng tần xuất. Vậy thì chúng ta có thể làm tay, nhưng lâu và phức tạp+căng mắt nữa. Chúng ta có thể dùng toán học để xác định tự tương đồng này.
Ở bước này thì chúng ta dùng phương pháp Least Square, phương pháp này hay dùng trong ngàng Calculus, dùng để đánh giá xem các giá trị thực nghiệm với giá trị tính toán chính xác có thể chấp nhận không. Vẫn hay thấy dùng nhất là biểu đồ vẽ bằng hàm số so với biểu đồ giá trị đo đạc được.

phương pháp least square: Chúng ta phải tìm một đường cong sao cho tổng này nhỏ nhất

với f(xi) là những giá trị tính toán bằng hàm. yi là giá trị đo đạc được. n là số lần lấy mẫu ở những điểm khác nhau.
với bài toán ở đây thì f(xi) chính là những giá trị ở bảng tần xuất chuẩn, yi chính là giá trị ta thống kê được, n=24 vì có 24 kí tự, ta sẽ lấy mẫu của 24 điểm này.
x^2 càng nhỏ thì error càng thấp, chúng tỏ đường cong càng tốt.
Ở đây mình có một "đường cong" tần xuất chuẩn ở trên, vậy thì mình sẽ xem bảng tần xuất ở dưới có phải đường cong tốt nhất hay không.
chúng ta sẽ thử với 24 mã khóa (từ "A" -> "Z") và chọn ra mã khóa có error thấp nhất.
sau đây là bảng tần xuất với 5 kí tự còn lại:




Văn bản rõ là: 
it took erno rubik one month to learn how to do a rubik cube. some people started thinking about how to complete and in years have got little further than one side. if you want to learn how to solve the rubik cube look no further you have come to the right place getting help with solving the rubik cube is not cheating. there are quintillion possibilities, but only one correct solution. hence without knowing how to solve a rubik cube it is nearly impossible. this six step guide will take you through everything you need to know when it comes to solving the rubik cube. it is really simple, you just have to follow the steps and you will be solving the rubik cube in less than two minutes

Lưu ý: Nếu muốn dùng với tiếng việt thì phải lập ra bản tần xuất của tiếng Việt.

Mã hóa và giải mã thật sự rất thú vị, nó chỉ xoay quanh toán và toán. Mình đang nghiên cứu một số hệ mã hóa khác và thử giải mã... có thể lần tới là RSA.
-THE END-






Thứ Hai, 16 tháng 3, 2015

Only a Person who Risks is Free

Các bạn có thấy câu trích dẫn ở Blog mình không?
"Only a person who risks is truly free"

Only a Person who Risks is Free�
To laugh is to risk appearing the fool.
To weep is to risk appearing sentimental.
To reach for another is to risk involvement.
To expose your ideas, your dreams,
before a crowd is to risk their loss.
To love is to risk not being loved in return.
To live is to risk dying.
To believe is to risk despair.
To try is to risk failure.
But risks must be taken, because the
greatest hazard in life is to risk nothing.
The people who risk nothing, do nothing,
have nothing, are nothing.
They may avoid suffering and sorrow,
but they cannot learn, feel, change,
grow, love, live.
Chained by their attitudes they are slaves;
they have forfeited their freedom.
Only a person who risks is free.
- anonymous
http://www.alastairhumphreys.com/only-a-person-who-risks-is-free/

Thứ Tư, 11 tháng 3, 2015

Một số link về mã Assembly

Thấy mã này cũng thú vị đồng thời nếu sử dụng một cách master thì chương trình chạy cực nhanh :))
http://www.ibm.com/developerworks/vn/library/12/inline-assembly-C-Cpp-guide/
http://ktmt.github.io/blog/2013/10/07/C-vs-assembly/
http://ksec.info/threads/bai-1-assembly-cac-thanh-ghi-va-chuc-nang.74/

[Vector] emplace_back hay push_back

gạch....

Thứ Ba, 17 tháng 2, 2015

Thứ Sáu, 6 tháng 2, 2015

Vì sao mình viết blog khi chỉ mới năm nhất?

Thì chủ yếu là viết cho tan đi nỗi buồn, đáng bật stress và gầu trên đầu, ngoài ra còn để tự kỉ nữa.
Mình hiện đang là sinh viên năm nhất khoa CNTT trường đại học KHTN, HCMUS. Đang sống chủ yếu ở thủ đức ngay làng đại học, dọn hết đồ từ Bà Rịa lên đây luôn rồi, tết về nhà là nhà phải lo sắm đồ mới cho mặc chứ đồ bay lên thủ đức ở hết rồi.

Mục đích chính: Mình chỉ muốn viết blog này để có bạn nào sinh viên năm nhất liên quan đến CNTT thì theo dõi dễ hơn, các bạn cũng yên tâm là mình tìm hiểu sách khá nhiều nên sẽ luốn đưa ra các kiến thức đầy lạ lẵm và buộc các bạn phải tự kiểm chứng, sự ngu dốt ít hiểu biết đồng cảm với nhau sẽ tạo nên sức mạnh(chế), vì mình thấy các blog khác đều từ các kỳ nhân hội tất cả kiến thức tu luyện lại và viết một bài chất vkl :< (éo so lại nên chửi chơi haha). Cao quá nên đôi khi đọc cũng không hiểu. Thôi thì anh em ai đi qua đọc bài mình xong mà có cùng sóng não với mình thì thì add facebook chơi cho vui, tham gia thảo luận. Mình hay lang thang trên daynhauhoc.com lắm.

facebook của mình: facebook.com/hoanghaohuc
Title "Vì sao mình viết blog khi chỉ mới năm nhất?" có phần hơi tự ti nhưng mà chỉ muốn các bạn vào đây đọc trước khi đọc blog của mình thôi, ngoài ra blog cũng là cách mình tổng hợp những gì mình tìm hiểu được, mình chắc chắn với các bạn là blog mình sẽ chia sẻ các kiến thức khó tìm nhất :D hiểu nhau rồi thì đi dạo blog mình 1 vòng đê, biết rồi thì bấm qua đọc tiếp, còn chưa biết thì đọc rồi cmt nha

Tự lập hay ích kỉ?

Thấy người ta hay viết thế này :D
Đầu tiên mình tự nhận là mình không tự lập về mặt kinh tế, còn về mặt tình cảm thì mình tự lập ( FA :< )
Mình hiện giờ thấy nhiều bạn tự xưng gắn mác tự lập, không cần tiền bố mẹ, bla bla... nhưng mà cơ bản không phải bạn tự lập là ổn vì thực chất bạn phải trả hết nợ của bố mẹ trước khi bạn có quyền độc lập, nên nói chung khi bạn chưa giúp được gì cho gia đình thì bạn vẫn có một khoản nợ trên lưng và đừng hòng nghĩ đến việc độc lập hay tự do hay là có của cải, củ cải hay củ dền gì cả. Thật ra thì mình trả trách gì được các bạn tự lập hay muốn tự lập cả vì mình có cái gì hơn người ta đâu mà trách với trả móc, mình cũng muốn tự lập. Với cả tự lập nghe nói cũng tốt. Mình chỉ muốn nói đến sự ích kỉ được một số bạn phủ lên bằng tấm màn tự lập.
Để mình nói về tự lập và ích kỉ:
Khi nói đến tự lập, nó là một cái gì đó mang tính cá nhân, nghe hơi gợn gợn phía dưới quần, đùa thôi. Tự lập là tự làm gì nhỉ? Tự nấu cơm, kiếm tiền,... nghe giống mấy việc ba mẹ các bạn làm không? còn một việc là họ còn nuôi bạn, cũng tốn kha khá đấy. Ý mình nói ở đây là tự lập nhưng không những chăm lo cho bản thân mà còn mọi người xung quanh nữa, đó chính là cái khó nhất trên đời này "quan tâm và chăm sóc cho người khác". Bạn xem phim "Into the wild" chưa, thằng main đã đi ra ngoài tự lập đấy, nhưng tự lập để làm gì? để khám phá thế giới, xa rời sự gò bó của đồng tiền. Nó có ích kỉ không, xem phim đi rồi cho nhận xét ~~.
Và nhiều bạn lại lấy lý do tự lập mà trở thành ích kỉ một cách vớ vẫn... mình có gặp thằng cu kia, mở mồm thì luôn nói là sẽ tự lập nhưng hành động lại thể hiện một cách ăn bám rất tốt. Hay nhiều bạn mình gặp lần đầu đều nói "mình không muốn tiền bố mẹ nên mình làm này làm kia, học thì ra ngoài có dùng được đâu, giờ đi làm lại kiếm được tiền ngay", sau một hồi kể lể thì dẫn đến "mình cần mua món này món kia, nên đi làm vừa tự lập lại mua được đồ mình thích", thôi thôi dừng ngay. Chỉ là bào chữa cho cái lợi bản thân thôi, bạn đi làm nhưng lương bạn có đủ bạn trả cho tiền phòng không? tiền ăn uống không? hay bạn biến nó trở thành quỹ đen của bạn. Những người mình gặp đều có một kinh tế bình thường không nghèo khó. Mình không nói về sự tiết kiệm hay mua đồ cho bản thân, vì đó là niềm yêu thích của con người, mua đồ phục vụ cho con người. Nhưng nguồn tiền đó ở đâu, chỉ tính nguồn lợi mà quên đi chi phí vật chất đã bỏ ra.
Các bạn nghĩ tự lập là cái đích cuối cùng của bản thân "tôi có thể tự cung tự cấp cho bản thân, tôi đã tự lập". Vậy bạn ra hành tinh khác để ở đi, vì bạn đang sống trong xã hội và bạn phải phục vụ xã hội. Xã hội cũng là một cá thể thôi.
Nếu các bạn có một nguồn hỗ trợ từ gia đình dù ít nhưng ổn định thì nên lấy nó làm điểm tựa để phát triển bản thân. Nếu bạn muốn tự lập hãy tập tính toán đi :< chỉ là bài toán đơn giản giữa thu và chi, lời và lỗ, cân bằng lợi ích.
Mình thì đã quyết định rồi, ăn bám hay tự lập đều được cả, vì tự lập không phải cái đích mà mình hướng tới và tất nhiên ăn bám lại càng không muốn hướng tới ~~. Cái đích mình hướng tới chính là "giúp đỡ người khác". Thì ai trên đời mà không ham giàu. Có nhiều loại giàu: giàu hạnh phúc, giàu tiền bạc, "giàu nợ" (mấy con bạc ấy mà),... giúp đỡ người khác rồi sẽ có người giúp đỡ mình thôi, suy nghĩ tin người như thế giờ bị coi là xoàng xỉnh :D mà thôi thế được rồi

Thứ Năm, 5 tháng 2, 2015

[Struct] Tại sao lại phải có toán tử "->" và "." ?

Đôi khi chúng ta chỉ thấy chỉ thấy nó là một sự dư thừa không cần thiết nhưng "ngôn ngữ lập trình được viết ra và sử dụng bởi những lập trình viên, những người cực kì lười biếng", vậy thì để hiểu được nó thì ta phải xem công dụng của nó là gì, cách tốt nhất là code luôn :D bản chất sẽ từ từ dạng rộng ra, rộng rộng rộng ra...
Đặt vấn đề: Mình có 1 struct với yêu cầu là chứa một chuỗi không biết được độ dài, vậy thì chúng ta sử dụng cấp phát động cho chuỗi này (nhưng cũng có thể đặt một array lớn hơn và dư thừa, tuy nhiên bài này đang nhằm mục đích khác nên chịu khó nhé :D)
p/s: đặt cục gạch thứ 2

Thứ Tư, 4 tháng 2, 2015

Iterator hay pointer?

Bài viết này sẽ tránh cho các bạn hiểu lầm về công dụng, môi trường hoạt động của 2 thành phần trên.
Đối với một số bạn mới tiếp cận ngôn ngữ c/c++ thì sẽ được tiếp cận với pointer, sau một khoảng thời gian thì các bạn sẽ tiếp cận container vector trong thư viện STL thì có một sự băn khoăn nhỏ bé về tính chất 2 bé này.
Nó đều dùng để trỏ đến một giá trị  nhưng khi bạn nhìn vào danh sách các hàm hỗ trợ cho vector (http://www.cplusplus.com/reference/vector/) thì có 2 hàm trả về kiểu Iterator khá lạ là: rbegin, rendbegin, end. chữ "rờ" trong rbegin là "reverse" có nghĩa là đảo lại. Các hàm này đểu chỉ tới giá trị của đầu và cuối vector. Nhưng tại sao lại cần phải thêm 2 hàm dư thừa như vậy. Để thuận lợi? rend nhìn rắc rối hơn end mà :)). Vậy thì lý do là gì?
Khoan....... Iterator là gì? Pointer là gì?


1/ Pointer: Chỉ đơn giản là một biến. Như các bạn đã biết: 1 biến bao gồm 2 thành phần là địa chỉ giá trị. Điểm đặc biệt của pointer so với các biến khác gồm 3 phần sau đây:
+Nó chiếm một dung lượng cố định là 4byte. Luôn luôn là như vậy, kể cả khi bạn để nó là con trỏ *char hay *int,...
+Nó có kiểu void. Bạn có thể để declared nó như sau void* a. Vậy thì nó có ý nghĩa gì? Và nó có liên hệ gì đến hệ điều hành của máy tính không? Mình sẽ viết một bài sau chuyên về pointer cho các bạn.
+Vì nó có một dung lượng cố định là 4 byte nên nó sẽ chỉ làm một nhiệm vụ duy nhất. Đó chính là chứa địa chỉ.
2/ Iterator: Nó có phải là một biến không? Gần giống như vậy.
p/s:Thêm một cái hẹn nữa thôi :D gần tết rồi

Chia sẻ trang blog tổng hợp về tiền xử lí c/c++

một số tiền xử lý trong c/c++ khá hay. Biết thêm mấy cái này hỗ trợ rất nhiều trong lập trình, hiểu rõ công dụng của công cụ thì sẽ đạt hiệu quả cao hơn. :D
https://muteszhacker.wordpress.com/2013/07/26/tien-xu-ly-trong-c/

Thứ Bảy, 17 tháng 1, 2015

Khi Say

Hôm nay nhậu với mấy bạn  nhà  khách. Say...
Không ngờ mình có thể say như thế. Đánh chữ còn không vững.
Khi say, mắt con người trở nên lag hơn thường lệ. Kiểu như chơi game mà không card màn hình ấy, vẫn thấy hình nhưng cứ bị lag, hình ảnh trở nên ảo đến kì lạ. Mình viết bài này khi đang say và cố gắng tỉnh táo nhất có thể. Bây giờ là 1h30, mình type trên laptop mà cứ type sai mãi. Mình sẽ viết một câu mình type sai:
Thằng bạn krrf brrn minhg vued noid nhsmt lirn tujv:
dịch ra là:"thằn bạn mình cứ nói nhảm liên tục".
đúng là rượu bia có thể biến mình thành một kẻ bất cần, ngông cuồng. NHƯNG
nó có thể biến mình thành bất kì ai, khiến chúng ta không còn sợ điều gì nữa. Ngay lúc này đây mình muốn nhắn với người mình yêu từ lâu rằng mình yêu cô ấy nhiều lắm. Nhưng vẫn còn một chút lý trí, một chút sợ hãi ở lại trong mình nên mình không nhắn được, thật chán. Thế mà thằng bạn cùng phòng mình lại có bồ vì say đấy.
Có lẽ mình say rồi nên mình sẽ diễn tả nó thông qua giác quan của mình. Trước hết là cổ họng mình, nó cứ có một cảm giác tăng tăng thiếu thốn ở cổ họng, bạn biết đấy, uống rượu nhiều thì rượu sẽ bốc hơi, ào lên cổ họng. Đầu óc mình thì quay cuồng thật ra là nó như bị lag ý. cứ lag lag thế nào ý, bạn thử say và lắc đầu xem, mọi thứ dường như trôi chậm hơn, hình ảnh bạn thấy được như bị nhòe đi, ảo thật, cứ như bạn thức khoảng 24 tiếng ấy. Cơ thể bạn sẽ nóng lên, bạn sẽ thấy không cần quạt hay máy lạnh gì cả. Mình đang cố type lúc mình nhận thức được mình đang say. Nhưng chính những lúc say như thế này mình lại chẳng cảm thấy sợ gì cả, thật kì là, không sợ một điều gì cả, điều mình muốn làm tiếp theo đây chinh là học toán rời rạc và cầu nguyện. thật kì lạ. nếu bạn đã say thì bạn sẽ hiểu được ý mình nói. sự nhiễm độc của cơ thể cộng với một cơ thể mỗi mệt tạo nên sự mệt mỏi tuyệt vời, bạn có thể ngủ bất cứ lúc nào. Say,cơ thể sẽ muốn làm những điều tưởng như không thể. Mĩnh sẽ học toán rời rạc ngay lúc nay. Haizz.
cơ thể không như ý mình muốn, đó là tất cả mình muốn diễn tả. thật quá quắt.
cơ thể yếu đi nhưng sự dũng cảm tăng lên đến tột bậc. Bạn cảm thấy hài lòng với tất cả và muốn làm nhiều hơn nữa. bảo sao nhiều người muốn say, khi họ say họ dũng cảm, chẳng phải chúng ta muốn thế sao.