asdf

Sunday, February 5, 2012

The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key

Ubuntu дээр сайжруулалт хийхэд

W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://security.ubuntu.com oneiric-security Release: The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key

Ийм алдаа өгвөл ингэж засах юм байна.

$ sudo -i
# apt-get clean
# cd /var/lib/apt
# mv lists lists.old
# mkdir -p lists/partial
# apt-get clean
# apt-get update

Хурдан эрэмбэлэлт (Quick Sort) - C VS Lisp

Хурдан Эрэмбэлэлтийг 1960 онд Чарльз Энтони Ричард Хоар Москвагийн Их Сургуульд оюутан байхдаа Үндэсний Физикийн Лабораторийн төсөл дээр ажиллаж, тэр үедээ энэхүү эрэмбэлэлтийг хөгжүүлсэн байна. Хурдан Эрэмбэлэлт хамгийн өргөн хэрэглэгддэг эрэмбэлэлт юм.

Хугацаа нь:
  • Сайн тохиолдолд O(n log n)
  • Дундаж тохиолдолд  O(n log n)
  • Муу тохиолдолд O(n^2)


Алгоритм нь:

1. Гол элемент (pivot)-ээ жагсаалтаас сонгоно.
2. Жагсаалтаас гол элементээс их болон бага элементүүдийн хоёр жагсаалт үүсгэнэ.
3. Үүссэн жагсаалт бүр рекурсээр дахин их, бага гэж задарна.
4. Задарсан жагсаалтууд дараах дарааллаар нэгтгэгдэнэ: Бага элементтэй жагсаалт, гол элемент, их элементтэй жагсаалт

Си дээр:

void quicksort(int a[], int first, int last)
{
    //Гол элементээ эхний элементээр авлаа
    int pivot = first;
    int i = first;
    int j = last;
    int temp;
    if (i > j)
        return;
    for(;;)
    {
        while(a[++i] <= a[pivot] && i < last);
        while(a[j] > a[pivot]) j--;
      
        if(i > j)
            break;
       //Гол элементээс бага мөртлөө их талд нь
      //Гол элементээс их мөртлөө бага талд нь байгаа
      //Хоёр элементүүдийн байрыг сольж байна
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    //Гол элементээ завсарт нь хавчуулж байна
    temp = a[pivot];
    a[pivot] = a[j];
    a[j] = temp;
    //Их, бага хоёр жагсаалтаа тус тусад нь эрэмбэлнэ
    quicksort(a, first, j - 1);
    quicksort(a, j + 1, last);
}

Лисп дээр:

(defun q-sort (list &optional (f #'<))
 ; Жагсаалт ганц элементтэй бол жагсаалтыг буцаана
  (if (null (cdr list)) list
 ; q-sort-оор эрэмбэлэгдсэн гол элементээс их биш 
; элементүүдтэй жагсаалтыг
    (append (q-sort (remove-if-not #'(lambda (x) (funcall f x (car list))) (cdr list)) f)
; Гол элемент болон
            (list (car list))
; q-sort-оор эрэмбэлэгдсэн гол элементээс их 
; элементүүдтэй жагсаалттай нэгтгэнэ
            (q-sort (remove-if #'(lambda (x) (funcall f x (car list))) (cdr list)) f))))


Жич: Гол элементийг жагсаалтын эхний эхний элементээр сонгож авсан болно.

Гол элемент сонгох дээр Принстоний Их Сургуулийн профессор доктор Роберт Седжвикийн санал болгож байгаагаар жагсаалтын голын индекс дэх  элементийг сонгох юм уу аль эсвэл эхний элемент, голын элемент, сүүлийн элемент гурвын медианаар сонгох нь үр дүнтэй.

Зөвлөмж

Голын индексийг авахдаа (first + last) / 2 гэж авч болох ч first болон last нь хоёулаа их тоо байвал нийлбэр нь орон хэтрэх аюултай тул үүнээс зайлахын тулд first + (last - first) / 2 гэж авах нь зүйтэй.  

Мөнхүү Роберт Седжвикийн санал болгосноор алгоритмыг сайжруулах тал дээр жагсаалтыг хуваасаар хангалттай бага элементтэй болоход Оруулах Эрэмбэлэлтээр эрэмбэлбэл илүү үр дүнтэй гэж үзжээ. Учир нь хэдхэн элементийг эрэмбэлэхийн тулд функц дуудах нь зардалтай юм.

Си хэлний санд qsort() Хурдан эрэмбэлэлтийн функц байдаг. Дэлгэрэнгүйг эндээс үзнэ үү!
 

Saturday, January 28, 2012

PlayStation 1-ийг Linux дээр

Tekken гэвэл танд юу санаанд орж байна? Мэдээж PlayStaion биз дээ. За, тэгээд Tekken тоглоомоо санаад, дээр нь өөрийн цахим тооцоолуур тогломоор санагдаад нэтээс хайж эхлэв. Мэдээж Цонх анх дээр бол хамгийн шилдэг эмулетор програм бол pSX билээ. Тэгээд л Убунту дээрээ pSX суулгах гээд үзлээ. Дарс (WINE)-аар үзсэн болдоггүй ээ. За, тэгвэл Лайнукс дээрх хувилбарыг нь хайсан аз болж байна шүү. Тэгээд л татаад суулгасан чинь Убунту ахын хурдан хөгжлөөс аль хэдийнээ хоцрогдсон байдаг байгаа. Баахан амбсын файлууд нэхээд, нөгөөдөхүүдийг нь нэтээр нэг самнаад. Арай гэж олоод суулгахаар одоо энэ хэрэгтэй, тэр хэрэгтэй гээд л. Тэгж тэгж нэг юм цонх гаргадаг болгосон шүү. Тэгсэн bio файлаа уншдаггүй ээ. Хэдэн цаг нухсан бүхэн ингэж нэг талаар боллоо.



Тэгсэн бас нэг эмулетор програм оллоо. Энэ бол PCSx. Ёстой гоё сайхан ажиллуулсан чинь тохиргоо хийх бүх сонголт нь идэвхгүй байна. За яахав гээд тоглох гэсэн чинь товчлуурууд нь төө хэрийн зайтай тохируулчихсан, өнөө дайснаа цохих гэж товчлуураа хайж олоод дарах гэсээр байтал амины тал дуусаа, тэгээд нэг хөл гарны комбинд ороод л тоолуулчих нь. Энэ арай бишээ гээд л дахиад л хайж үзлээ, нэтээр олигтой юм олдсонгүй.

Тэгвэл тооцоолуур дээр суусан янз бүрийн ямар тохиргооны файлууд байна энэ тэр гэж хайж явж байгаад PCSx-ийн bio байхгүй болохгүй анзаарлаа. Даруй л pSX-ын bio-г хуулж аваад тийшээ хийчихсэн чинь болчихдог байна шүү. Тэгээд жаал нүдэлцээд л сууж байна даа хө.

1. PCSx-ээ Ubuntu Software Center-ээс суулгачих нь.
2. Нөгөө алдарт bio хавтасны файл нь: http://www.mediafire.com/?ldypt4ffge35hab
3. Татаж авсан файлаа  ~/.pcsx/bios дотор хуулаад гүйцээ



Tuesday, January 24, 2012

Амрах цаг боллоо!

Та компьютер дээр хир удаан суудаг вэ? Би лав нэг суугаад л ертөнцөөс тасарсан л юм шиг болчихдог. Тэгтэл сүүлийн үед нуруу өвддөг боллоо. Манай найз нар ч гэсэн нуруу нь өвддөг болжээ. Тэгээд яах вэ? өөртөө нэг зориулж нэг бүрхүүл код Убунту дээр бичлээ.

30 минут болоод нэг анхааруулга өгөөд 5 минут амарч байхаар тохирууллаа.
Код нь:

notify-send Ажилдаа\!
while true;do
    sleep 1800
    notify-send Амраад\!
    t=30
    while [ $t -gt 0 ];do
        notify-send $t
        t=`expr $t - 1`
    done
    notify-send Ажилдаа\!  
done


Энийгээ sh өргөтгөлтэй хадгалаад ажиллуулах эрх олгоод л болоо. startup applications-даа хийчихвэл машин чинь асах болгон автоматаар бүрхүүл кодоо ажиллуулчихна. Тэгээд өөртөө зориулаад 5 минут амар!

Thursday, January 19, 2012

Анхны тоо олох эртний Грекийн арга

За хальт юм хум харж явсан чинь нэг ийм арга байна хө. Сонирхолтой болов уу? гэж бодож байна.

За би 20 хүртэлх тоонуудаас анхны тоонуудыг ялгая.

  1. 1-оос 20 хүртэлх тоогоо жагсаана.
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  2. Анхны тоо гэж хоёрхон хуваагчтай натурал тоог хэлдэг. Уг тодорхойлолт ёсоор 1 маань 1 гэсэн ганцхан хуваагчтай тул анхны тоо биш юм. Тэгэхээр 1 ийг дарлаа.
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  3. 2-ын тооноос эхлэн хоёроор тоолж тоонуудыг дарна. Тэгэхээр 4, 6, 8, 10, 12, 14, 16, 18, 20 тоонууд дарагдана.
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  4. 3-аас эхлэн гурваар тоолж тоонуудыг дарна. Тэгэхээр 6, 9, 12, 15, 18 тоонууды дарагдана.
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  5. 5-аас (4 дарагдчихсан) эхлэн таваар тоолж тоонуудыг дарна. 10, 15, 20. Аль хэдийнээ дарагдчихаж.
  6. 7-оос эхлэн долоогоор тоолж тоонуудыг дарна. 14. Бас дарагдаас.
  7. 11-ээс эхлэн 11-ээр. За цаашаа дарагдах тоонууд гарахгүй юм байна.
  8. Одоо үлдсэн тоонууд биччихээр чинь
            2, 3, 5, 7, 11, 13, 17, 19            За энэ дээ. 1-ээс 20 хүртэлх тооны хоорондох бүх анхны тоонууд.
Цаашаа 100, 1000 энэ тэрийг ингээд бодож болно. Гэхдээ энэ арга аль ампсын үеийн арга л даа. Хэн л одоо хэдэн мянга хүртэл тоолоод суух вэ дээ.

Wednesday, January 11, 2012

Code::Blocks IDE-ийн xterm терминалыг gnome-terminal-аар солих

Code::Blocks гэж юу вэ?

Code::Blocks бол үнэгүй, нээлттэй эхтэй, олон үйлдлийн систем дээр ажилладаг програм хөгжүүлэгч юм. Үндсэн хөгжүүлэх програмчлалын хэл нь С\С++. Мөн DirectX, Fortran, GTK++, MATLAB, OpenGL, Qt, SDL гэх мэт олон програмыг үүсгэж чаддаг.

Олон төрлийн хөрвүүлэгчдийг дэмждэг. Тухайлбал MinGW/GCC, Digital Mars, Microsoft Visual C++, Borland C++, Watcom, LCC, Intel C++ compiler.

Dev C++, Microsoft Visual C++-ийн төслүүдийг (project) ажиллуулдаг, гэх мэт.

Си дээр програм бичихэд тун зүгээр. Eclipse дээр Си аймаар удаан ажилладаг. Терминалаас хөрвүүлнэ энэ тэр гэхээр залхуу хүрээд байдаг. Code::Blocks л хамгийн дажгүй санагдсан.

Тэгсэн нэг гэм нь терминал нь икстерм (xterm) дээр юм аа. Тэгээд жином-терминал болгох хүсэл их байлаа. Тэгсэн их амархан сольчихдог юм байна.

Settings -> Environment гэж ороод General settings цэс дотор Terminal to launch console programs: гэсэн хэсэг дээр gnome-terminal -x гэж болгоод л терминал чинь жином-терминал болчихсон байна.