2010-11-12

Монгол хүний хийсэн програмын хэл

Яаая, хүний анхаарал татах гээд лаг гарчиг тавьцан.

2 сарын өмнөөс нэг хэлмэрчилдэг програмын хэл хийж эхэлсэн юмаа. Одоо альфа хувилбараа толилуулмаар байна. Дуусах яагаачгүй байгаа болохоор "0.81" хувилбар гэж нэрлэе.

Энэ хаягаас татаж авч болно. http://www.box.net/shared/sqp3d08p9e

Татаж авсны дараа задлаад root хэрэглэгчээр орсны дараа доорх коммандуудыг ажиллуулна.

# make
# litelang example.lite
example.lite болон түүн дотроос дуудагдаж байгаа factorial.lite програм нь доорх агуулгатай.

example.lite

print("Тавтай морил!")

include("factorial.lite")

a=7
b=4
print("a=",a,", b=",b)
print("a+b=", a+b)
print("a/b=", a/b)
print("a%b=", a%b)
print("a!=",factorial(a))
print(8,"!=",factorial(8))

gcd = func(x,y)
  while y > 0
    z = y
    y = x%y
    x = z
  end
  return(x)
end

print("15,12 хоёр тооны хамгийн их ерөнхий хуваагч бол: ",gcd(15,12))

print("Таны нэр: ")
a = input()
print("Сайн уу, ", a)

print("
litelang програмын хэл нь одоогийн байдлаар
альфа шатандаа байна.
")

factorial.lite

print("
Энэ файлд факториал функцийн тодорхойлолт бий.
")

factorial = func(n)
    value = 1
    while n>0
       value *= n
       n -= 1
    end
    return(value)
end

2010-10-01

General purpose linked list, stack and queue for C

Programmers refer to use modern programming languages like Java, Python or Ruby for their uses, because of their powerful built-in functions and flexibility. However, sooner or later, a programmer will have to face their old fella C someday.

For me, I had to use C when I decided to write an interpreter for a programming language I am developing. Of course, C lack of a bunch of stuff, which other modern languages have like hash table, and indexing of a list with a negative index (Python can do list[-2]), etc. But the first things I needed were stack, queue and linked list. We always write these ourselves when programming in C.

Here, I wrote a code for a linked list which can be used as stack and queue and supports negative indexing. Followings are the codes hosted on Google Code:

http://code.google.com/p/litelang/source/browse/trunk/litelang/slist.h (Includes description for methods)

http://code.google.com/p/litelang/source/browse/trunk/litelang/slist.c

Peace!

2010-05-12

Image Processing буюу Зураг Боловсруулалт

Номын санд явж байсан манай сургуулийн нэг Камбуж залуу нэг даалгавар хараадхаа гэхээр нь очоод харсан сонирхолтой санагдаад хийж үзлээ.

ppm төрлийн зургийн файл нь ASCII форматаар илэрхийлэгддэг юм байна.

Жишээ нь доорх шиг ppm форматтай зургийг текст эдитор дээр нээвэл хажуудахь шиг харагдана.

Файлыг эндээс татаж авч болно.

ASCII кодыг тайлбарлавал:
P3 # форматын төрөл
150 150 # зургийн өргөн, урт
255 # хэрэглэгдсэн максимум өнгө
176 # эхний цэгийн RGB кодын Red
158 # эхний цэгийн RGB кодын Green
158 # эхний цэгийн RGB кодын Blue
172 # хоёр дахь цэгийн RGB кодын Red
152 # хоёр дахь цэгийн RGB кодын Green
153 # хоёр дахь цэгийн RGB кодын Blue

3 дахь мөрөөс хойш 150x150x3 мөр байна. Учир нь 3 тоо нэг цэгийн өнгийг илэрхийлж байна.

Тэгээд код бичиж үзлээ, энгийн мөртлөө их таалагдлаа. Програмыг ажиллуулахад доорх дөрвөн зураг ppm форматаар үүсэх юм.

Хүний арьсны өнгийг аватарын арьсны өнгөтэй төстэй болгодог болохоор ингэж нэрлэлээ :) Зургийн RGB кодны улаан, цэнхэр хоёр утгыг нь солиход гарна Зургийн нэгатив Зургийн хэмжээг 2 дахин багасгасан байдал Толинд харсан байдал

За ингээд эцэст нь кодоо хавсаргая:


#include 

#include 



int main() {

        FILE * input;
        FILE * avatar;

        FILE * negative;

        FILE * small;
        FILE * mirror;

        int i, m;

        int width, height, max;

        char fname[20];
        

        printf("Enter the name of the file: ");

        scanf("%20s", &fname);
        

        input = fopen(fname, "r");
        avatar = fopen("avatar.ppm", "w");

        negative = fopen("negative.ppm", "w");

        small = fopen("small.ppm", "w");
        mirror = fopen("mirror.ppm", "w");

        
        if (input == NULL) {

           printf("ERROR: The file can not be found!\n");

           return -1;

        }
        

        fscanf(input, "P3\n%d %d\n%d", &width, &height, &max);
        fprintf(avatar, "P3\n%d %d\n%d\n", width, height, max);

        fprintf(negative, "P3\n%d %d\n%d\n", width, height, max);

        fprintf(small, "P3\n%d %d\n%d\n", width/2, height/2, max);
        fprintf(mirror, "P3\n%d %d\n%d\n", width, height, max);

        
        int dim = width*height;

        int temp[dim][3];

        
        for (i=0;i < dim;i++) {

            fscanf(input, "%d %d %d ", &temp[i][0], &temp[i][1], &temp[i][2]);

            fprintf(avatar, "%d %d %d ", 

                temp[i][2], 

                temp[i][1], 

                temp[i][0]);
            fprintf(negative, "%d %d %d ", 

                max-temp[i][0], 

                max-temp[i][1], 

                max-temp[i][2]);

            if ((i/width)%2==0) {

                if (i%2==0)

                   fprintf(small, "%d %d %d ", 

                       temp[i][0], 

                       temp[i][1], 

                       temp[i][2]);

            }

        }
    
        for (i=0;i < dim;i++) {
        m = (i/width)*width+width-i%width-1;
        fprintf(mirror, "%d %d %d ", temp[m][0], temp[m][1], temp[m][2]);
        }
        

        fclose(input);
        fclose(avatar);

        fclose(negative);

        fclose(small);
        fclose(mirror);

        return 0;

}

Дажгүй цэгцтэй код боллоо. Зураг том бол RAM-д их зай эзлэх нь дээ. :(

2010-05-08

Confession of an Invader

Nearly 1.5 thousand light years from home and we finally made it. 2060 AD, a united space expedition called Confederation of Space Missions discovered a new planet with life on it. After leaving the Earth which has ultimately limited resource and overpopulation, the team finally made to one of 50 moons of NZ53-04 planet in the NZ-53 solar system, which was first located in the 2010s. This moon, relatively younger than our Earth, has enormous amount of aqua and a very dynamic life-form.

This was supposed to be the home, new hope for the mankind. About 2.3 times bigger than the Earth, physically the planet is formed by highlands and deep valleys. The planet has magnificent amount of dissipate, the planet is almost all covered with deep cloud, the highlands are similar to shallow rain forests and streams on it are fed by the clouds. What are in the deep valleys and what is happening out there is mystery. Earlier expeditions reported deathly fauna – giant lizard-like creatures and scary jungle. People called these deep valleys “death” valleys.

We called the planet Renzhou, Chinese for “Man's dominion”, though its indigenous intellectual creatures are the Mangi. Mangis, koala-sized creatures, have tribal societies like earlier plains people. They lived in the planet's highlands. Although, they seemed frightened when the research teams first came, they became friendly shortly.

The cloud making an layer underneath the planet's atmosphere made people hard to breathe, since the pressure was too high. It was a major obstacle for forming colonies alongside the planet since everyone with wear special costume and people would only live in facilities. It was impossible because the first immigration package from the Earth would include some 4 billion people and livestock. Scientists came out with a solution. The solution was to use microwave and chemicals to reduce the amount of the cloud. They were successful. The cloud did became less.

Understanding that the planet's weather condition was changing as a result of humans actions, the mangis were unpleasant with the situation. Clashes of different sizes took place in the highlands. Approved by the United Nations, army regiments and raged volunteers started war against the mangis. As a result the mangis were relocated to the death valleys.

We established colonies on the highlands. New Australland, Ningpo, Nova Occitan, Fukian, Formosa, and Gulliver were among the first ones. Minor mutations were observed among people. This phenomenon first was thought to be fine. It was later proved that the thick cloudy structure covering the planet was making the life on Renzhou immune to the toxic substances coming from NZ-53 and NZ-53-04.

The cloud was unrecoverable since the forests both in the highlands and the deep valleys are decreased 80% in size and the water supply has decreased 65%. 44 years ago, man was first coming to Renzhou, and today we are leaving the planet with our spaceships. I am one of the few people who were lucky enough to be on one of the ships. About 3.4 billion people are left on the planet for definite death. We, on the ships, are all infected with the toxins. It is most probably that we all be died as well.

Evolution, “the stronger beats the weaker”, cruelty, Darwin's law, war, violence, … Unfortunately, it seems that they will always exist alongside with human.

2010-05-01

Downloading your e-mail on a server to process

You know all the great features of craigslist and Facebook, that use anonymous, standalone e-mail for forwarding request to an ad owner or replying to a message via e-mail.

Well, I will show you how to do something like these.

Scenario: An chronological script will download new e-mails, then a Python script will process on these e-mails.

For downloading e-mails, I used getmail4. The best tutorial for it can be found here.

For my case, /home/manchurian/.getmail/getmailrc looks like this:

[retriever]
type = SimplePOP3Retriever
server = [my_mail_server]
username = [my_mail]
password = [my_mail_password]

[destination]
type = Mboxrd
path = /home/manchurian/inbox

Make the mail downloading automatic using crontab -e:

* * * * * getmail -n
-n is for retrieving new mails only.

Now it is time to process the downloaded mails anyway you want:

import mailbox
mails = mailbox.mbox("/home/manchurian/inbox")

mails.lock()

try:
   for m in mailbox:
      if m['from'] == 'abc@abc.org':
         print m['subject']
finally:
   mails.unlock()

Cheers,

Backing up MySQL database

Losing data on your business application's database would be a real disaster. Here's a way simple script to back up your MySQL database.

Scenario

We have a remote Debian server with the database, and an Ubuntu server (Intel Xeon) in our office right beneath my table. :)

We wanted to have our database backed up daily. So here we go:

1-st step. Save SQL script of the database in the remote server.


#!/bin/bash
export d=$(date +'%Y-%m-%d')
mkdir -p /root/backup/$d
mysqldump --add-drop-table --allow-keywords -q -a -c -u root -p[password_for_mysql_root] [databasename] > /root/backup/$d/[databasename].sql

Save it as /root/mysqlbackup.sh

2-nd step. Automize it with crontab -e to run daily at 05:30.

30 05 * * * /root/mysqlbackup.sh

3-rd step. Fetch the SQL from the local server and save.

#!/bin/bash
export d=$(date +'%Y-%m-%d')
mkdir -p /root/backup/$d
pscp -sftp -l root -pw [password_for_remote_server_root] root@[server_ip]:/root/backup/$d/[databasename].sql /root/backup/$d
exit 0

2010-03-22

Berkeley RISC I

RISC төрлийн архитектуртай Berkeley RISC I ассемблэр дээр код бичиж үзлээ.


N EQU 10
DIZI EQU $500

 ORG $500
 DCINT 7
 DCINT -98
 DCINT 5
 DCINT 678
 DCINT -832
 DCINT 4567
 DCINT -789
 DCINT 409
 DCINT -372
 DCINT 65


 ORG $600
START:
 ADD R0,N,R17  
 XOR R16,R16,R16  
 SLL R17,2,R17  
back: 
 LDL (R16)DIZI,R2  
 CALL deltaD(R0),R3 
 NOP
 STL (R16)DIZI,R2  
 ADD R16,4,R16  
 NOP
 SUB R16,R17,R18  
 NOP
 JMP BMI,back(R0) 
 NOP
 NOP

 ORG $700
deltaD: 
 SLL R2,1,R21  
 JMP BMI,neg(R0)  
 NOP
 NOP
 
 SLL R2,2,R2  
 RET (R0)R3
 NOP

neg: 
 SUB R0,R2,R2  
 NOP 
 RET (R0)R3
 NOP


2010-03-07

Моторолла 68000

Эхэн үеийн Макуудад ажилладаг байсан Моторолла 68000 процессерийн ассемблэр хэл дээр програм бичлээ. 16 бит, тэмдэгтгүй тоог анхны тоо эсэхийг шалгадаг програм; яарч хийсэн учир илүү хурдан ажиллууладаг, цөөхөн регистр ашигладаг болгож амжсангүй.
     ORG $0500
num   DC.W  83

     ORG $0600
res   DS.B   1


     ORG  $1000
start MOVEA.L      #$4000,SP

     MOVE.B       #2, (res)
     PEA       num         
     JSR        chkpri     
     MOVE.B   D7, res

     MOVEA.L    #$4000,SP

     MOVE.B #9, D0
     TRAP #15

     ORG  $2000
chkpri MOVE.W  6(A7),A1
     MOVE.W  #2,D3
     MOVE.W  (A1),D4
back  MOVE.L  D4,D2
     DIVU.W  D3,D2
     ADD.W  #1,D3
     CMP.W  D4,D3
     BEQ  pri
     SWAP  D2
     CMPI.W  #0,D2
     BNE  back
     MOVEQ  #0,D7
     RTS
pri   MOVEQ  #1,D7
     RTS


     END  START
chkpri рутиныг ашиглаад массиваас анхны тоонуудыг ялгаж өөр массивт хуулдаг програм:
   ORG $0502
from   DC.W 87,92,7,84,65,32,11,83,103,287
N    DC.W  10

   ORG $0602 
to   DS.W N
  

     
       
   ORG     $1000
 
start   MOVEA.L     #$4000,SP
  
  
   LEA  from,A2 
   LEA  to,A3 
   MOVE.W  N,D5   
   MULU.W  #2,D5   
        
   MOVE.W  #0,D1   
back1   PEA  0(A2,D1.W)  
   ADDI.W  #2,D1   
   JSR  chkpri   
   CMPI.W  #1,D7   
   BEQ  cpypri
   CMP.W  D1,D5   
   BNE  back1
                       LEA  to,A3 
   MOVE.W  D6,(A3)   
   JMP  out   
   
cpypri          ADDI.W  #1,D6   
   ADD.W  #2,A3   
   MOVE.W  D4,(A3)   
   JMP  back1

out

2010-02-17

Linux сервер дээр SVN суулгах

SVN (Subversion) бол багаараа хамтарч төсөл гүйцэтгэхэд тун хэрэгтэй зүйл. Энд тохируулах үйл явцыг бичлээ. Хэрвээ та Debian юмуу Ubuntu хэрэглэж байгаа бол энд хэрэгтэй Apache HTTPd, Subversion зэргийг суулгах нүд эрмэхийн төдий амар зүйл тул суулгах хэсгийг алгасья. Доорх үйл явцад SVN-рүү HTTP протокол ашиглаж холбогдохоор бодож хийе:
# mkdir /subversion
# chown www-data:www-data /subversion
# su www-data
$ svnadmin create /subversion
$ exit
# htpasswd -c /subversion/htpasswd dagvadorj
# htpasswd /subversion/htpasswd oyunjargal
Дараа нь /etc/apache2/httpd.conf файлд дараах мөрүүдийг оруулна:
 <location /svn>
   DAV svn
   SVNPath /subversion
   AuthType Basic
   AuthName "Dagvadorj Subversion Repository"
   AuthUserFile /subversion/htpasswd
   Require valid-user
 </location>

2010-02-12

Spoj-ийн бодлого бодов

spoj.pl сайт ч гоё шүү. Мэдээд удаж байгаа боловч ёр бодлого бодож амжихгүй юмаа. Өнөөдөр ADDREV кодтой бодлогыг бодлоо. Өгөгдсөн тоонуудыг тонгоргож хөрвүүлээд хооронд нь нэмээд, нийлбэрээ бас тонгоргох юм байна. Тоонуудтай бөх барилдаж байгаа юм шиг болчлоо. :D Мартагдах гээд байхаар нь Python-оор бодлоо. Бодолт нь дор байгаа:


def reversify(num):
 p = str(num)
 s = ""
 i = len(p)-1
 while i >= 0:
  s += p[i]
  i = i - 1
 return int(s)

k = raw_input()

h = []

for j in range(int(k)):
 inp = raw_input()
 l = inp.split(" ")
 h.append(l[0])
 h.append(l[1])

u = 0

while u < 2*int(k):
 print reversify(reversify(h[u]) + reversify(h[u+1]))
 u = u + 2

Гэм нь Python-оор бодсон бусад бодолтуудын хажууд жаахан удаан ажилладаг боллоо. Илүү хурданг хийе гэхээр манай хүн унтья, орой болчлоо гээд байхын. Маргааш ажилтай унтья дөө.

2010-01-04

Энэ вэбийг синхрон бишээр авья

2, 3 жийлийн өмнө хүн болгоны магтан ярьж байсан зүйлсийг одоо л би ярих гэж байна даа. Төдий чинээ хоцорч яваа минь энэ биз дээ. Юуг магтаад байсан бэ гэхээр гэдэг технологи. Энэ нь Asynchronous JavaScript and XML гэсэн үгийн товчлол, гэсэн хэдий ч сүүлийн үед бас Ajax гээд товчлол биш шинэ үг маягаар хэрэглэх болсон нь энэ технологийг шүтэн хэрэглэгчдийн анархи биз. Санаа нь вэб хуудас ачааллаж дууссаны хойно бүхэл бүтэн шинэ хуудас ачаалахгүйгээр сервер дэх програмыг ажиллуулан үр дүнг буцааж аван өмнө ачаалласан хуудсанд харуулна гэдэг дээр тогтож байна. Энэ технологийн одууд гэвэл олон байна, жишээ нь: Google Maps, Writely (Google Docs болсон), GMail гээд олон байна. Тухайлбал, Google Maps хиймэл дагуулаас авсан жижгээс томруугаа 13 ширхэг том зураг олон хуваагдсан байгаагийн аль нэг ачаалласан зургийн зөвхөн хэрэглэгчийн фокуст байгаа хэсгийг л ачааллан харуулж, хэрэглэгч хулганаар зургийг чирэхэд зөвхөн шинэ фокус дахь зургуудыг серверээс нэмж ачааллах гэсэн замаар хурдан ажиллаж байна.

Яг тэр 2, 3 жилийн өмнө нь AJAX стандартчилагдаж байхад нь вэбийн стандандартын W3C-гийн сайтруу орж үзэж байгаад XMLHttpRequest обьектийг хэрэглэж үзэж билээ, ид шид юм шиг л санагдаж байсан. Гэхдээ JavaScript дорвитой хэрэглэхээс хальширч байсан учир тэгэсгээд орхисон юм. Учир нь нэг бичсэн код туршиж байсан вэбийн хөтөч програм дээр ажилаад өөр хөтөч дээр ажиллахгүй гэх мэт олон садаа байлаа. Мөн AJAX-д хамгаалалтын асуудлууд байлаа.

За тэгээд л вэб хийхдээ дандаа сервер талтай код бичээд л байлаа. Тэгсэн мөнгө бүхнийг өөрчлөнө гэгчээр санхүүгийн хямралд ороод ирэхээр яахын аргагүй нэгэн бүртгүүлсэн ажлынхаа ажил олгогчид нэг хоногийн дотор AJAX хэрэглэдэг үнэ хаялцах жижигхэн хэрэглээний програм бичиж үзүүлье гээд хэлчихлээ.

Харин энэ үед AJAX вэб хуудас хийх харьцангуй асар болсон байлаа. Ингээд feeditor.com/bidding хэрэглээний програмыг бичлээ. Хэрэглэсэн технологиудын хувьд гэвэл:

  • Java (Java 1.6; Tomcat 5.5)
  • DWR (Direct Web Remoting)
  • MySQL
  • Dojo Toolkit
  • Scriptaculous
  • Prototype

Ингээд кодуудыг (war + build.xml) нь эндээс татаж авч болно шүү. Харин эндээс өгөгдлийн сангийн кодыг авч болно.

Надаар кодуудыг нь тайлбарлуулсан бичлэг бичүүлмээр байвал бичлэгт санал сэтгэгдэлээ бичээрэй.