2009-08-10

Android дээр хэрэглээний програм хөгжүүлэх

Android нь анхлан Google-ийн зүгээс хөгжүүлэгдэн нээлттэй эх кодтой болгогдсон гар утсанд зориулагдсан үйлдлийн систем юм. Android нь Linux кернел дээр ажилладаг. Кодыг Java програмын хэл ашиглан хөгжүүлнэ. SDK нь JSON, SQLite, HttpClient гэх мэт маш хэрэгцээтэй бүтээгдэхүүнүүдийг агуулдаг учир програм хөгжүүлэхэд тун хялбар болгож байна. Энд Android SDK ашиглан програм хөгжүүлье. Гэхдээ алхам алхам явахгүй, гүйцэд код тайлбарлах маягаар урагшлах болно.

Програм

UBList нь түрээслүүлэх болон зарах үл хөдлөх хөрөнгө хайх Android системтэй үүрэн телефонд зориулсан хэрэглээний програм (үүнээс хойш "програм" гэнэ) юм. UBList програмыг ашиглан ямарваа нэгэн хот дотор дүүрэг, хороолол, хайж буй үл хөдлөх хөрөнгийн төрөл болон үнийн дээд хязраарыг сонгосны (хоосон орхиж болно) дагуу хайлт хийн хайлтан дотроосоо зар сонгон илүү их мэдээллийг олж авах мөн газрын зураг дээр байршлыг нь харах, зар тавьсан этгээдрүү залгах боломжтой. Энэхүү програм нь Улаанбаатар болон дэлхийн бусад том метрополь хотуудад үл хөдлөх хөрөнгө хайгсадад хэрэгцээтэй байх боловуу.
Энэ бичлэгийг дуусгаагүй байгаадаа хүлцэл өчье!

GMail дээр уншаагүй майлүүдээ харах

GMail дээр уншаагүй майлүүдээ олох гэж зовдог байж билээ. Search mail дээр нь in:unread гээд таагаад бичээд хайсан болчихлоо. :P

Counting sort буюу Тоолж жагсаах алгоритм

Энэ адилтгах програмыг харж байгаад Тоолж жагсаах алгоритмыг бичлээ.
#include 

using namespace std;

void countingsort(int *from, int *to, int size) {

    int bound;

    //calculate the bound
    bound = from[0];
    for(int i=1; i < size; i++) {
        if(bound < from[i]) bound = from[i];
    }
    bound = bound+1;

    // counting elements to temporary array
    // of bound length
    int *tmp = new int[bound];
    for (int i=0; i < bound; i++) {
        tmp[i] = 0;
    }
    for (int i=0; i < size; i++) {
        tmp[from[i]]++;
    }

    // processing temporary array
    for (int i=1; i < bound; i++) {
        tmp[i] += tmp[i-1];
    }

    // moving elements to final array
    for (int i=0; i < size; i++) {
        tmp[from[i]]--;
        to[tmp[from[i]]] = from[i];
    }

    delete tmp;
}

int main() {
    int from[8] = {0,4,5,0,3,4,9,4};
    int to[8] = {0};

    cout << "The initial array is: " << endl;
    for(int i=0; i < 8; i++) {
        cout << from[i] << " ";
    }
    cout << endl;

    countingsort(from, to, 8);

    cout << "The final array is: " << endl;
    for(int i=0; i < 8; i++) {
        cout << to[i] << " ";
    }
    cout << endl;

    system("PAUSE");
    return 0;
}

Android Developer Challenge 2

Android Developer Challenge 2 найман сард бүртгэл нь эхлэх юм байна.

Android дээр явцыг хянах

JavaScript, ActionScript болон бусад хэлүүд дээр debug хэрэглэхгүйгээр UI эсвэл лог ашиглан програмын run-time дахь явцыг хянах нь маш үр ашигтай болдог билээ.

Тэгвэл Android дээр ингэж хийдэг юм байна.

Эхлээд яаж dialog box гаргаж ирэх вэ гэвэл:

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;

private AlertDialog.Builder alert;

alert = new AlertDialog.Builder(this);
alert.setPositiveButton("OK", null);
alert.setCancelable(true);

alert.setMessage(R.string.alert_msg);
alert.create().show();

Програмаа бичээд алдаагүй компайл хийсэн ч гэлээ “The application … has stopped unexpectedly. Try again!” гээд бүдүүлэг бээрэгхэн мессеж гарч програм ажиллахгүй байх нь элбэг. Тэгвэл

adb catlog

гэж лог ажиллуулаад хянаж байх ашигтай.

Эндээ бас доорх кодыг run-time хэрэглэж өөрөө хянах мессеж харж байж болно.
import android.util.Log;

Log.w("My warning message >>> ", "My message goes here!");

Windows дээр Apache Ant суулгах

Юун түрүүн JDK суулгагдсан байх хэрэгтэй.

  1. Apache Ant програмын binary хувилбарыг http://ant.apache.org сайтнаас татаж авна.
  2. Татаж авсан apache-ant-1.7.1-bin.zip файлаа задална. C:\Ant гэсэн байрлалд задалсан гэж үзье.
  3. Виндовс үйлдлийн системийн Control Panel дотор System-рүү ороод Advanced табд ороод Environment Variables товчлуур дээр дарна.
  4. Гарч ирсэн цонхонд доорх өөрчлөлтүүдийг хийнэ. User variables-д ANT_HOME хэсэгт C:\Ant, CLASS_PATH хэсэгт C:\Ant\lib; гэж оруулна.
  5. Мөн System variablesPath хэсэгт C:\Ant\bin; гэж оруулна.

Одоо C\:>ant гэхэд ажиллах ёстой.

Вэб буюу Мэдээллийн Сүлжээ

Вэбийн тренд гэж яригддаг. Гэхдээ энэ ухагдахуунд бизнесмен биш, харин инженер үүднээс хандсан богинохон танилцуулга хийе гэж бодлоо.

Интернэтийн үүсэл хөгжлийн талаар зөндөө нийтлэл байдаг. Товчхон дурдах хэрэгтэй болов уу. Анхлан АНУ-гийн DoD (U.S. Department of Defense) буюу Батлан Хамгаалах Яамны зүгээс гүйцэтгэгдсэн ARPANET төсөл нь академийн ертөнцөд хэрэглэгдэж эхэлснээр яваа яваандаа Интернэтийн эх болжээ. Интернэт нь олон тооны суурин сүлжээг холбосон илүү өргөн хэмжээний сүлжээнүүдийн цогц юм. Интернэтийн тусламжтайгаар дэлхийн өнцөг булан дахь компьютерын ард сууж буй хүн бүхэн мэдээ, мэдээлэл солилцож чадах боллоо. Гэхдээ Веб гэж тэр үед байхгүй байлаа.

Өнгөрсөн жил Big Bang буюу Том Тэсрэлтийг батлах оролдлогоороо нэлээн цуу тарьсан Шведцарь дахь Европийн Цөмийн Судлалын Төвд (CERN) ажилж асан Их Британы эрдэмтэн Тим Бэрнэрс-Ли (Tim Berners-Lee) Интернэтэд мэдээлэл дамжуулах Өндөр Хурдтай Текст (HyperText) гэгчийг сэджээ. Энэ онолдоо зохицуулан мэдээлэл илэрхийлэх HTML (HyperText Mark-Up Language) болон мэдээлэл дамжуулах протокол HTTP (HyperText Transfer Protocol) боловсруулсан байна. HTML болон HTTP нь өнөөг хүртэл Веб дэх мэдээлэл дамжуулах үндсэн технологиуд юм. Вэбийн стандартчилалыг зохион байгуулах үүднээс W3C (Worldwide Web Consortium) консорциум байгуулагдсан ба сүүлд мөн Вэбийн үр ашигтай зөв хэрэглэх үүднээс SemanticWeb байгууллага ажиллаж байгаа бөгөөд хийсэн ажлаараа Их Британы хатан хаанаас Sir цол авч язгууртан болсон Сир Тим Бэрнэрс-Ли аль аль байгууллагад идэвхтэй оролцож байна.

Америкт HTML болон HTTP-д зориулж хэрэглэгчийн компьютер дээр ажиллах хэсэгч програм (бравзр) Mosaic түгэж хойноос нь Netscape гарч иржээ. Харин Microsoft корпораци өөрсдийн бүтээгдэхүүн Internet Explorer-ыг Windows 95 үйлдлийн системтэй үнэгүй тарааж эхэлснээр “Бравзрын Дайн”-д Netscape ялагдаж интернэтийн агуулгын томоохон тоглогч AOL-д зарагдан удалгүй Netscape Navigator програм нээлттэй эхтэй болсноор Mozilla Firefox болон Mozilla сан гарч ирэн Microsoft-ийн толгой дээр цахиур хагалсан гэж болно. Харин сүүлийн үед гарч ирсэн Google Chrome нь мөн шинэлэг бөгөөд маш чадвартай технологи болсон билээ.

Өндөр хурдтай текст буюу HTML-ийг боловсруулах технологи ч мөн хөгжиж ирлээ. Мэдээж HTML-ээр илэрхийлэгдсэн хуудас дан ганц текст харуулахгүй, зурагнаас авхуулаад төрөл бүрийн обьектийн илэрхийлэл дамжуулж, бравзр буюу бравзр дээр суурилсан програм тэднийг хэрэглэгчид харуулна. HTML хуудас статик бус динамик буюу програмын хэлээр урьдчилан боловсрогддог болсон нь шинэ зүйл биш билээ. Perl, CGI, PHP, ASP, CFM нар нь бүгд HTML хуудас боловсруулна. Мөн илүү дэвшилтэт Java, C#, Python, Ruby зэрэг хэлүүдийг ашигладаг Java 2 EE, ASP.NET, Ruby on Rails, JSF зэрэг платформууд байна. Веб хуудас бүхлээрээ эсвэл нэг хэсэг нь урьдчилан програмчлагдан сүлжээгээр дамжуулагдсанаар веб хуудсаар дамжуулан өгөгдлийн сантай харьцах гэх мэт олон боломж гарч ирнэ. Ийм төрлийн програмчлалыг сервер-талт програмчлал гэнэ.

Вэб хуудаснуудын болон обьектуудын байрлах компьютерыг сервер гэх ба Интернэтээр дамжуулан веб хуудсыг бравзр дээр харуулж буй компьютерыг клайнт буюу хэрэглэгч гэнэ. Вэб хуудас бравзр дээр ачаалласаны дараа мөн програмчлал агуулж байж болно. Энэ нь ихэвчлэн Netscape-ээс гаралтай JavaScript хэлээр гүйцэтгэгдэнэ.

Сүүлийн үед AJAX буюу Web 2.0 (цаашлаад SaaS, RIA гэх мэт олонг дурьдаж болно) гэж их сонсогдох боллоо. Орчин үед веб сайтууд компьютер дээр суурилагдсан програмын хийж чадах бүх юмыг хийдэг болсноор барахгүй, шинэ үйл болсон бүрийд хуудас тэр чигээрээ дахин ачааллах хэрэггүй болж хэрэглэгчид хялбарчлал болон цаг хугацаа ихийг хожуулж байна. AJAX (Asynchronous JavaScript And XML) технологиийн тусламжтайгаар ачааллагдсан вэб хуудсан дээрх JavaScript програм далдуур өөр хуудас ачааллан гарсан хариуг буцааж хүлээж авах боломжтой болжээ.

Stack

Stack нь компьютерийн програмчлалд их хэрэглэгдэх өгөгдлийн бүтэц юм. Ажиллах зарчмын хувьд LIFO (last in first out) буюу “сүүлд нэмэгдсэн нь эхэлж гарна” гэж тайлбарлагдана. Монгол хэлээр юу гэж хэрэглэж болох вэ гэж бодоод “Болор Толь”-руу орж үзвэл “бухал”, “овоо”, “тавиур” гэсэн үгүүд байж болох.

Энд нэг жишээ тавья! Уул нь генерик өгөгдөл дээр жишээ бол сайн байх ч, одоохондоо зөвхөн бүхэл тооны жишээ тавья:

stack.h
#ifndef _STACK_H
#define _STACK_H

typedef struct {
   int logiclen;
   int alloclen;
   int * elems;
} stack;

void StackNew(stack * s);

void StackDispose(stack * s);

void StackPush(stack * s, int value);

int StackPop(stack * s);

#endif

stack.c
#include 
#include "stack.h"

void StackNew(stack * s) {
    s->logiclen = 0;
    s->alloclen = 4;
    s->elems = malloc(4*sizeof(int));
}
void StackDispose(stack * s) {
    free(s->elems);
    free(s);
}
void StackPush(stack * s, int value) {
    s->elems[s->logiclen] = value;
    s->logiclen++;
}
int StackPop(stack * s) {
    s->logiclen--;
    return s->elems[s->logiclen];
}

program.c
#include 
#include "stack.h"

int main() {
    stack s;
    StackNew(&s);
    StackPush(&s, 4);
    StackPush(&s, 5);
    StackPush(&s, 6);
    printf("%d\n", StackPop(&s));
    printf("%d\n", StackPop(&s));
    printf("%d\n", StackPop(&s));
    StackDispose(&s);
    system("PAUSE");
    return 0;
}

Google Wave

Google-ийн шинэ бүтээгдэхүүн Google Wave үнэхээр электрон шуудангаас авахуулаад олон юм өөрчилж чадах байхаа. Google I/O 2009 семинар дээр болсон танилцуулах видеог эндээс үзнэ үү! “Icland is an icland.” -> “Iceland is an island.” :D

Обьект хандлагат програмчлал

#include 
#include 

using namespace std;

class Fraction {
 unsigned int num;
 unsigned int denom;
 public:
  Fraction() { }
  Fraction(unsigned int , unsigned int );
  Fraction(const Fraction & );
  bool operator==(const Fraction & z) {
   return (z.num == num && z.denom == denom);
  }
  bool operator<(const Fraction & z) const {
   if ((float)num/denom < (float)z.num/z.denom)
    return true;
   else
    return false;
  }
  void setDenom(int new_denom) {
   denom = new_denom;
  }
  unsigned int getNum() const {
   return num;
  }
  unsigned int getDenom() const {
   return denom;
  }
};

Fraction::Fraction(unsigned int new_num, unsigned int new_denom) {
 num = new_num;
 denom = new_denom;
}

Fraction::Fraction(const Fraction & z) {
 num = z.num;
 denom = z.denom;
}

template
class MyArray {
 int mysize;
    Type * content;
    public:
        MyArray(int);
  MyArray(const MyArray & z) {
   mysize = z.mysize;
   content = z.content;
  }
  Type & operator[](int i)  {
   if (i < 0) throw string("index out of bounds");
   else if (i > mysize) throw string("index out of bounds");
   return content[i];
  }
  const Type & operator[](int i) const {
   if (i < 0) throw string("index out of bounds");
   else if (i > mysize) throw string("index out of bounds");
   return content[i];
  }
  bool contains(Type elem) const {
   int i;
   for (i=0; i < mysize; i++) {
    if(content[i] == elem) return true;
   }
   return false;
  }
  const Type & operator!() const {
   int i=0;
   for (int j=1 ; j <= mysize; j++)
    if (content[i] < content[j]) i=j;
   return content[i];
  }
};

template
MyArray::MyArray(int size) {
 mysize = size;
    content = new Type[size];
}

ostream& operator <<(ostream& out, const Fraction& z)  // Overloading <<
{
 out << "( " << z.getNum() << "/" << z.getDenom() << " )";
 return out;
};
int main(int argc, int ** argv) {
    int i;
 MyArray m1(5); // creates an empty 5-element-integer array inside the object m1;
 MyArray m2(3); // creates an empty 3-element-integer array inside the object m2;
 for (int i = 0; i <= 5; i++ ){
  try{
   m1[i] = i;
  }
  catch(const string & err_msg){ // exception handler
   cout << err_msg << endl; //writes "index out of bounds"
  }
 }

 MyArray m3 = m2 = m1;

 for (i = 0; i <= 5; i++ ){
  try{
   cout << m3[i] << " ";
  }
  catch(const string & err_msg){ // exception handler
   cout << err_msg << endl; //writes "index out of bounds"
  }
 }

 if (m1.contains(3))
  cout << "Element 3 is contained in the array" << endl;
 else
  cout << "Element 3 is not contained in the array" << endl;

 cout << "The largest element in the array: " << !m1 << endl ;

 MyArray m4(3); // An array with two empty spaces

 Fraction cObj1(3, 5); // A Fraction object with an unsigned numerator and unsigned denominator
 Fraction cObj2 = cObj1;
 Fraction cObj3 (3,4);
 cObj2.setDenom(7); // sets the denomenator of the Fraction object as 7

 try {
  m4[0] = cObj1;
  m4[1] = cObj2;
  m4[2] = cObj3;
 }
 catch(const string & err_msg){ // exception handler
  cout << err_msg << endl; //writes "index out of bounds"
 }

 for (i = 0; i < 3; i++ ){ // NOTE: burada yanlislikla i<=3 yazildigini sanip degistirdim
  try{
   cout << m4[i] << " ";
  }
  catch(const string & err_msg){ // exception handler
   cout << err_msg << endl; //writes "index out of bounds"
  }
 }
 if (m4.contains(Fraction(3,7)))
  cout << "The element is contained in the array" << endl;
 else
  cout << "The element is not contained in the array" << endl;

 cout << "The largest element in the array: " << !m4 << endl ;

    return 0;
}

Windows дээр Haskell ажиллуулах

Haskell програмын хэлийн хамгийн алдартай компайлэр нь GHC буюу Glasgow Haskell Compiler юм байна. Энэ интэрпрэтэр буюу компайлэрийг Windows дээр хэрэглэснээ бичиж үлдээе!
Prelude> :cd C:/Haskell/
Prelude> :load Main.hs
*Main> main
C:/Haskell/Main.hs файлын агуулга нь доорх шиг байна.
module Main where

main = do
     putStrLn "Hello, World!"

Процесс хоорондын харилцаа буюу IPC

#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < sys/sem.h >
#include < sys/shm.h >
#include < sys/types.h >
#include < sys/ipc.h >
#include < time.h >

#define SEMKEY (1492)
#define SHMKEY (1493)
#define SHMKEY2 (1494)

int obid() {
 int shmid2;
 int * bestbid;
 if ((shmid2 = shmget(SHMKEY2, sizeof(int), 0666)) < 0) {
  exit(-1);
 }
 if ((bestbid = shmat(shmid2, NULL, 0)) == (int *) -1) {
  exit(-1);
 }
 if (*bestbid == -1)
                printf("Үнэ хаялтын шийдвэр хүлээгдэж байна.n");
 while (*bestbid == -1)
                sleep(1);
 return 0;
}

int main(int argc, char **argv){
 int n;
 int semid;
 int shmid, shmid2;
 pid_t pid;
 int retval;
 int i; // for iteration i.e., C99 standard
 struct sembuf operations[1];
 int * bids, * bestbid;
 int semval;
 int rndnum;
 int min;
 int processid;

 if (argc < 2) {
  printf("Алдаа: Ажиллуулмаар байгаа процессийн тоо хэмжээг оруулаагүй байна.n");
  exit(-1);
 }
 n = atoi(argv[1]);

 /* Semaphore */

 semid = semget(SEMKEY, 1, 0666 | IPC_CREAT);
 if(semid < 0)
 {
  exit(-1);
 }

 union semun {
  int val;
  struct semid_ds *buf;
  ushort * array;
 } argument;
 argument.val = n;

 if( semctl(semid, 0, SETVAL, argument) < 0) {
                printf("Алдаа: Сэмафорын утгыг өгч чадсангүй.\n");
                exit(-1);
        }

 /* Shared memory for bids */

 if ((shmid = shmget(SHMKEY, n*sizeof(int), IPC_CREAT | 0666)) < 0) {
  exit(-1);
 }

 if ((bids = shmat(shmid, NULL, 0)) == (int *) -1) {
  exit(-1);
 }

 /* Shared memory for the minimum bid */

 if ((shmid2 = shmget(SHMKEY2, sizeof(int), IPC_CREAT | 0666)) < 0) {
  exit(-1);
 }

 if ((bestbid = shmat(shmid2, NULL, 0)) == (int *) -1) {
  exit(-1);
 }

 *bestbid = -1;

 for (i=0; i < n; i++) {
  pid = fork();
  if (pid < 0) {
   printf("Алдаа: Хүүхэд процесс үүсгэхэд алдаа гарлаа.\n");
  } else if (pid == 0) { //child process
   processid = i;
   semval = semctl(semid, 0, GETVAL, argument);

   rndnum = (abs((getpid() * rand())) % 1000) + 10;

   *(bids+semval) = rndnum;

   printf("Процесс #%d: %d MNT Үнэ санал болголоо. ", i, rndnum);

   operations[0].sem_num = 0;
   operations[0].sem_op = -1;
   operations[0].sem_flg = 0;

   if (semval == 1) {
    printf("Шийдвэр хүлээгдэж байна.\n");
                min = *(bids+i);
    for(i=1; i <= n; i++) {
     if (min > *(bids+i+1) & i+1 <= n) {
      min = *(bids+i+1);
     }
    }
    *bestbid= min;
    printf("Хамгийн бага үнийн санал: %d MNT. obid функцд хүлээгдэж байсан процессууд ажилна.\n", *bestbid);
   }

   retval = semop(semid, operations, 1);

   if(retval == 0)
   {
    if (obid() == 0) {
                    printf("Процесс #%d: obid функцээс буцлаа. \n", processid);
                }
    exit(0);
   }

  } else { //parent process
   if (semctl(semid, 0, GETVAL, argument) == 0) {
    semctl(semid,0,IPC_RMID,0);
                shmctl(shmid,IPC_RMID,0);
                shmctl(shmid2,IPC_RMID,0);
                exit(0);
   }
  }
 }

 printf("n");
 return 0;
}

Insertion Sort Algorithm буюу Нэмж Жагсаах Алгоритм

void insertionsort(int * input, int n) {
     int j;
     int i;
     int key;
     for(j=1; j < n; j++) {
        key = input[j];
        i = j-1;
        while(i >= 0 && input[i] > key) {
            input[i+1] = input[i];
            i--;
        }
        input[i+1] = key;
     }
}

int main() {
    int i;
    int array[] = {9,8,7,6,4,2};

    insertionsort(&array, 6);
    for (i=0; i<6; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    system("PAUSE");
    return 0;
}

Дээрх алгоритм нь массивт байгаа тоонуудыг хоёр дахиас нь эхлэн тоо тус бүрийг өмнөх тоонуудтай нь харицуулан өмнөх тооноосоо бага бол байрыг нь сольж үргэлжлүүлэн итерацаар ажилна.

Хамгийн муугаар бодож байж алгоритмын үнэ цэнийг олж авна. Жишээ нь дээрх “нэмж жагсаах” алгоритмийн хувьд массив дахь тоонууд эсрэгээрээ (ихээсээ багаруу) жагсаагдсан байрлалтай бол n2 үйлдлийн дараа алгоритм ажилаа хийж дуусан байна. Өөрөө хэлбэл O(n2).