Sunday, November 8, 2009

gogo

Нэлээн дээхнэ үед би гөгө-ийн шэйрээс баахан юм татдаг байхдаа нэг скрипт бичиж байсан юм. Одоо тэрийгээ шэйрлэе. Юуны өмнө эхлээд гөгө-ийн url өгөхөд түүнээс линкийг нь гаргаж авах хэрэгтэй. Энэ скриптийг guyo.sh гэдэг файлд хийгээд хадгалаарай. chmod 711 guyo.sh гэхээ мартваа.
#!/bin/bash
#use at your own risk
function print_usage() {
echo "guyo.sh {number of ports} {url}"
}
if [ $# -ne 2 ]; then
print_usage
exit 1
fi
if [ "`which axel`" != '' ]; then
echo "downloading from gogo ${2}"
axel -an ${1} `curl ${2} | grep "/main/download.aspx" | sed -re 's/^.*(\/main\/download\.aspx.*)\\.*$/share.gogo.mn\1/g'`
exit 0
fi
wget ${2}
Ингээд линукс дээр чинь axel суусан бол акселаар байхгүй бол wget-ээр татна. Одоо харин олон линк өгөхөд олноор нь татъя. Үүний тулд юниксийн гол санаа болох жижиг жижиг скриптүүдийг нийлүүлснээр зорилгоо гүйцээх санааг авъя.Тийм болохоор өмнөх guyo.sh-ийг ашиглана.
#!/bin/bash
if [ $# -eq 0 ]; then
echo "please specify at least one url"
exit 1
fi
for url in $@; do
guyo.sh 8 "$url"
done
Энэ скриптээ multi_guyo.sh гээд хадгалчих. Тэгээд ажиллуулахдаа араас нь url-уудыг нь залгаад бичихэд ажиллана. Терминал дээр "- кавычканы завсар линкээ хийгээрэй. Ингээд олон файл татахад хялбар боллоо.
Хэрвээ олон линкнүүдийг татаж дуусахыг нь хүлээх ядаргаатай байгаа бол:
sudo multi_guyo.sh ${urls} && poweroff
гэхэд болно байх.

Wednesday, November 4, 2009

Youtube-ээс видео хурдан татъяаа(Linux)

Энэ видео сайтаас маш хурдан бичлэг татах 2 программ байнаа.
youtube-dl
axel энэ хоёр программыг линукс дээрээ суулгах хэрэгтэй.
Суулгасныхаа дараа
yuyo.sh шелл скриптэд дараах текстийг хуулж өгнө. Тэгээд терминал дээрээ chmod 711 yuyo.sh
axel -an 8 "`youtube-dl --get-url "$1" `"
ингээд л видеог хурдан татдаг скрипт бэлэн боллоо.
Ажиллуулахын тулд: yuyo.sh "youtube_url"

Tuesday, September 8, 2009

OOP бол сайжруулсан Copy/Paste

Ийм сонирхолтой дүгнэлтэнд хүрлээ, тэгэхээр яагаад ийм дүгнэлт хийснээ тайлбарлая. Объект хандалтат програмчлалын үндсэн ойлголт болох удамшлын тусламжтайгаар үүсгэгдсэн классуудын диаграмм нь уруугаа харсан мод хэлбэртэйгээр үүсгэгддэг. Модны аль нэг зангилаан дээр өөрчлөлт орвол түүнээс доошхи мөчирнүүд бүгдээрээ тэрхүү өөрчлөлтийг авдаг. Хэрвээ тэр өөрчлөлтийг авахыг хүсэхгүй бол override хийдэг. Нөгөө талаас удамшил ашиглавал ямар нэгэн ижил зорилготой хувьсагч эсвэл функцийн давхцал маш бага гарна. Ингэснээр хамгийн оновчтойгоор өөр өөр хэсгүүдээс copy хийж авсан ашигтай класс үүсэх юм.

Saturday, August 29, 2009

Programming IQ test: Round 1, 2


Фүү сая infoworld.com сайтнаас тест өгсөн чинь 20-иос дөнгөж 9 авлаа даа. Зарим үгийг нь орчуулж чадахгүй юм гэхдээ л оролдоод үзлээ. Харин хоёрдугаар раундад 12 авлаа. Хэр программист болохоо сонирхоорой!
http://www.infoworld.com/d/developer-world/programming-iq-test-round-1-166

Saturday, August 22, 2009

3G demonstration

Friday, August 21, 2009

Хонхыг жингэнүүлмээр байвал зүгээр л жингэнүүлэх хэрэгтэй

Он гарснаас хойш програмчлалын нэгэн хэсгийн их нухацтайгаар бодох болсон юм. Энэ нь ямар нэгэн зүйл програмчилж байхад ямар нэгэн тохиолдолд хэзээ ч ажиллахгүй гэдгийг нь мэдсээр байж түүнийг заавал шалгах хэрэгтэй болдог(if,switch бичих хэрэгтэй). Үүнийг зохицуулахын тулд runtime явцдаа өөрийнхөө кодыг RAM-н дээр өөрчилдөг зарим жижигхэн кодуудыг ажиглаж үзэв. Энэ тухайгаа GURU багшдаа хэлэхэд "Наадах чинь боломжтой, гэхдээ үүнийг сонирхвол чи хэзээ ч амжилтанд хүрэхгүй" гэж байсан юм. Намайг буруу ойлгосон байж болох ч би өөрийнхөө хариултыг долоо хоногийн өмнө л оллоо. Сонирхуулъя:
За мессенжерийн нэг программ бичиж байлаа гэж бодъё. Тэгсэн хэн нэг нь мессенжерт орж ирээд buzz хийх үед нь 2 төрлийн notification тохиргооноос хамаарч хийдэг байг.
1. Дуут дохио өгөх
2. Панел дээр жижигхэн мессеж болгож харуулах, нөхцөл ийм байна.
За би хариултаа олоогүй байсан бол яаж шийдэх байснаа харуулъя:

void onBuzz() {
switch(settings.buzzType) {
case makeSound: {
Device.makeSound();
break;
}
case showMessage: {
Panel.showMessage();
break;
}
default: {
throw new SomeException();
}
}
}
Аа харин хариултаа олсныхоо дараа:
abstract class Buzzer {
abstract void buzz();
}
class SoundBuzzer extends Buzzer {
void buzz() {
Device.makeSound();
}
}
class MessageBuzzer extends Buzzer {
void buzz() {
Panel.showMessage();
}
}
тэгээд программ эхлэх үед нь:
Buzzer buzzMaster=new SoundBuzzer();
buzz хийх үед ажиллах функц маань ийм болж хувирна.
void onBuzz() {
buzzMaster.buzz();
}
За ингээд бичиглэл хэмнээгүй ч ажиллах процессийн хувьд нэг switch-г авч хаяад шууд элдэв нэмэлтгүйгээр ажиллуулдаг болгочихлоо. Гоё биш гэж үү?,
Тэгвэл одоо яаж Settings-ээ сольж MessageBuzz болгох уу?
it's easy:
buzzMaster=new MessageBuzzer();

Monday, July 27, 2009

Droid