Tuesday, March 30, 2010

Python web server суулгах

Ubuntu linux хэрэглэгч бол Localhost дээрээ python вэб сервер ажиллуулах талаар бяцхан тайлбар оллоо. Хэрэг болно байх гэж найдаж байна :)

Юун түрүүнд тооцоолуур дээр тань python суусан байх шаардлагатай. Ubuntu дээр бол цаанаасаа суучихсан ирдэг. Шаардлагатай бол

sudo apt-get install python

Дараа нь Apache сервер суулгасан байх шаардлагтай (Apache mod_python).

Суулгахдаа:

sudo apt-get install libapache2-mod-python

Одоо энэ хэсэгт жаахан анхаарал шаардах тохиргоо хийгдэнэ.

cd /etc/apache2/sites-available/

sudo gedit default

default нэртэй файлыг нээгээд

Options Indexes FollowSymLinks MultiViews
AllowOverride AuthConfig
Order allow,deny
allow from all

мөрүүдийг хайж олно(Минийх дээр AllowOverride AuthConfig биш AllowOverride None гэж байсан. Тэр чигээр нь орхих нь зөв болов уу). Харин үүнийг дараах байдалтай болгож өөрчилнө. (Доор нь 3 мөр код нэмж бичнэ)

Options Indexes FollowSymLinks MultiViews
AllowOverride AuthConfig
Order allow,deny
allow from all

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

болгож өөрчлөөд хадгална. Одоо серверээ ажиллуулж шалгаж үзье.

test.py файлд дараах кодыг бичээд /var/www хавтсанд хадгал. Ерөнхийдөө энэ хавтсанд манай project-ууд хадгалагдана гэсэн үг.

def index(req):
      return "Test successful";

тэгээд цахим хөтөчийхөө(web browser) хаягийн мөрөнд http://localhost/test.py хаягийг өгөөд ажилуулаад үзэхэд "Test successful" тэмдэгт мөр хэвлэгдэж байх ёстой. Тэгвэл бүх ОК гэсэн үг ;)

Зарим тулгарч болох асуудал, түүний шийдлүүд

/var/www хавтасны хандах эрх (permission) тохироогүйгээс файл хадгалах, ажилуулах явцад бэрхшээл учирч болох юм.


sudo chmod -R 777 /var/www

командаар permission-г өөрчлөхөд хангалттай.

Apache mod_python server-ээ зогсоох эхлүүлэхдээ

sudo /etc/init.d/apache2 start

sudo /etc/init.d/apache2 stop

Хэрэв та хүсвэл дурын хавтсыг localhost-оо болгон зааж өгч, тэндээ project-уудаа хадгалахаар тохируулж өгч болно. Жишээ нь $HOME/MyProjects/Python/Web гэдэг ч юм уу.

Үүний тулд:

sudo gedit /etc/apache2/apache2.conf

командаар apache2.conf файлыг нээгээд

Alias /python/ /home/usr/Documents/Host/lab/python/

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

/home/usr/Documents/Host/lab/python/-ын оронд өөрийн хүссэн замаа зааж өгнө. Энэ хавтсандаа test.py файлаа хадгалаад ажилуулаад үзэхэд болох учиртай. Амжилт хүсье :)

Vim хэрэглэх бяцхан зааварчилгаа :)

Vim текст засварлагчийн талаар өмнөх нийтлэлээс уншиж болно. Харин энэ удаад энэ текст эдитор дээр хэрхэн ажиллах талаар өөрийн өчүүхэн туршлагаас хуваалцахаар шийдлээ :)

sudo apt-get install vim

тушаалын тусламжтай Ubuntu дээр суулгана. Ажиллуулахдаа:

vim

командаар, эсвэл

vim [filename.ext]

хэрэв filename.ext файл байвал засварлагч нээнэ, хэрэв байхгүй бол шинээр энэ нэртэй файлыг нээнэ(хадгалалгүй програмыг хаавал устана!).

Програмыг нээсний дараа i товчийг дарж insert буюу засварлах горимоор ажиллаж эхэлнэ. Юу бичих нь таны мэдэх хэрэг :) Харин засварлах горимоос командын горим руу Ctrl+C товчны хослолоор шилжинэ.

Бичсэн текстээ хадгалахдаа:

:w

эсвэл

:w [filename.ext]

Хэрвээ та ямар нэгэн програмчлалын хэлээр код бичээд түүнийгээ хөрвүүлэж ажиллуулах бол, зөвхөн хөрвүүлэх ч гэлтгүй терминалын команд биелүүлэх болбол :! тэмдэгтийн ард командаа бичиж ажиллуулах боломжтой.

:!javac HelloWorld.java

:!java HelloWorld

гэх мэт.






Курсор буюу заагчийг удирдах


Командыг горимд байгаа үед курсорыг удирдахад:

k - Дээшээ 
р - Доошоо
h - Зүүн
l - Баруун тийш нэг нэг тэмдэгтээр шилжинэ.

w - Үг үгээр зүүн тийш шижлинэ
b - Үг үгээр баруун тийш шилжинэ
( - Өгөүүлбэр өгүүлбэрээр баруун тийш шилжинэ
) - Өгөүүлбэр өгүүлбэрээр зүүн тийш шилжинэ






Олон файлтай ажиллах


1. Tab нээж ажиллуулах
:tabnew [file_name] //файлын нэрийг заагаагүй бол шинэ файл үүсгэдэг.
:tabnext //дараагийн таб руу шилжих
:tabprevious //Өмнөх таб руу шилжих
:tabclose //Таб хаах
:tabfind //Табыг нэрээр нь хайх
:tabend //Хамгийн сүүлчийн таб
:tabfirst //Хамгийн эхний таб

2. Дэлгэц хуваах буюу split

:split [file_name] //Файлын нэрийг өгөөгүй тохиолдолд дэлгэцийг 
босоогоор 2 хуваан нээлтэй байсан файлыг хувилан нээнэ

харин хуваагдсан дэлгүүцэд шилжихдээ Ctrl+W хослолоор нар зөв эргэн шилжинэ.

Програм бичих явцад гарч болох ганц нэг асуулт, хариулт

Automatic indentation: програмчлалд зориулсан бүхий л текст эдиторуудад энэ боломж байдаг. Энгийнээр тайлбарлав Enter товч дарагдах бүрд шинэ мөрийн эхэнд очих албагүй, курсор байрлаж байсан газрын яг дор нь шилжиж очно гэсэн үг. Үүнийг идэвхижүүлэхэд

:set autoindent


Tab товчийг дарахад "үсрэх" зайг тохируулах
:set tabstop=2

командыг хэрэглэнэ. Харин эдгээр тохиргоог /etc/vim/vimrc файлын төгсгөлд шинэ мөрөнд бичээд хадгалчих нь зүйтэй. vimrc файл нь өөрөө энэхүү засварлагчийн тохиргоонуудыг хадгалж байдаг файл юм.

Ер нь vim текст засварлагч маань өөрөө асар өргөн боломжтой, олон товчилбор(shortcut) хүчирхэг, гоёмсог plug-in-ууд их олонтой. Ер нь судлаад хэрэглээд байвал мөд барагдахгүй шинжтэй. Миний энэ бичсэн нийтлэлийн дагуу судалбал энгийн хэрэглээндээ энэхүү эдиторыг боломжийн түвшинд хэрэглээд сурчих боломжтой.

Аан нээрээ хэрэгтэй хэдэн командыг хэлж өгөхөө мартаж орхиж.

Tab товчийг дарахад "үсрэх" зайг тохируулах
:help //тусламжийн мэдээлэл
:wq //хадгалаад хаах
:q //тухайн нэг цонхыг хаах
:q! //тухайн цонхыг хүчээ хэрэглэн хаах
:qa! //бүх цонхыг хүчээр хаах
хаах командуудыг эхэн хэрд бичвэл хаагаад сайн судлалгүй мартчих болов гэж санасандаа хамгийн сүүлд бичье гэж бодож байсан юм :P одоо биччихлээ. VIMчин болох үйлсэд тань амжилт хүсье :)

Text editor: Vim

1976 оноос анхлан BSD Unix машинуудад хэрэглэгдэж ирсэн Vi текст завсарлагчийг 1991 онд Bram Moolenaar гэгч нөхөр илүү сайжруулан Vim=Vi Improved тэкст завсарлагчийг олон нээлттэйгээр GNU лизензийн дор гаргажээ.

Анхлан Unix төст үйлдлийн системүүд дээр гарсан ч одоогоор AmigaOS, Atari MiNT, BeOS, MS-DOS, Microsoft Windows 95/98/Me/NT/2000/XP/Server 2003/Vista/Server 2008, IBM OS/2 and OS/390, MorphOS, OpenVMS, QNX, RISC OS, Unix, Linux, BSD, and Mac OS, Apple Mac OS X дээр ажиллах болсон гэнэ.

"Programmer's Editor" гэж "алдаршсан" энэхүү текст засварлагч маань text user interface-тэй өөрөөр хэлбэл командын мөрнөөс ажиллана гэсэн үг. Командын мөрөнд ажиллахаа зүрхшээж байвал gVim буюу graphic user interface-тэй Vim хэрэглэхэд илүү хялбар (гэхдээ Терминалаас ажиллуулсан нь дээр дээ :)). Бүхий л програмчлалын хэлүүдийн соорс кодыг өнгөөр ялгах (highlight) хийдэг.

Vim-ийг элдвээр өргөтгөн ашиглах боломж бий. Сонирхуулахад Vim өргөтгөлийг өөрийх нь Vimscript гэсэн скрипт хэлээр бичдэг. Мөн MzScheme, Perl, Python, Ruby, Tcl гэх мэт хэлүүд дээр ч болдог.

Энэ эдитор дээр анхлан ажиллахад төдийлөн ойлгомжтой бус мэт санагдаж болох ч жаахан анхааралтай, оролдлоготой суувал хэдхэн минутын дотор энгийн хэмжээнд ажиллаад сурчих боломжтой. Амжилт хүсье :)

Wednesday, March 24, 2010

Terminal Twitter client software: Twyt

twyt програмын тусламжтай терминалаасаа твиттер ашиглахад асуудалгүй ажээ.

Ubuntu дээр суулгахдаа:

sudo apt-get install python-twyt
Нэвтрэхдээ
# twyt user set -u username -p password
Жиргэхийн тулд
# twyt tweet "Сайн уу? Твиттер!"
Сүүлийн твитүүдийг харахдаа:
twyt friendstl

twyt -c
командын тусламжтай илүү нарийн боломжуудыг нь харж болох юм.

Saturday, March 20, 2010

Java-г MySQL өгөгдлийн сантай холбох (JDBC)

Эхлээд өгөгдлийн сангаа үүсгэнэ.

create database jdbc_test; 
 
3 field бүхий user нэртэй table үүсгэе.


CREATE TABLE  `jdbc_test`.`user` (
`id` INT NOT NULL ,
`name` VARCHAR( 50 ) NOT NULL ,
`mail` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ; 
 
Table-дээ өгөгдөл оруулна.

INSERT INTO user
VALUES ( 1, "Gansukh", "bganaa2009@gmail.com" ) ; 
 
NetBeans IDE хэрэглэж байгаа бол Project-доо MySQL JDBC Driver jar файлыг нэмж өгнө. Үүний тулд Project-ыхоо Libraries хэсэг дээр Right Click хийгээд Add Library, MySQL JDBC Driver сонгоод Add дарна.

package jdbc_test;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class Main {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/jdbc_test";
static final String DB_UNAME = "root";
static final String DB_PASS = "";
public static void main(String[] args) {
Connection db_conn = null;
Statement st = null;
try{
Class.forName(JDBC_DRIVER);
db_conn = DriverManager.getConnection(DB_URL, DB_UNAME, DB_PASS);
st = db_conn.createStatement();
String q = "select *from user";
ResultSet rs = st.executeQuery(q);
ResultSetMetaData md = rs.getMetaData();
int col = md.getColumnCount();
for(int i = 1; i <= col; i++ ){
System.out.printf("%s\t",md.getColumnName(i));
}
System.out.println();
while(rs.next()){
for(int i = 1; i <= col; i++ ){
System.out.printf("%s\t",rs.getObject(i));
}
System.out.println();
}
}
catch(SQLException sqlExp){
sqlExp.printStackTrace();
System.exit(1);
}
catch (ClassNotFoundException cnf){
cnf.printStackTrace();
System.exit(1);
}
finally {
try{
st.close();
db_conn.close();
}
catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
}
}

Үр дүн:

run:
id name mail
1 Gansukh bganaa2009@gmail.com
BUILD SUCCESSFUL (total time: 0 seconds)

Tuesday, March 9, 2010

PHP: Using HTML form

Бүхий л dynamic web application-уудад html form хэрэглэгддэг. Жишээлбэл энэ бичлэгийн доор comment бичих талбар, google.com-ээс хайлт хийхэд хайлтыхаа текстийг бичээд Google Search, I'm feeling Lucky товчнуудыг дарах сонголтууд зэргийг дурьдаж болох юм. PHP дээр form боловсруулах тун хялбархан хоёр жишээг сонирхуулъя.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>Loop - Form Example</title>
</head>
<body>
<form action="Looped1.php" method="post" name="form">
&#1069;&#1085;&#1101; form
<input name="Text" value="" type="text">
&#1090;&#1077;&#1082;&#1089;&#1090;&#1080;&#1081;&#1075;
<input name="num" value="" type="text">
&#1091;&#1076;&#1072;&#1072;
&#1076;&#1101;&#1083;&#1075;&#1101;&#1094;&#1101;&#1085;&#1076;
&#1093;&#1101;&#1074;&#1083;&#1101;&#1085;&#1101;.
<button value="go" name="go">Go</button>
</form>
</body>
</html>
Харагдах хэлбэр нь:
Энэ form

текстийг

удаа
дэлгэцэнд
хэвлэнэ.
<from> тагд action="Looped1.php" гэж зааж өгсөн байгаа нь энэ form нь submit хийгдэх үед Looped1.php хуудсыг дуудна гэдгийг заана. Харин method="post" бичиглэл нь Looped1.php дээр $_POST[] үйлдлийн тусламжтай боловсруулагдана хэмээн ойлгож болох юм.

Looped1.php нь дараах байдалтай байна.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>

<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>Loop</title>
</head><body>
<?php
$text = $_POST['Text'];
$num = $_POST['num'];
for($i = 0; $i < $num; $i++){
echo "$text<br>";
}
?>
</body></html>
Энд $text = $_POST['Text']; $num = $_POST['num']; $_POST[] үйлдлийн тусламжтай $text $num хувьсагчуудад өмнөх source code-ын Text, num хэмээн нэрлэгдсэн text field-үүдэд бичигдсэн утгуудыг оноож байна.

Hello Form, 8 гэсэн утгуудыг бөглөж өгөөд ажилуулбал дараах байдалтай мэдээллийг хэвлэж байна :) Жишээг энд дарж харна уу

Одоо харин Database-д үйлчлүүлэгчдийн мэдээллийг хадгалдаг, тэдний бүх бүртгэлийг дэлгэцэнд хэвлэдэг form бүхий хуудсыг хийе. example_db нэртэй database-д customer нэртэй table-ийн дараад байдалтай үүсгэ.
CREATE TABLE `example_db`.`customer` (
`name` VARCHAR( 50 ) NOT NULL ,
`last_name` VARCHAR( 50 ) NOT NULL ,
`mail` VARCHAR( 50 ) NOT NULL ,
`phone` VARCHAR( 50 ) NOT NULL ,
`age` INT NOT NULL
) ENGINE = MYISAM ;

Reg.php-ийн source code:
<?php
<html>
    <head><TITLE>Registration Form</TITLE></head>
<body>
<a href='show.php'>Show Table</a>

<p>
<FORM action="save.php" method="POST">
<table>
<TR><TD>User name:</TD><TD><INPUT type="text" name="user_name"><br /></TD></tr>
<tr><TD>Last Name:</TD><TD><INPUT type="text" name="last_name"><br /></TD></tr>
<tr><TD>E - mail:</TD><TD><INPUT type="text" name="mail"><br /></TD></TR>
<tr><TD>Phone num:</TD><td><INPUT type="text" name="phone"><br /></td></tr>
<tr><TD>Age:</TD><td><INPUT type="text" name="age"><br /></td></tr>
<tr><TD><input type="submit" value="Save and Show table" /></TD></tr>
</table>

</FORM>
</p>
</body>
</html>
?>

save.php-ийн source code:

<?php
    $db_host='localhost';
    $db_database='example_db';
    $db_username='root';
    $db_password='';

    $db_conn = mysql_connect($db_host, $db_username, $db_password);
    
    if (!$db_conn){
        die ("DB connection not successful <br />". mysql_error());
    }else{
        echo "Connection successful <br />";
    }
    
    $db_select = mysql_select_db($db_database);
    
    if (!$db_select){
        die ("DB selection not successful <br />". mysql_error());
    }else{
        echo "DB selection successful<br />";
    }
    
    $un = $_POST['user_name'];
    $ln = $_POST['last_name'];
    $ml = $_POST['mail'];
    $ph = $_POST['phone'];
    $ag = $_POST['age'];
    
    $q = "INSERT INTO `customer` VALUES ('$un','$ln','$ml','$ph',$ag);";
    

    $r = mysql_query( $q);
    
    if (!$r){
        die ("Could not query the database: <br />". mysql_error());
    }else{
        echo "Query executed <br />";
    }
    echo "<a href='show.php'>Shoe table</a>";
    mysql_close($db_conn);
?>

show.php-ийн source code:

<?php
    $db_host='localhost';
    $db_database='example_db';
    $db_username='root';
    $db_password='';

    $db_conn = mysql_connect($db_host, $db_username, $db_password);
    
    if (!$db_conn){
        die ("DB connection not successful <br />". mysql_error());
    }else{
        echo "Connection successful <br />";
    }
    
    $db_select = mysql_select_db($db_database);
    
    if (!$db_select){
        die ("DB selection not successful <br />". mysql_error());
    }else{
        echo "DB selection successful<br />";
    }
    

    $query2 = "select * from `customer`";
    
    $result = mysql_query( $query2 );
    
    if (!$result){
        die ("Could not query2 the database: <br />". mysql_error());
    }

    while ($row = mysql_fetch_row($result)){
               echo "<br />$row[0]<br />"."$row[1]<br />"
        ."$row[2]<br />"."$row[3]<br />"."$row[4]<br />";
    }
    mysql_close($db_conn);
?>

Ажиллууж байгаа жишээг эндээс үзээрэй :)