Thứ Tư, 31 tháng 7, 2013

Tôi vào nghề SEO

Tôi đến với SEO cách đây 3 năm, nghĩa là sau gần 10 năm lang bạt kì hồ. 

Sau một thời gian dọc ngang Nam tiến, làm qua vài công việc, người khinh có, người quí có, tôi trở  về Bắc dắt theo một vợ, một con nhỏ, bắt đầu lại từ đầu. Anh tôi, dân IT gộc, đời đầu bảo: “IT có theo thì 5 năm nữa trình mày mới tàm tạm, không ổn”. Tôi tạm bằng lòng với công việc là một nhân viên truyền thông trong một công ty cổ phần nhỏ. Thời gian sau, anh gặp tôi bảo: “mày làm SEO đi, cái này đang nổi”, rồi tiếp: “cái này đòi hỏi não to”. Nói xong quẳng cho tôi 6 trang tài liệu về SEO, giải thích SEO là gì, Keyword là gì, một số qui tắc cơ bản để xây dựng keyword, và một số trang để submit.

Sau một tuần đọc tài liệu, tôi được giao SEO trang web đầu tiên là một trang về vật liệu xây dựng. Sau hai tháng đọc và mò mẫm thực hành 18h một ngày về quản trị web, SEO,  rồi từ khóa cũng lên top. Ba triệu là số tiền công tôi được nhận và cũng là số tiền đầu tiên tôi kiếm được từ SEO. Tôi chẳng kịp vui, anh tôi bảo: “mày không biết ctrl A cái trang vừa SEO để xem anh làm những gì, cũng không biết ctrl A các trang trên top, xem cách nó làm, không view source code của nó lên thì làm sao tiến bộ được”. Đến dự án thứ hai thì bảo: “lần này tao không nhúng tay vào, để tự một mình mày SEO xem nó có lên không”. 

Dịch vụ SEO nội dung và Copywriting: Tôi vào nghề SEO

Nói vậy ai đó có thể nghĩ là anh tôi nói nhiều, thực ra không phải vậy. Trong suốt ba năm trời, chúng tôi trao đổi về SEO không nhiều. Nghĩa là sau cái dự án thứ 2, nhờ trời, đối tác đang thời thịnh vượng, chịu chi, nên tôi đưa ra yêu cầu gì đều được đáp ứng. Tư vấn mua adword cũng ok, nói mua banner trên mấy báo lớn cũng chịu, bài viết thì ngày ấy chưa có thuật toán Panda, copy thoải mái... ấy vậy là lại lên top, lên ngoài sức tưởng tượng. Ông anh thì sau đó không nhòm tới công việc của tôi nữa.

Người đã định hướng tôi đi theo công việc làm SEO – ông anh tôi. Đó là một người có đầu óc thức tế, theo học công nghệ thông tin từ khi nó mới xuất hiện, cái thời lập trình bằng DOS và được sở hữu cái đĩa mềm dung lượng 3 – 4 Mb là một ước mơ. Ngày ấy tôi học cấp hai, còn đang “vẳng nghe tiếng ếch bên tai – giật mình còn tưởng tiếng ai gọi đò”, tôi đọc thơ, viết truyện, tìm hiểu về Tú Xương, Nguyễn Khuyến... là một tay mơ mộng toàn tập.

Giỏi nhưng hiếm khi chỉ được ai điều gì – đó là tính cách của ông anh tôi. Không phải khoảnh, mà là do cái tính nóng, không chịu được. Quan điểm là phải biết tự tìm hiểu, đào sâu suy nghĩ, nghĩa là trước khi hỏi mà không tìm hiểu kĩ vấn đề thì chỉ có nước nghe chửi, vuốt mặt không kịp. Chỉ trả lời những ai, vấn đề gì đã được tìm hiểu rất kĩ mà chưa ra, chỉ dẫn đúng điểm mấu chốt của vấn để,  đó là tính cách của ông anh tôi.

Kể từ dự án thứ 2, tôi mò mẫm tự lên mạng tìm tài liệu và mầy mò về SEO trong suốt ba năm qua. SEO giúp tôi dần ổn định lại cuộc sống. Được cái Google ngày một xem trọng nội dung, tôi có dịp được sống lại với thú vui đọc và viết ngày trước. Đúng ra thì, trước đây tôi viết thơ, truyện ngắn cũng nhiều, thành tích cao nhất là có một bài đăng trên báo Hoa Học Trò. 30k nhuận bút đủ để mua 10 cân xoài xanh đãi cả lớp, bấy nhiêu cũng đủ để nuôi dưỡng một thời giấc mơ tôi (cho đến khi vỡ mộng).

 » Tại sao là SEO nội dung

Thứ Hai, 29 tháng 7, 2013

XML: Tài liệu XML có cấu trúc Cây

Các tài liệu XML phải có một yếu tố gốc. Yếu tố này là "cha mẹ" của tất cả các yếu tố khác.
Các yếu tố trong một tài liệu XML tạo thành một cây tài liệu. Cây bắt đầu ở gốc và các nhánh đến mức thấp nhất của cây.

Tất cả các yếu tố có thể có yếu tố phụ (các phần tử con):
<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

Các điều khoản cha mẹ, con, anh chị em và được sử dụng để mô tả mối quan hệ giữa các yếu tố. Yếu tố cha mẹ có con. Con trên cùng một mức độ được gọi là anh chị em ruột (anh chị em).

Tất cả các yếu tố có thể có nội dung văn bản và các thuộc tính (giống như trong HTML).
Ví dụ:

<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="CHILDREN">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

Phần tử gốc trong ví dụ này là <bookstore>. 
Tất cả các yếu tố <book> trong các tài liệu được chứa trong <bookstore>.

Các yếu tố <book> có 4 con: <title>, <author>, <year>, <price>.

Thứ Ba, 23 tháng 7, 2013

SEO và bản chất con buôn

Gần đây trên website của một số đơn vị đào tạo SEO, MMO… thường thấy những phát ngôn gây sốc. Tất nhiên những phát ngôn đó nhanh chóng trở thành chủ đề bàn tán trên các mạng xã hội, diễn đàn, rồi thì dép guốc, gạch đá tới tấp như mưa. Riêng đối với bản thân tôi điều này chẳng có gì là lạ. Bởi lẽ, những người phát ngôn đều là người có khả năng tạo scandal, yêu thích thị phi. Bởi lẽ, càng nhiều người biết tới, càng nhiều người nghe tới thì họ càng kiếm được tiền. Chỉ có những người nghe và tin, nghe và kể lại là dại mà thôi.

Các bạn cứ nghe câu chuyện làm SEO kiếm 15, 150, hàng trăm triệu một tháng rồi sốt lên xình xịnh, tưởng kiếm được tiền dễ như ăn cơm sườn vậy. Hoặc băn khoăn, nghi ngờ mà chẳng hiểu tại sao mình nghi ngờ.
Các bạn nói họ làm SEO, nhưng thực ra thì họ đang kinh doanh dịch vụ đào tạo SEO thì đúng hơn. Bản chất của kinh doanh là không cần biết là mặt hàng, dịch vụ gì, chỉ cần ra tiền ra làm. Bây giờ SEO đang khá hot, nguyên nhân là do kinh tế khó khăn, các hình thức quảng bá, marketing truyền thống quá tốn kém, trong khi marketing online và SEO thì chi phí ít hơn, có hiệu quả nhất định. Doanh nghiệp đổ xô vào làm SEO, người người đi học SEO, MMO…
Nắm bắt được nhu cầu học và làm SEO, các trung tâm đào tạo SEO mọc lên như nấm. Chất lượng chưa biết đến đâu nhưng để thu hút học viên thì hầu hết là chuyên gia chém gió, gạt bão, họ thi nhau đăng đàn đánh bóng bản thân, tưng bừng chửi bới và cãi nhau ngậu xị. Có một thực tế là các bạn có nhu cầu học SEO có một bộ phận không nhỏ nói chung trẻ tuổi, thích phong cách pro. Nhưng nói thẳng các bạn chưa có kinh nghiệm, thiếu năng lực phân tích để phân biệt giữa chém gió và khả năng thực sự.
Mẹ bạn cũng có thể làm SEO.
Thực ra ai cũng có thể làm SEO nếu có tố chất, đam mê, được đào tạo, có cơ hội phát triển… Bạn cũng có thể làm SEO nếu bạn có được một vài tố chất cần thiết. Nhưng để thành công thì đó mới chỉ là điều kiện cần, tôi có thể kể thêm các yếu tố như thời gian, tiền bạc, quan hệ…
Làm SEO kiếm hàng trăm triệu mỗi tháng.
Thực tế tôi chưa thấy ai làm SEO đơn thuần mà có mức lương này, người kinh doanh SEO thì tôi có biết vài người. Nhưng xin nhắc lại với các bạn là họ đang kinh doanh chứ không phải làm SEO. Và nếu muốn thành công như họ thì xin bạn hãy đi theo con đường kinh doanh. Và thuộc lòng nguyên tắc: Kinh doanh tất cả những gì có thể: SEO thịnh thì kinh doanh SEO, đào tạo SEO, tư vấn SEO… rồi thì hầm bà lằng SEO. Không thịnh thì chuyển hướng, vẫn cứ làm kinh doanh. Chỉ mong các bạn làm ăn có lương tâm một chút, đừng có chỉ nghĩ tới việc móc túi học viên, rồi tự sướng với nhau bằng mấy cái danh xưng mĩ miều, cám hấp
trên vung nữa.
 
Làm SEO không cần học đai học.
Chẳng qua vì SEO chưa phát triển đến mức  phải có trường đại học dành riêng cho nó. Nếu có một hệ thống trường đào tạo về SEO thì liệu trong số những người tay ngang như chúng ta, bao nhiêu người có cơ hội cạnh tranh với những người được đào tạo bài bản. Như tình hình chung hiện nay, đại học còn thất nghiệp đầy, nói chi đến không bằng cấp. Đại học có thể chẳng là gì, nhưng nó là chìa khóa, là chứng minh nhân dân để bước qua cánh cửa việc làm, nó bước đầu tạo niềm tin cho nhà tuyển dụng. Và nếu có một trường đào tạo về SEO thì mấy bác mở trung tâm kinh doanh dịch vụ đào tạo SEO kia còn có cơ hội mà quăng mìn, vãi nổ nữa không. Mình mong có một hệ thống trường trung cấp nghề, trung cấp, cao đẳng, đại học về SEO để các bạn có thể chọn cho mình hình thức phù hợp. Không phải mất thời gian bàn tán, suy nghĩ về mấy ông tự gắn mác thầy dậy SEO rồi nổ vung xí mẹt nữa.
Trung tâm đào tạo SEO tốt nhất, giáo trình hiện đại nhất, hiệu quả nhất… rồi còn bao cái “nhất” nữa tự vơ vào mình. Câu hỏi là: cơ quan có thẩm quyền nào chứng nhận chuyện này, hay lại là mấy ông “tự sướng”. Các bạn nên nhớ, trên thế giới từ lâu người ta đã cấm hình thức quảng cáo đi kèm với những từ dễ gây hiểu lầm và phản cảm như: “tốt nhất”, “hay nhất”, “ngon nhất”… Trong truyền thông, báo chí, khi nó một cái gì đó nhất mà không có chứng minh cụ thể thì người ta gọi là thông tin “thiếu trung thực” đấy mấy ông tướng nổ ạ.
Còn đoán được truyện của nghìn năm sau, lại có một trường đào tạo siêu nhân nữa thì …
thôi! Ngoại hạng rồi! Ai chứ mình thin phép tránh xa mà cầu hai chữ “bình yên”.

 Dịch vụ SEO nội dung và Copywriting: SEO và bản chất con buôn
Thực tình mà nói nổ không phải bây giờ mới có, bản chất con buôn không phải bây giờ mới biết. Ai sướng kệ ai, ai khổ kệ ai, cuộc sống là thế: Tiền đơn giản là chui từ túi người này sang túi người khác, nói thì bảo “biết rồi - khổ lắm - nói mãi”. Thôi, dẹp hết qua một bên, ngủ đây, dại thì chết, can không nghe thì cho chết luôn.

» Tam@SEO: Dịch vụ backorder và Văn hóa phân trâu

Thứ Hai, 22 tháng 7, 2013

Min, Mem và Mod

Min
Mọi người thường gọi tôi là Min, dù rằng tôi thích được gọi là Admin, tôi quản trị diễn đàn với rất nhiều thành viên. 

Một số người, tôi tạm gọi là Spam là những người tôi không hiểu họ (hoặc có thể họ không hiểu tôi). Trên diễn đàn có rất nhiều tri thức, nhưng họ chưa bao giờ gạn đục, khơi trong, gắng hoàn thiện bản thân. Tất cả những gì họ làm là “vãi link đầy box”, “chém gió cầu view”. Dĩ nhiên tôi buồn, tôi đã yêu quí họ xiết bao. Đôi khi dù không muốn, tôi vẫn phải ban nick họ, một số im lặng bỏ đi, một số giận dữ thét gào, cũng không ít người lập nick mới tiếp tục spam. Khi ban nick tôi chỉ mong họ thay đổi, nhưng những người có thể thay đổi rất ít, tôi vẫn phải thường thất vọng nhiều hơn.

Cũng may, rất nhiều trong số Mem là những thành viên tích cực, họ hiểu biết, sẵn sàng chia sẻ tri thức và bí quyết của mình, giúp đỡ những thành viên khác, họ khiến tôi cảm kích, có động lực để làm việc. Một số Mem, tôi gọi là Mod là những người rất tích cực. Họ có thể không phải là những người giỏi nhất, nhưng đều có sở trường riêng của mình. Và điều quan trọng nhất là họ có sự đam mê, sẵn sàng chia sẻ.  

Cũng có đôi khi, một số Mod hoạt động không hiệu quả, một số thành viên tích cực ít chia sẻ, Spam quần thảo khắp diễn đàn. Tôi mệt mỏi và thấy mình cô đơn, có đôi khi tôi muốn bỏ tất cả. Tôi tự hỏi: “tại sao mình phải làm tất cả những điều này”!?
Dịch vụ SEO nội dung và Copywriting: Min, Mem và Mod

Mem
Tôi là Mem, tôi có sở thích lang thang, kiếm gió trên các diễn đàn. Công việc của tôi là chém gió, cày link. Tôi có rất nhiều anh em bạn bè, mỗi người mỗi cảnh: Có đứa thì chém gió ăn vào tính, chỉ thích quăng mìn, vãi đạn; tất cả chỉ để vui, chỉ để cười. Có đứa cày link vì tin rằng đó  làm một cách hay, có đứa đi làm thuê bị sếp ép, quản lý đeo ách vào cổ. 

Nhiều người gọi tôi là Spam, tôi không buồn vì tôi không nghĩ thế, tôi không hiểu. Có những khi quá đà, bị ban nich, tôi cười khẩy, tạo mail, đăng ký mới. Cũng có một số người vào chửi, có người bỏ đi, mỗi người một suy nghĩ, tôi cũng chẳng muốn nghĩ nhiều.

Tôi cũng nghe người ta nói tới cái gì đó nhân hiệu, thương hiệu, phương pháp… nhưng tôi không thể hiểu, hoặc chưa thể hiểu. Tôi cần có thời gian để trải nghiệm nhiều hơn. Nói thật thì tôi cũng muốn là mem tích cực, là Mod. Điều tôi cần có lẽ là thời gian, có thể tôi sẽ thay đổi, nhưng tôi cần học hỏi nhiều hơn để có thể tìm cho mình một hướng đi. Có lẽ tôi nên bắt đầu bằng câu hỏi: “tại sao mình phải làm tất cả những điều này”!?

Mod
Tôi tên là Mod, công việc của tôi là chia sẻ kiến thức và giúp đỡ Min quản lý diễn đàn, support các Mem. 

Tôi vui khi viết được một bài viết tốt, được đánh giá cao, và buồn khi phải ban nich một ai đó. Đôi khi tôi cũng buồn vì chẳng có gì để chia sẻ. Như một cây táo già đã cho đi quả ngọt, tôi cần có thời gian để tích lũy, tôi không thể ép mình bốn mùa ra hoa, kết trái. Tôi không muốn cho ra những quả trái mùa, đắng ngắt, chẳng ai quan tâm.

Tôi không quan tâm nhiều đến cái gọi là quyền lợi, đơn giản là tôi có thể có được rất nhiều thứ từ diễn đàn, những tri thức mà ai cũng có thể tiếp xúc, nhưng không phải ai cũng biết cánh để tiếp nhận. Tôi có thêm nhiều anh em, bạn bè, tài sản mà ai cũng biết là quan trọng, nhưng không phải ai cũng đủ dũng cảm để xây dựng. 

Thời gian qua, con người rồi sẽ thay đổi, tôi cố gắng để sống hết mình, để không phải nuối tiếc về sau. Điều quan trọng nhất là: Tôi yêu các bạn.

Chủ Nhật, 21 tháng 7, 2013

PHP: Hàm trả về vị trí xuất hiện của chuỗi s1 trong chuỗi s2


<?php 
/*  This  function  returns  the  position  of  string  s1  within  string  s2. 
      The  position  is  1  based.    If  s1  is  not  in  s2,  0  is  returned. 
*/ 
function  InStr($s1,  $s2) 

        //Check  for  valid  input 
        if(!(is_string($s1)  &&  is_string($s2)))  return  0; 

        $s1len  =  strlen($s1); 
        $s2len  =  strlen($s2); 

        //Check  if  s1  in  s2  at  all 
        if(!ereg($s1,  $s2))  return  0; 

        //Resolve  simple  case 
        if($s1  ==  $s2)  return  1; 

        //Set  initial  search  limits 
        $begin  =  0; 
        $end  =  $s2len  -  $s1len; 

        //Initialize  position 
        $position  =  0; 

        //Do  binary  search  of  s2  for  s1 
        //Check  left  side  first  to  find  first  occurance  of  s1 
        //Check  right  side  first  to  find  last  occurance  of  s1 
        while($end  >  $begin  +  1) 
        { 
                $middle  =  ceil(($begin  +  $end)  /  2); 
                $leftBegin  =  $begin; 
                $rightBegin  =  $middle  +  $s1len; 
                $leftEnd  =  $middle; 
                $rightEnd  =  $end  +  $s1len; 

                //Check  left  first 
                if(ereg($s1,  substr($s2,  $leftBegin,  $rightBegin  -  $leftBegin))) 
                { 
                        $end  =  $middle; 
                } 
                else  //(ereg($s1,  substr($s2,  $leftEnd,  $rightEnd  -  $leftEnd))) 
                { 
                        $position  +=  $middle  -  $begin; 
                        $begin  =  $middle; 
                } 
        } 

        //Resolve  1  off  problems  introduced  by  ceil 
        if(ereg($s1,  substr($s2,  $end,  $s1len)))  $position++; 

        //Return  position  1  based 
        return  $position  +  1; 

?>

Thứ Tư, 17 tháng 7, 2013

Assembly: Hiển thị bộ nhớ (Show Memory)


kbd             equ     16h             ;keyboard irq
msdos           equ     21h             ;MSDOS irq

reset           equ     0dh             ;disk reset
dfopen          equ     0fh             ;open disk file
dfclose         equ     10h             ;close disk file
searchf         equ     11h             ;search first
searchn         equ     12h             ;search next
seqread         equ     14h             ;sequential disk read
seqwrite        equ     15h             ;     "       "  write
setdta          equ     1ah             ;set disk transfer area address
createf         equ     3ch             ;create file with handle
openf           equ     3dh             ;open file with handle
closef          equ     3eh             ;close file with handle
readf           equ     3fh             ;read from file with handle
writef          equ     40h             ;write to file with handle
setfp           equ     42h             ;set file pointer
allocmem        equ     48h             ;allocate memory
freemem         equ     49h             ;free memory
changebs        equ     4ah             ;change block size
findfirst       equ     4eh             ;find first file
exit            equ     4c00h           ;msdos exit

[BITS 16]                               ;NASM stuff
[ORG 0x100]

s1:
        mov     ax,cs                   ;get code segment
        mov     ds,ax                   ;use it now
        mov     [comseg],ds             ;save it there        

        mov     si,0080h                ;DOS command line page 0
        lodsb                           ;load size of command line
        cmp     al,0                    ;anything on command line ?
        jbe     usage                   ;noo, show usage
        cbw                             ;extend AL to AX
        xchg    bx,ax                   ;swap size to bx for indexing
        mov     byte [bx+si],0          ;null terminate command line
        call    parse                   ;parse command line
        jmp     main                    ;go on with main
usage:  mov     bx,utext                ;pointer usage text
        jmp     errout                  ;skip this
main:
        mov     si,inbuff               ;check for valid HEX input
        mov     bx,errt1                ;proper text
ishex:  lodsb                           ;get the char
        cmp     al,'0'
        jb      errout
        and     al,0dfh                 ;force UPPERCASE
        cmp     al,'F'                  ;>F ?
        ja      errout                  ;yeahh, dump this
        loop    ishex
        call    hexbin                  ;make hex bin
                                        ;start address now in EDX
        mov     ax,dx                   ;get low word (segment)
        mov     es,ax                   ;start segment
        shr     edx,16                  ;shift in offset
        mov     di,dx                   ;start offset
dopage:
        push    es                      ;save registers
        push    di
        push    ds
        push    si
        mov     ax,es
        mov     ds,ax                   ;make ds=es
        mov     si,di                   ;and si=di
        
        call    showpage                ;show it
        
        pop     si                      ;restore registers
        pop     ds
        pop     di
        pop     es
        add     di,512                  ;adjust memory position

        ;xor     ah,ah                  ;wait for ANY key
        ;int     kbd
        
        mov     bx,text                 ;show message
        call    write
        mov     ah,0                    ;wanna see next screen  ?
        int     kbd                     ;chek out keyboard buffer
        and     al,0DFh                 ;force UPPER CASE
        cmp     al,"Q"                  ;wanna quit ?
        je      quit                    ;yeahh
        jmp     dopage
errout:
        call    write
quit:   
        mov     ax,exit
        int     msdos

;***********************************************************
;*      Convert ascii hex to 32 bit binary
;*      Input = command line buffer, output EDX
;***********************************************************
hexbin:
        mov     si,inbuff               ;pointer command line buffer
        xor     edx,edx                 ;clear binary output
aschexbin:
        lodsb
        cmp     al,'0'                  ;< 0
        jb      notasc                  ;yes invalid character
        cmp     al,'9'                  ;<= 9
        jbe     astrip                  ;yes, strip high 4 bits
        and     al,05fh                 ;force upper case
        cmp     al,'A'                  ;< ascii A
        jb      notasc                  ;yes, invalid character
        cmp     al,'F'                  ;> ascii F
        ja      notasc                  ;yes, invalid character
        add     al,9                    ;ok, add 9 for strip
astrip:
        and     al,0fh                  ;strip high 4 bits
        mov     cx,4                    ;set shift count
        shl     edx,cl                  ;rotate EDX 4 bits
        xor     ah,ah                   ;zero out AH
        cbw
        add     edx,eax                 ;add digit to value
        jmp     aschexbin               ;continue
notasc: ret

;*********************************************************************
;*      Format and show the stuff in a "sector"
;*      Input SI
;*********************************************************************
showpage:
        mov     cx,32                   ;32*16=512
arow:   push    cx
        mov     di,outline              ;output buffer
        mov     cx,16                   ;process 16 bytes
hexrow: push    cx
        lodsb                           ;load al with byte
        mov     dl,al                   ;get value
        mov     cx,2                    ;2 nibbles
chexb:  push    cx                      ;save that
        mov     cl,4                    ;4 bits
        rol     dl,cl                   ;rotate source left
        mov     al,dl                   ;move digit into AL
        and     al,15                   ;clear high nibble
        daa                             ;adjust AL if A through F
        add     al,240                  ;bump the carry
        adc     al,40h                  ;convert HEX to ASCII
        stosb                           ;copy to buffer
        pop     cx                      ;get digit counter
        loop    chexb                   ;next digit
        mov     al,32                   ;copy a SPACE
        stosb
        pop     cx                      ;restore loop counter
        loop    hexrow                  ;loop on
        mov     al,32                   ;copy 2 spaces
        stosb
        stosb
        sub     si,16                   ;adjust source back
        mov     cx,16                   ;copy ASCII bytes
cccp:   lodsb
        cmp     al,32                   ;< SPACE ?
        jb      noa                     ;yeahh, skip it
        stosb                           ;no, store in buffer
        jmp     next
noa:    mov     al,'.'
        stosb
next    loop    cccp   
        mov     al,13
        stosb
        mov     al,10
        stosb
        mov     al,0                    ;null terminate line
        stosb
        mov     bx,outline              ;show the line
        call    write
        pop     cx
        cmp     cx,17
        jne     nopause
        push    ds
        mov     ax,cs
        mov     ds,ax
        mov     bx,text1
        call    write
        pop     ds
        xor     ah,ah
        int     kbd
nopause:
        loop    arow                    ;next 16 bytes
        ret

;************************************************************************'
;*      Convert bin WORD to HEX ascii. Input DX. Result in Numbuff      *
;************************************************************************
binhex: pusha       
        mov     di,numbuff              ;destination buffer
        mov     dx,[count]              ;binary number
        mov     cx,4                    ;four nibbles
convhex:
        push    cx                      ;save counter
        mov     cl, 4                   ;4 bits
        rol     dx, cl                  ;rotate source left
        mov     al, dl                  ;move digit into AL
        and     al, 15                  ;clear high nibble
        daa                             ;adjust AL if A through F
        add     al, 240                 ;bump the carry
        adc     al, 40h                 ;convert HEX to ASCII
        stosb                           ;copy to buffer
        pop     cx                      ;get digit counter
        loop    convhex                 ;next digit
        mov     al,32                   ;copy a space
        stosb
        mov     al,0                    ;null terminate
        stosb
        popa
        ret

;*************************************************************************
;*       Writes out the NULL terminated text supplied in BX.             *
;*       OR writes out data,BX and size,CX if called at lwrite.          *
;*************************************************************************
write:  pusha
        mov     si,bx                   ;copy to SI
        mov     cx,0                    ;clear count
wloop:  lodsb                           ;load AL with SI
        cmp     al,0                    ;end of line ?
        je      lwrite                   ;yeahh
        inc     cx                      ;no, incrase byte count
        jmp     wloop                   ;test next byte
lwrite: mov     dx,bx                   ;text address in DX
        mov     bx,1                    ;filehandle standard output = 1
        mov     ah,writef               ;MS-DOS writefile with handle is 040
        int     msdos                   ;write buffer to standard output
        popa
        ret                             ;done

;*************************************************************************
;*      My kind of command line parsing. It just checks if there�s
;*      any blankspaces between the options. The parameters ends up
;*      in the inbuff separated by 0:s, binary zeroes.
;*************************************************************************
parse:
        mov     di,inbuff               ;our buffer
ifspc:  cmp     byte [si],32            ;leading space  ?
        jne     nospc                   ;noo
        inc     si                      ;yeahh, dump that
        jmp     ifspc                   ;check next
nospc:  mov     cx,1                    ;were here, so we got one arg
copy1:  lodsb                           ;load byte SI to AL
        cmp     al,0                    ;0 ?(end of line)
        je      done                    ;yeahh
        cmp     al,32                   ;SPACE ?
        je      cop2                    ;yeah
        stosb                           ;noo, move AL to DI, incrase DI
        jmp     copy1                   ;go on
cop2:   mov     byte [di],0             ;null terminate
        add     cx,1
        inc     di                      ;dump that byte(SPACE)
        jmp     copy1                   ;back
done:   mov     byte [di],0             ;null terminate
        ret                             ;return


;*************************** DATA STUFF **********************************

XMS_SEGMENT     dw 0
XMS_OFFSET      dw 0

inbuff          times 64 dw 0           ;128 byte command line buffer
outline         times 40 dw 0           ;buffer output line
numbuff         times 7 dw 0            ;word ascii number buffer
comseg          dw 0
count           dw 0
bcount          dw 0
acount          dw 0

;outbuff         times 512 db 0

utext           db      'WWW',13,10
                db      'Usage: Showmem [start address].',13,10
                db      'Start address = Hexadecimal.',13,10,0
text:           db      13,10,'Q = Quit. Any key = Next page.',13,10,0
text1:          db      13,10,'Any Key = Next 256 Bytes.',13,10,0
errt1:          db      'That address is not hexadecimal.',13,10,0

s2:

END

Thân phận SEOer

Quanh năm bàn phím gảy luôn tay
Chẳng đủ nuôi thân, xác hao gày
Kì cạch chổng mông dăm từ khóa
Cặm cụi link cày đợi up rank

Nghĩ mình SEO-ờ ôm lấy nghiệp
Cóp text cày link chẳng dám lơi
Rủi, thằng ddos, gài link bẩn
Sớm top chiều văng vắng top 10

Buồn cho cái số SEOer bạc
Lên top chắc chi đã thấy tiền.

Dịch vụ SEO nội dung và Copywriting: Thân phận SEOer

» SEOer - anh là ai ?
» SEOer - anh là ai ?

Thứ Hai, 15 tháng 7, 2013

Java: Xây dựng chương trình Client - Server ở chế độ KHÔNG kết nối (UDP)


Chương trình UDPEchoServer cài đặt Echo Server ở chế độ không nối kết, cổng mặc định là 7. Chương trình chờ nhận từng gói tin, lấy dữ liệu ra khỏi gói tin nhận được và gởi ngược dữ liệu đó về Client.

1. UDPEchoServer.java
import java.net.*;
import java.io.*;
public class UDPEchoServer {
    public final static int port = 7; // Cong mac dinh cua Server
    public static void main(String[] args) {
        try {
            DatagramSocket ds = new DatagramSocket(port); // Tao socket voi cong la 7
            byte[] buffer = new byte[6000]; // Vung dem chua du lieu cho goi tin nhan 
            while(true) {    // Tao goi tin nhan
                DatagramPacket incoming = new DatagramPacket(buffer,buffer.length);
                ds.receive(incoming); // Cho nhan goi tin gui den
                 // Lay du lieu khoi goi tin nhan
                String theString = new String(incoming.getData(),0,incoming.getLength());   
                //  Tao goi tin gui chua du lieu vua nhan duoc
                DatagramPacket outsending = new DatagramPacket(theString.getBytes(), 
                incoming.getLength(),incoming.getAddress(), incoming.getPort()); 
                ds.send(outsending);
            }
        }
        catch (IOException e) {
            System.err.println(e);
        } 
    }
}
        Chương trình EDPEchoClient sẽ cho phép người sử dụng nhận các chuỗi từ bàn phím, gởi chuỗi sang EchoServer ở chế độ không nối kết ở cổng số 7, chờ nhận và in dữ liệu từ Server gởi về ra màn hình.

2. UDPEchoClient.java

import java.net.*;
import java.io.*;
public class UDPEchoClient extends Object{
        public final static int serverPort = 7; // Cong mac dinh cua Echo Server
        public static void main(String[] args) {
        try {
            if (args.length ==0) { //Kiem tra tham so, là dia chi cua Server
                System.out.print("Syntax: java UDPClient HostName"); 
            return;
            }
            DatagramSocket ds = new DatagramSocket();     // Tao DatagramSocket
            InetAddress server = InetAddress.getByName(args[0]);   // Dia chi Server
            while(true) {
                InputStreamReader isr = new InputStreamReader(System.in);      
                BufferedReader br = new BufferedReader(isr);                        
                String theString = br.readLine();                                            
                byte[] data = theString.getBytes();     // Doi chuoi ra mang bytes
                // Tao goi tin gui
                DatagramPacket dp = new DatagramPacket(data,data.length,server, serverPort); 
                ds.send(dp); // Send goi tin sang Echo Server 
                byte[] buffer = new byte[6000];     // Vung dem cho du lieu nhan
                // Goi tin nhan
                DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); 
                ds.receive(incoming); // Cho nhan du lieu tu EchoServer gui ve
                // Doi du lieu nhan duoc dang mang bytes ra chuoi và in ra man hinh
                System.out.println(new String(incoming.getData(), 0, incoming.getLength())); 
            }
        }
        catch (IOException e) {
            System.err.println(e);
        }
    }
}
        Chú ý: khi thực hiện chương trình UDPEchoClient phải đưa vào đối số là địa chỉ của máy tính đang thực thi chương trình UDPEchoServer. Trong ví dụ trên, Server và Client cùng chạy trên một máy nên  địa chỉ của UDPEchoServer là  localhost (hay 127.0.0.1). Nếu UDPEchoServer chạy trên máy tính khác thì khi thực thi, ta phải biết được địa chỉ IP của máy tính  đó và cung cấp vào  đối số của chương trình. Chẳng hạn, khi UDPEchoServer  đang phục vụ trên máy tính  ở  địa chỉ 172.18.250.211, ta sẽ thực thi UDPEchoClient theo cú pháp sau:

        java UDPEchoClient 172.18.250.211