|
|
thanks StarGhost
mình đang sữa lại source code của mình ở new repository
http://www.gitorious.org/piece-of-c
bên sourceforge đang cố khắc phục lại sự cố với git.
Khó xài git quá,với lại điều kiện mình có giới hạn về coding
|
|
|
đi làm tốt hơn, tự nghiên cứu
mình giờ không có bằng nên chả đi làm đâu được
|
|
|
hint: cài bằng tay grub và tự config để boot
|
|
|
cảm ơn conmale
|
|
|
thực sự là bạn học C được mấy ngày rùi.
sau này mình có ý định viết những example về C ngắn gọn và dễ hiểu dành cho mình và một số bạn thích C
|
|
|
ặc ặc:
ok: mình giải thích line by line cho bạn hiểu
/* lệnh gcc biên dịch file source laptrinhnhom4.c ra file binary laptrinhnhom4*/
Code:
maianh@ubuntu:~$ gcc -o laptrinhnhom4 laptrinhnhom4.c
/*
file binary laptrinhnhom4 không chạy được vì mặc định khi tạo file nó không có bit execute(x)
vì thế ta dùng lệnh chmod cho file laptrinhnhom4 để làm cho nó execute
bạn dùng lệnh ls -l thì sẽ thấy, cái này hơi khó vì bạn mới sang Unix chưa wen mode bit
*/
Code:
maianh@ubuntu:~$ chmod u+x laptrinhnhom4
/*
bạn chmod file laptrinhnhom4 thì chạy file đó chứ sao chạy file laptrinhnhom4.c là file source
*/
Code:
maianh@ubuntu:~$ ./laptrinhnhom4.c
"./laptrinhnhom4.c " không là source nên không chạy được mà bạn có chmod cho nó đâu
OK bạn có thể dùng tên của mình
lạm hỏi, bạn học môn gì năm mấy rùi
hình như bạn ở Hà Nội ?
|
|
|
theo lý thuyết thì
khi một chuỗi được hash thì nó không thể dịch ngược được.
hai chuỗi khác nhau sau khi hash thì ra chuỗi hex không giống nhau
nếu có trường hợp giống thì đó là collision
MD5 hình như đã có collision nhưng hiện tại vẫn xài tốt
tốt hơn nên xài SHA
trên PHP có hàm md5 hoặc sha1 để tạo ra chuỗi hex
|
|
|
về logic thì việc nghe trộm, nghe lén, việc riêng tư trên máy tính cá nhân là bất hợp pháp.
thứ 2 : tỉ lệ thành công không bị crack là rất thấp, vì đối phương trực tiếp trên máy tính, việc gở bỏ phần mềm rất dễ ngay khi không có quyền admin. không có pass admin mà có thể trực tiếp sử dụng máy thì crack bất cứ cái gì điều có là chuyện nhỏ đặc biệt khi có Internet
|
|
|
# gcc -o baitap file.c
# chmod u+x baitap
# ./baitap file.c
Hiện tại mình đã sửa được thông báo warning của nó.
Nó warining vì
#define NULL ((void *)0x0)
đây hình như không phải kiểu định nghĩa của C mà của C++ trong stdio.h
nếu muốn không warning thì đặt cái này sau #include <stdio.h> hoặc trước C code:
Code:
#ifdef NULL
#undef NULL
#define NULL (0x0)
#endif
|
|
|
Dân Phần mềm thì code sao cho chương trình chạy đúng trước đã sau đó mới quan tâm đến việc code cho chương trình chạy "nhanh". Dân Khoa học máy tính thì code sao cho chương trình chạy "nhanh" sau đó mới là code cho chương trình chạy đúng
nếu viết code cho chạy nhanh mà không đúng là không thành cái gì. Nói tóm lại không thể có trường hợp "code chạy nhanh sau đó mới code cho chuơng trình chạy đúng"
đây là câu nói nghe cảm tính quá mức
một cách logic là phải code sao cho tối ưu về code, tốc độ và chính xác hoặc ít lỗi nhất.
code: code ít nhất mà sinh ra mã bin tối ưu,đỡ tốn công mà chính xác hơn
tốc độ: tuỳ theo yêu cầu ứng dụng, mã chạy lớp nào thì có cách tối ưu của nó
chính xác: thường thì khó nói về độ chính xác, nhưng càng ít lỗi càng tốt
|
|
|
mà file source mình gửi cho bạn hoangphuong0808 chạy được mà
tại bạn không biết cách xài
để tránh output warning:
# gcc -o baitap file.c &>/dev/null
để tìm dòng dài nhất trong file.c thì gõ
# ./baitap file.c
nếu có lỗi thì báo cho mình biết nhé
|
|
|
để mình code lại file này
và comment từng dòng step by step
OK ?
Sau này để hướng dẫn cho C newbie trên Linux mình sẽ có ví dụ cực hay. Guide theo từng lớp step by step
hoangphuong0808:
bài này mình code dùng system call nên khó hiểu.
bạn có thể dùng thư viện stdio.h : trong đó có hàm fopen để mở file
đề bài: tìm dòng dài nhất trong file text
hiểu đề bài: có một file text trên trời rơi xuống và tìm dòng dài nhất
mà tìm là sao, tức là thấy nó dài thì định vị nó
làm sao định vị nó, bằng cách nói ra số thứ tự của dòng đó
thêm thông tin nữa là ghi nhận lại dòng đó
+thông tin về cách thức file text xuống dòng:
file text là file thường, có nội dung là các kí tự ASCII liên tiếp nhau
để xuống dòng người ta dùng character đặc biệt kí tự xuống dòng: mã là 0xa
vì kí tự này không hiển thị nên để diễn đạt nó: ta dùng LF để nói về nó
đó là cách của Unix phân cách dòng.
Trên Window notepad dùng 2 kí tự để xuống dòng CRLF
Nếu tra trong bảng mã ASCII thì bạn sẽ hiểu
suy ra: nếu quét qua file và count được số kí tự xuống dòng (cũng chính là số dòng) đồng thời count được số kí tự trong dòng. Và quá trình quét so sánh liên tục đến hết file thì sẽ tìm được dòng dài nhất.
+hướng giải:
Vì file trên đĩa và các toán tử của C chỉ làm việc với bộ nhớ, nên ta tìm cách đọc file vào bộ nhớ hay map file vào bộ nhớ.
Việc map file vào bộ nhớ có nhiều cách :
Cách: + dùng thư viện stdio.h có hàm fopen() fclose() //khuyên bạn nên xài vì đơn giản
+dùng system call: cách này hơi khó nhưng hay và nhanh hơn
Cách sử dụng stdio.h thì mình sẽ hướng dẫn mở file và đọc như thế nào.
cách này được sử dụng nhiều nhất vì mở file đơn giản không phức tạp.
Nhưng mình đã gửi code cho bạn xài bằng cách system call. Khó cho newbie.
Nhưng lỡ rùi thì mình giải thích sơ sơ qua:
trước tiên phải stat file để biết file đó có tồn tại không, nếu có thì đồng thời cũng có thể lấy thông tin về file đó, file đó có cho đọc không
Code:
struct stat fod; //của /usr/include/sys/stat.h
if(stat(filename,&fod)) {
printf("error: khong stat được file\n");/của stdio.h
exit (1); //của stdlib.h
}
int filesize=fod.st_size;
int fd =open(const char *filename,int oflag,...); //trong /usr/include/fcntl.h
sau khi mở thì đọc file vào bộ nhớ
để map file thì hơi khó nhưng giả sử file nhỏ dưới 8096 bytes tức 8KB
ta khai báo bộ nhớ chứa:
char buf[8096]; // lưu ý buf là địa chỉ
đọc vào bộ nhớ
int rd_size=read(fd,buf,filesize);
if(rd_size<0) exit(1);//nếu trong main
việc còn lại là module của mình làm thôi
Code:
/*
Written by panfider
module tìm dòng dài nhất trong file
May 28 2010
usage:
struct Line_Object Line; // định nghĩa biến Line
get_longest_line(buf,&Line); // buf là bộ nhớ của file đã map,return lại Line
printf("%s: longest lineth %d %d\n",filename,Line.lineth,Line.length);
*/
#define MAX(x,y) ((x)>(y)?(x):(y)))
struct Line_Object{
int length; //độ dài dòng đó
int lineth; //dòng thứ mấy
char text[0]; // text của dòng đó, kiểu nối tiếp
};
void get_longest_line(char *m,struct Line_Object *buf){
int len=0,lenp=0,lineth=1,linepos=0;
while(*m!=NULL){
len++;
if(*m=='\n') {
if(len>lenp) linepos=lineth;
len=MAX(len,lenp);
lenp=len;
len=0;
lineth++;
}
m++;
}
out:
buf->length=lenp;
buf->lineth=linepos;
//buf->text=... unable to written now
}
Nếu muốn xử lý file quá lớn(vài GB) thì khi stat file kiểm tra xem file đó có lớn hơn một
#define N 8 // thay thế * bằng số khác
#define MAX_READ_SIZE (N*1024) //tính theo Kbytes
Nếu file lớn hơn định nghĩa thì dùng lseek để seek và map từng fragment vào bộ nhớ
/// trình tự logic của việc giải
1. lấy name-of-file (tên file) từ int main(int argc,char **argv)
hoặc file chắc chắn có sẵn:char *filename="abc.txt";
2. mở file,
dùng fopen để mở nếu trả về NULL thì không mở được
hình dạng:FILE *fopen(const char *path, const char *mode);
Code:
FILE *fp=fopen(filename,"r");
if(FILE==NULL) {
printf("There's some problem with this file");
exit(1);
}
3. dùng fget hoặc hàm nào đó để đọc từng kí tự để count thì giải được bài tập
nếu bạn mò được địa chỉ bộ nhớ trong FILE trả về thì dùng được module của mình
đọc link sau đây sẽ có hướng dẫn về cách xài stdio.h
http://en.wikipedia.org/wiki/Fgetc
http://en.wikipedia.org/wiki/Fopen
|
|
|
đối với mình việc kiếm được công việc là quá khó chứ chưa nghĩ đến tiền lương.
|
|
|
ừ mình cũng nghĩ tuơng tự như thế
|
|
|
qua http://congdongcviet.com để chuyên về C hơn
với lại tụi nó code C++ hoặc C# more advance hơn mình he he
|
|
|
sorry conmale
mình cũng không cho là conmale "cảm tính"
với lại hàm mình viết hoàn toàn chưa hoàn chỉnh, và đề bài thì yêu cầu không rõ ràng
muốn viết tới đâu thì viết tới đó
|
|
|
conmale: quá cảm tính rùi !
mình cũng chỉ gơi ý,nếu gặp trục trặc thì phải giúp thôi
hoangphuong0808:
nếu không có NULL thì bạn định nghĩa NULL
Code:
#ifndef NULL
#define NULL (0)
#endif
//định nghĩa này là định nghĩa không chuẩn, sẽ warning trong một số trường hợp nhưng xài được
mình đã gửi email
|
|
|
không có chi,nếu bạn có thuật toán tốt hơn post lên cho mình tham khảo
tiện hỏi, bạn học trường nào mà bài tập khó vậy ?
|
|
|
ok, mình nhớ có bài này
|
|
|
Code:
/*
Pham The Chung
26/5/2010
*/
#define MAX(x,y) ((x)>(y)?(x):(y))
struct Line_Object{
int length;
int lineth;
char text[0];
};
/*
m must end with NULL character
*/
void get_longest_line(char *m,struct Line_Object *buf){
int len=0,lenp=0,lineth=1,linepos=0;
while(*m!=NULL){
len++;
if(*m=='\n') {
if(len>lenp) linepos=lineth;
len=MAX(len,lenp);
lenp=len;
len=0;
lineth++;
}
m++;
}
out:
buf->length=lenp;
buf->lineth=linepos;
//buf->text=... unable to written now
}
đó là phần mới phát triển được
đã test thành công chạy đúng.
nếu đưa host hay email thì mình đưa cho bạn file source đã test
update: bạn test thử dùm mình vì hàm này chưa chắc đúng hoàn toàn
mình chỉ thử 1 trường hợp thì đúng
nếu có nhiều hàng dài và bằng nhau thì hàm này record hàm đầu tiên
|
|
|
aloh, xin thông báo : bây giờ Debian vẫn là số 1
tiếp đến là Fedora hay Centos
Hiện tại 10h 20" đang down fedora dvd tốc độ rất chậm khoảng 20-30kb/s
Các bạn có thể chỉ cách cài mà không cần ghi DVD không ?
hehe Vì không đầu ghi đĩa
|
|
|
cũng không từ bỏ hẳn, mình đang chờ Fedora 13, nếu release mình tải về cài đặt thử
còn Debian thì xài cho máy nào đó tuơng thích với nó
|
|
|
diễn đàn HVA là diễn đàn cho mọi người vì thế nó nên lead to republic và institutions
Vì mình nghĩ nếu cái gì mình cho là đúng và có sự đồng thuận của mọi người có liên quan trên diễn đàn thì nó có tính chất hợp pháp
|
|
|
Thực tiễn không thể áp đặt luật pháp cho HVA được, nó là nơi trao đổi, thảo luận
HVA chỉ có luật của HVA
Cơ sở pháp lý cho HVA là do chính HVA, chứ không do luật pháp của nước nào.
|
|
|
cám ơn, mình chưa xài lệnh này bao giờ!hic
nhưng mình từ bỏ xài Debian rùi, khó quá
đúng là bó tay thiệt với Debian
từ khi mở thead này không làm cho Debian nhận card LAN được
|
|
|
học mạng là hoặc lập trình web là nhanh nhất để thành công
Small_happy :
Nhưng trên thực tế mình thấy việc tìm hiểu hack sẽ có lợi ích rất thấp so với việc học tập tìm hiểu và xây dựng. Mà thực tiễn thông qua quá trình xây dựng và phát triển, sẽ giúp bạn hiểu hơn để hack
Vì hack là đi ngược với sự phát triển nên sẽ ít có sự thành công,trừ khi phát triển để hack
|
|
|
mình cũng có cái máy chạy thường nhiệt độ quá cao, nên một hồi sử dụng là tự khởi động lại
trường hợp này mình xác định là do quạt tản nhiệt không tiếp súc chặt với bề mặt của cpu,
có được điều này là do 4 con vít gắn vào main rất khó gắn và gắn sơ xài với lại main khi bắt vào thùng ở dạng đứng nên gây ra hở quạt và cpu core. Nên gây ra hiện tượng khởi động lại do nóng.
nếu bạn check trường hợp của mình giống của bạn thì nên mua quạt mới.
|
|
|
kinh nghiệm:
mình đã từng lướt qua sơ Linux kernel code, mình có một xét hình như driver Linux chuyên dụng cho một số phân cứng chuyên dụng cho CNTT ngoại trừ một số driver "tào lao"
tìm phần cứng match với Linux hoặc làm nó nó match với thiết bị là vấn đề
rất tiếc là trước khi mua không để ý, mà chỉ xem ngoại hình thiết bị đó đẹp hay không !
|
|
|
Còn 2-3 ngày nữa là fedora 13 release ,mừng quá vì mình xài từ thời Fedora 8 cài DVD nên có đủ system.
Rất thích Fedora nhưng nó có vẻ đồ sộ quá, chỉ thích hợp cho Workstation
Mình chuyển qua Debian vì nó có net install rất nhỏ 130Mb, dễ download và cài đặt nhanh
nên portable cao. Nhưng thực tiễn khi cài và xài thì gặp rắc rối driver vì cài cho laptop, chứ không dành cho board phổ biến.
Theo mình nghĩ Linux sẽ gặp nhiều rắc rối khi xài trên Laptop. Vì không có distro nào có kernel riêng cho mỗi model cho laptop nên khó vượt qua ải driver
Thực tiễn Debian mà cài cho board phổ biến, thì mình nghĩ nó vượt qua Fedora về nhiều mặt:
độ ổn định, portable
server
mạo hỏi conmale thêm tí nữa, xài Red Hat Linux enterprise có trả tiền cho Red Hat không ?
và nó khác gì với Centos ?
|
|
|
lúc mới cài thì nó không có driver nên không nhận ra
vì không có driver nên biên dịch lại để có driver
khi nhận ra rồi thì cũng không xài được interface đó
dùng ifconfig eth0 up thì không thấy optain IP
dùng ifup eth0 thì báo gì eth0=eth0
|
|