Monday, November 2, 2015

kmeans + Openstreet /үргэлжлэл/

Өмнөх постонд оруулсан Pokemon уудын байршил болон тоглогчдын байршлыг openstreet дээр байршуулав


    map = new OpenLayers.Map("mapdiv");
    map.addLayer(new OpenLayers.Layer.OSM());

    var fromProjection = new OpenLayers.Projection("EPSG:4326");   // Transform from WGS 1984
    var toProjection   = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
    var size = new OpenLayers.Size(21,25);
    var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
    var zoom=9;
 
    var markers = new OpenLayers.Layer.Markers( "Markers" );
    map.addLayer(markers);
<?php
//clusteriin tseguuded marker zooh
$mar = 1; //icon uud solihod ashiglav
foreach ($clusterdata as $key => $value) {
  foreach ($value as $key => $v) {
    echo 'markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat('.$v[1].','.$v[0].').transform(fromProjection,toProjection), new OpenLayers.Icon("img/marker'.$mar.'.png", size, offset)));';
  }
  $mar++;
}
$centerlat=0;
$centerlng = 0;
//centroiduudiig haruulah
foreach ($centroids as $key => $value) {
  echo 'markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat('.$value[1].','.$value[0].').transform(fromProjection,toProjection), new OpenLayers.Icon("img/star.png", size, offset)));';
  $centerlat += $value[0];
  $centerlng += $value[1];
}

//map centert haruulah
echo 'var lonLat = new OpenLayers.LonLat( '.$centerlng/$k.','.$centerlat/$k.' )
          .transform(new OpenLayers.Projection("EPSG:4326"), 
            map.getProjectionObject()
          );
  map.setCenter (lonLat, zoom);';
?>  


Гаралт нь


Од гарсан хэсэгт покемонууд гарч ирэх харгалзах тоглогчдод байршлыг нь явуулна.

Sunday, November 1, 2015

k means алгоритм ашигласан хялбар жишээ /Pokemon/

Ерөнхийдөө k means алгоритм нь өгөгдсөн өгөгдлийн олонлогоос хамаарч k тооны cluster буюу ижил төрлийн эсвэл ойролцоо шинж чанар бүхий бүлгүүдийг үүсгэхэд ашигладаг. Хэрэгжүүлэхэд хялбар болон энгийн шинж чанараараа энэ алгоритм алдартай. Зардал бага "эрчим хүчинд хэмнэлттэй" тул ихэнхдээ аливаа их хэмжээний өгөгдөлд pre-cluster буюу илүү өндөр түвшний алгоритм д өгөгдлүүдийг бэлдэж өгөхөд хэрэглэгддэг.

Mobicom ын Дэлхийн аваргын үеэр явуулж байсан бөмбөг булаацалддаг тоглоом шиг дүрэмтэй тийм аппликешн хийх бодолтой байна. Одоогоор санаа нь бол Pocket Monster буюу Pokemon: Өдөрт тодорхой нэг байршилд pokemon гарч ирэх ба хэн түүнийг түрүүлж авч хамгийн их pokemon той болсон нь түрүүлэх юм. Үүнийг хэрэгжүүлэхэд хамгийн тохиромжтой нь k means алгоритм

Зорилго нь: Өдөрт k тооны Pokemon уудыг гаргах ба тоглогчид тэрхүү Pokemon уудыг түрүүлж олж өөрийн болгох ёстой. Мөн тоглогчид өөрт нь ойр байх pokemon ыг хэлэх ба энэ мэдээлэл хэдэн хүнд очсон өөрөөр хэлбэл өөрт нь хэдэн өрсөлдөгч байгааг сануулах юм. "It's always good to know your enemy Right?" Мөн нэг цагийн дараа гэхэд тухайн сегментээс хамаарч pokemon ы байршил өөрчлөгдөх болно, өөрөөр хэлбэл цэнтройдыг дахин бодох болно.

Бидэнд "Players" нэртэй хүснэгт түүн дотор тоглогчдын мэдээлэл, хамгийн гол нь гео байршлын мэдээлэл (latitude, longitude) нь байгаа гэж үзье. Гео байршлын мэдээлэл мэдээж үргэлж өөрчлөгдөж байна. Хамгийн сүүлд GPS асаалттай байсан цэгийг ачаалах (current) байршил гэж үзнэ.

class Data{
 var $dbhost;
 var $username;
 var $password;
 var $database;

 var $connection;

 function Data(){
        //construction
        $this->InitialDB();
    }
    //initialize with this next time
    function InitialDB(){
        $this->dbhost  = 'localhost';
        $this->username = 'root';
        $this->password  = '';
        $this->database  = 'pokemon';
    }
    /**
     * get geo data to proceed next step
     * @return  latitude, longitude mysql result
     */
    function GetGeoData(){
        if(!$this->DatabaseConnect())
        {
            return false;
        }
        $query = "SELECT latitude, longitude FROM players";
        
        $result = mysqli_query($this->connection,$query);
        return $result;
    }
    /**
     * db connector
     * @return  true or false; is DB successfully connected
     */
    function DatabaseConnect(){

        $this->connection = mysqli_connect($this->dbhost,$this->username,$this->password,$this->database);
  
        if(!$this->connection){   
            error_log("Login info wrong", 0);
            return false;
        }
        if(!mysqli_select_db($this->connection,$this->database)){
            error_log("DB error", 0);
            return false;
        }
        if(!mysqli_query($this->connection,"SET NAMES 'UTF8'")){
            error_log("UTF encoding error", 0);
            return false;
        }
        return true;
    }
}

Харин одоо үндсэн кластер хийх Kmeans классыг хэрэгжүүлье. Энэхүү арга нь бидэнд кластер үүсгэж өгөхөөс гадна тус бүрт нь цэнтройдуудын координатуудыг өгөх болно. Цэнтройдуудын байршил дээр манай покемонууд гарах ба харин тухайн цэнтройдын сегментэд орсон тоглогчдод мэдээлэл илгээх болно.


class Kmeans
{
    var $data;
    var $cluster_result; // cluster hiigdeh array
    var $centroids;
    var $centroid_distance; // centroid hurtelh zainii array
    /**
     * baiguulagch
     *
     * @param  data  ogogdliin sangaas irsen lat long olonlog
     */
    public function Kmeans(array $data)
    {
        if (count($data) < 2) {
            error_log('Data must have more than 2'); // dor hayj hoyr huvaagdahiin tuld
        }
        $this->data = $data;
    }

    /**
     * cluster hiih undsen arga, busad arguudaa aguulna
     *
     * @param   kcount   k toonii cluster bolgoh
     * @return  array    cluster hiigdsen array butsaana
     */
    public function cluster($kcount)
    {
        if ($kcount < 2) {
            throw new Exception('k have to greater than 1');
        }
        if ($kcount > count($this->data)) {
            throw new Exception('k have to less than data'); // huvaagch ni huvaagdagchaas ih bj bolohgui
        }

        do {
            if (empty($centroids)) {
                $centroids = $this->getRandomInitialization($kcount); // ehnii udaa achaalj centroid iig songoh
            } else {
                $centroids = $this->calculateCentroids($this->cluster_result); // bj boloh centroidiig oloh
            }

            $new_cluster_result = array_fill(0, $kcount, []);
            foreach ($this->data as $current) {
                $closest_centroid = $this->calculateClosestCentroid($current, $centroids);
                array_push($new_cluster_result[$closest_centroid], $current);
            }
        } while ($this->clusterResultCheck((array) $this->cluster_result, $new_cluster_result) === false);
        
        $this->centroids = $centroids;
        return $this->getClusteredData();
    }

    /**
     * bodogdson centroid iig avah
     * @return  array  centroids
     */
    public function getCentroids()
    {
        if (empty($this->centroids)) {
            return 0;
        }
        return $this->centroids;
    }

    /**
     * bodogdson cluster iig avagch
     * @return  array  clustered data array
     */
    public function getClusteredData()
    {
        if (empty($this->cluster_result)) {
            throw new Exception('Clustered data have not been hydrated yet - run cluster method first');
        }

        return $this->cluster_result;
    }
    /**
     * Sanamsarguigeer centroid uudiig songoh function
     * @param   $kcount  heden shirheg cluster bolgoh ve
     * @return  array k shirheg elementtei array
     */
    protected function getRandomInitialization($kcount)
    {
        $random_keys = array_rand($this->data, $kcount);
        $random_keys = array_flip($random_keys);
        return array_intersect_key($this->data, $random_keys);
    }

    /**
     * huvaagdsan clusteruudaas centroid oloh function
     *
     * @param   $cluster_result
     * @return  centroiduud butsaana
     */
    protected function calculateCentroids(array $cluster_result)
    {
        $centroids = [];
        foreach ($cluster_result as $cluster) {
            $cluster_sum = array_fill(0, count(current($cluster)), 0);
            foreach ($cluster as $current) {
                foreach ($current as $key => $value) {
                    $cluster_sum[$key] += $value;
                }
            }
            $centroid = array_fill(0, count(current($cluster)), 0);
            foreach ($cluster_sum as $key => $value) {
                $centroid[$key] = $value / count($cluster);
            }
            array_push($centroids, $centroid);
        }
        return $centroids;
    }

    /**
     * ajiglaj bui olonlog dotorh hamgiin oir centroid iig olj bolomjit shiljiltiig zaah
     *
     * @param   $current     datasetees ajiglaj bui array
     * @param   $centroids   centroiduud
     * @return  shiljih index
     */
    protected function calculateClosestCentroid(array $current, array $centroids)
    {
        $centroid_distance = [];
        foreach ($centroids as $centroid) {
            array_push($centroid_distance, $this->calculateDistance($current, $centroid));
        }
        asort($centroid_distance);
        $centroid_distance = array_keys($centroid_distance);
        return array_shift($centroid_distance);
    }

    /**
     * clustert zow huvaaj duussan esehiig shalgah
     *
     * @param   $cluster_result      omnoh cluster hiigdsen
     * @param   $new_cluster_result  suuld cluster hiigdsen
     * @return  omnohoosoo iluu bish bnu ugui yu boolean butsaana
     */
    protected function clusterResultCheck(array $cluster_result, array $new_cluster_result)
    {
        //medeej hooson bol davtalt yvagdah yostoi false butsaa
        if (empty($cluster_result)) {
            $this->cluster_result = $new_cluster_result;
            return false;
        }
        //omnohoos neg l elm oor clustert orvol tsaash yvah yostoi
        foreach ($cluster_result as $key => $cluster) {
            foreach ($cluster as $c) {
                if (!in_array($c, $new_cluster_result[$key])) {
                    $this->cluster_result = $new_cluster_result;
                    return false;
                }
            }
        }
        //oorchlolt bhgui tul davtalt duusnaa
        return true;
    }

    /**
     * hoyor tsegiin hoorondoh zaig eucled iin theorem ashiglaj oloh
     */
    protected function calculateDistance($point_a, $point_b)
    {
        $distance = 0;
        for ($i = 0, $count = count($point_a); $i < $count; $i++) {
            $difference = $point_a[$i] - $point_b[$i];
            $distance += pow($difference, 2);
        }
        //haritsuulaltad ashiglaj bgaa bolohoor sqrt buyu yzguur avah shaardlagagui
        return $distance;
    }
}
Харин одоо view хэсэгт дараах байдалтай хэрэгжүүллээ. Энэ нь ихэнхдээ сервис байдалтай ашиглагдана гэж үзээд ямар нэг хэвжүүлэлт хийсэнгүй, мөн дурын гэдгийг анзаарсан байх.


require_once("src/KMeans.php");
require_once("src/Data.php");

$data = new Data();
$array = array();
$k = 3; //3 cluster uusgeh

//populate data
$result = $data->GetGeoData();
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $array[] = array($row['latitude'], $row['longitude']);
}

$kmeans = new Kmeans($array);

//mother of all process - cluster hiih
$kmeans->cluster($k);

//ene hesegt heseg delay hiij bolno (optional)
//cluster bolgoson segmentuudee avah
$clusterdata = $kmeans->getClusteredData();
//clusteruudiin centroid iig avah
$centroids = $kmeans->getCentroids();

echo "Pokemon гарах байршлууд 
-----------------------
";
echo json_encode($centroids);
echo "
__________________________
Тоглогчдын сегментүүд 
-----------------------
";
echo json_encode($clusterdata);

Энэ бүхний гаралт дараах байдалтай гарч байна. Тест учир харьцангуй цөөн өгөгдлүүдтэй байгаа. Их хэмжээний өгөгдөл дээр илүү тогтвортой ажиллах болно. k нь 3 буюу 3 сегмент болголоо.



Дүгнэлт: K means алгоритм ашиглан хялбар жишээ хийж үзлээ. Ямар нэгэн дээд түвшний кластер хийгээгүй буюу өөрөөр хэлбэл зөвхөн гео мэдээлэл үндэслэж гаргасан тул янз бүрийн байшин объект гол мөрөн эсвэл ямар нэгэн боломжгүй цэг дээр манай цэнтройд байрлахыг үгүйсгэхгүй.

Thursday, May 21, 2015

Java EE эхлэл (Section 2)

Ажилтны бүртгэл хийх, тайлан гаргах жижигхэн жишээ аппликешнээ үргэлжлүүлье. model controller хэсгүүдээ тохируулсан тул одоо view хэсгийг хийнэ. Хэрэглэгчтэй харилцах хуудсууд нь JSF буюу xhtml өргөтгөлтэй байна. Мөн jsp байж болно. Онцын ялгаа байдаггүй ч сүүлийн хувилбар нь xhtml болсон.
Эхлээд jsf д зориулсан Managed Bean классыг үүсгэж өгнө. war -> New ->JSF Managed Bean


Managed Bean дараах байдалтай байна

 
package lu.ajiltan.managed;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import lu.ajiltan.beans.AjiltanFacadeLocal;
import lu.ajiltan.beans.AjiltniibolovsrolFacadeLocal;
import lu.ajiltan.beans.UlsFacadeLocal;
import lu.ajiltan.models.Ajiltan;
import lu.ajiltan.models.Ajiltniibolovsrol;
import lu.ajiltan.models.Uls;

/**
 *
 * @author Bilgee
 */
@ManagedBean
@ViewScoped
public class AjiltanManage implements Serializable{

    //enterprise java bean uud local interface eer holbogdono
    
    @EJB
    AjiltanFacadeLocal ajiltanfacade;
    
    @EJB
    AjiltniibolovsrolFacadeLocal ajiltanbolovsrolfacade;
    
    @EJB
    UlsFacadeLocal ulsfacade;
    
    //olon bolovsroliin medeelel oruulahiin tuld list ashiglana
    List bolovsrollist = new ArrayList();
    
    //ulsuudiig select One songoltond haruulahad ashiglana
    List ulslist = new ArrayList();
    
    //ehelj ajillahad songoltond ulsuudiig haruulahad post construct annotation ashiglana
    @PostConstruct
    public void init(){
        ulslist = ulsfacade.findAll();
    }

    //html page tei holbohdoo encapsulated tul get set ashiglana
    public List getUlslist() {
        return ulslist;
    }

    public void setUlslist(List ulslist) {
        this.ulslist = ulslist;
    }

    public List getBolovsrollist() {
        return bolovsrollist;
    }

    public void setBolovsrollist(List bolovsrollist) {
        this.bolovsrollist = bolovsrollist;
    }
    
    //model toroltei huvisagchuud hadgalah bolon ynz burin zuild ashiglana
    Uls ulsuud = new Uls();
    Ajiltniibolovsrol bolovsroluud = new Ajiltniibolovsrol();
    Ajiltan ajiltan = new Ajiltan();

    public Ajiltan getAjiltan() {
        return ajiltan;
    }

    public void setAjiltan(Ajiltan ajiltan) {
        this.ajiltan = ajiltan;
    }

    public Ajiltniibolovsrol getBolovsroluud() {
        return bolovsroluud;
    }

    public void setBolovsroluud(Ajiltniibolovsrol bolovsroluud) {
        this.bolovsroluud = bolovsroluud;
    }

    public Uls getUlsuud() {
        return ulsuud;
    }

    public void setUlsuud(Uls ulsuud) {
        this.ulsuud = ulsuud;
    }
    
    //Add lists, olon ajiltnii bolovsroliig ehleed listed hiine, list populate hiih arga
    
    public String addAjiltanBolovsrol(){
        bolovsrollist.add(bolovsroluud);
        bolovsroluud = new Ajiltniibolovsrol();
        return null;
    }
    
    //Medeelliig hadgalah undsen function
    public String saveAjiltan(){
        try{
            //listed populate hiisen medeelliig Ajiltnii Bolovsrol d hadgalah
            for(Ajiltniibolovsrol bo : bolovsrollist){
                bo.setAjiltniiDugaar(ajiltan);
            }
            
            //ajiltnii medeelliig ajiltan d hadgalah
            ajiltanfacade.create(ajiltan);
            return null;
        }
        catch(Exception ex){
            return ex.toString();
        }
    }
    
    public AjiltanManage() {    
    } 
}

Харин холбогдох хэсэг буюу Facade классуудад entity manager автоматаар үүссэн байх ба бага зэрэг код бичиж entity Тэй холбоно. Үүнд жишээгээр AjiltanFacade ийг авч үзвэл дараах байдалтай байна

@Stateless
public class AjiltanFacade extends AbstractFacade implements AjiltanFacadeLocal {
    @PersistenceContext(unitName = "AjiltanBurtgel-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public AjiltanFacade() {
        super(Ajiltan.class);
    }
    
    @Override
    public Ajiltan find(Object id){
        return em.find(Ajiltan.class, id);
    }
    
    //haruulah bolon list populate hiihed ashiglagdana
    @Override
    public List findAll(){
        List returnlist = new ArrayList();
        TypedQuery query = em.createNamedQuery("Ajiltan.findAll", Ajiltan.class);
        try{
            returnlist = query.getResultList();
        }
        catch(Exception ex){
            ex.toString();
        }
        return returnlist;
    }
    //hadgalahad ashiglana
    @Override
    public void create(Ajiltan empl){
        try{
            em.persist(empl);
        }
        catch(Exception ex){
            System.out.println(ex.toString());
        }
        finally{}
    }
}

харагдах хэсэг буюу Jsf page ийн хувьд үүсгэхдээ war->New->JSF Page сонгоно. Managed bean тэй холбохдоо #{managedBean} шигтгээ ашиглана.

ajiltan.xhtml


    
        Ажилтан жишээ
    
    
        
        
                
                    
                                     
                        
                    
                    
                    
                                     
                        
                    

                
        
                  
                      
                        Сургууль нэмэх
                    

                      
                        
                    
                      
                     
                 
                
                        
                    
        
        
              
            
            

            
              
             
            

              
             
            

             
              
            
    
            
            
              
                          
                         
                        
            
            

             
            
    


Wednesday, May 20, 2015

Java EE ejb эхлэл тохиргоо (Section 1)

Java ee 7, Glassfish ашиглан Ажилтны мэдээлэл хадгалж харуулах бяцхан жишээ хийе. Өгөгдлийн санд суурилсан буюу бэлэн хийгдсэн өгөгдлийн сан дээр суурилан хөгжүүлэх эсвэл шууд өгөгдлийн сангаа үүсгэх байдлаар хийх боломж байдаг. Ихэнх хөгжүүлэлтийн загварчлалд эхлээд өгөгдлийн сангаа төлөвлөдөг тул өгөгдлийн санд суурилсан аргыг сонголоо.
Өгөгдлийн сангаараа нээлттэй эх PostgreSQL ийг сонголоо. ERD г харвал

SQL Power Architect ийг загварчлахад ашиглав


Програмыг хөгжүүлэх орчноор Netbeans ийг сонголоо, учир нь Glassfish сервертэй хамт суугддаг багцтай. Project ээ эхлүүлэхдээ Java EE хавтсан дотроос Enterprise Application гэснийг сонгоно.


Дараагийн алхам бол Project дээ нэр өгч Серверээ сонгон EJB болон WAR модулуудаа үүсгэх


Одоо өгөгдлийн сантайгаа холбох хэрэгтэй. Манай тохиолдолд Postgresql дээр үүсгэсэн байгаа сантай холбох connection хийх юм. Үүний тулд netbeans ийн Services цонхон дахь Database хэсэг дээр дарж New Connection ийг сонгоно


Driver ийг сонгох хэсгээс PostgreSQL ийг сонгоно. Ихэнх тохиолдолд цаанаасаа Postgresql суусан байдаг ба хэрвээ өөр төрлийн өгөгдлийн сан сонгох бол Driver ийг суулгах шаардлагатай. Үүний дараа Postgre тэй холбох цонх гарч ирнэ. Postgre ажиллаж байгаа эсэхээ шалгаарай. 

Дараа нь Glassfish серверээ асааж, Admin Console хэсэгт нэвтрэн Connection Pool болон JNDI г нь тохируулах хэрэгтэй. Үүнийг хэд хэдэн янзаар хийх боломжтой хамгийн найдвартай нь Admin Console дээрээс үүсгэх юм билээ.

Одоо харин өгөгдлийн сантай холбогдох давхаргыг үүсгэе. EJB хэсэгт шинэ Entity Classes from Database үүсгэхийг сонгоно.

Data source хэсэгт үүсгэсэн jndi г оруулахад бүх хүснэгтүүд орж ирэх ба ашиглах хүснэгтүүдээ сонгож оруулна. Энэ нь автоматаар өгөгдлийн сантай холбогдох entity классуудыг үүсгэх юм.


Package ийн нэрийг сонгож үүсгэх классуудын тохиргоог дараах байдалтай тохирууллаа

Ингэж үүсгэсний дараа entity package д хүснэгттэй холбогдох классууд үүссэн байх ёстой. Мөн custom query нүүдийг энэ классуудад нэмэх боломжтой.


Дараагийн EJB д нэмэх хэсэг бол Модел хэсэг юм. Facade pattern ашиглах болно. Классуудыг автоматаар үүсгэхдээ New -> Session Beans for Entity Classes г сонгоно. Дараах жишээнд Local гэсэн интерфэйсийг мөн нэмж өгөв. Энэ нь view хэсгээс зөвхөн интерфэйсээр дамжиж моделд хандах боломжтой болгож байгаа.


Энэ бүхний дараа прожект ийн бүтэц дараах байдалтай болжээ. Enterprise Bean үүд нь автоматаар үүсгэгдснийг ажигласан байх.

Одоо харин Web Application хэсэг буюу jsf хуудас болон Managed bean үүдийг дараагийн хэсэгт хийе. Их орой болсон байна.

Monday, February 23, 2015

Pill Heals тоглоом

Энэхүү тоглоом нь гар утас болон таблетад зориулагдсан бөгөөд төхөөрөмжийн хурдатгал болон чиглэл мэдрэгчийг ашигласан. Тоглоомын гол зарчим нь олон төрлийн эмийн хүчийг саармагжуулагч вирусүүдээс бултаж өвчний голомтуудад очин эдгээх юм. Бүх насны хүмүүст тохиромжтой ба мөн зарим эмүүдийн тайлбарыг мэдлэг өгөх зорилгоор оруулж өгсөн. Тоглоом нь үе давах, Arcade болон Survival гэсэн 3 төрөлтэй. Arcade болон Survival төрлөөс авсан оноогоороо найзуудтайгаа болон бүх тоглогчидтой өрсөлдөх боломжтой(facebook account).

Дэлгэцийн зураг






Танилцуулга үзүүлэн



Одоогоор бүх утсан дээр туршиж үзээгүй байна

Thursday, December 11, 2014

Octave ашиглах нь (part1)

Octave нь бүх төрлийн математик тооцоололд зориулагдсан дээд түвшний програмчлалын хэл юм. Шугаман болон шугаман бус хамаарал олох, рандом утгуудын олонлог үүсгэх, өгөгдлийн олонлогт шинжилгээ хийх, матриц тай холбоотой үйлдлүүд хийхэд нэн тохиромжтой юм. Ихэнх хүмүүст тухайн үйлдлүүдийг хийхэд тооны машин ᠌᠌"жолдож", програм авахад үнэтэй юм уу нүсэр санагддагийг ажигласан. Тэгвэл октав нь маш авсаархан бөгөөд хүчирхэг хэрэгсэл юм. Гэхдээ програмчлалын хэл учраас эхлээд дүрмийг нь сурах хэрэгтэй. Ялангуяа дээд тоо гэх мэт хичээл үзэж буй оюутнуудад чухал "шипи" болно.

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

Суулгасны дараа 2 янзаар ажиллуулж болно. Өөрийн GUI тай болон Command line хувилбар.

Ерөнхийдөө комманд цонх нь илүү ачаалал даах байх гэж боддог. Аль нь ч байсан октав дээр шууд бичээд ажиллаад явах боломжтой. Мөн бусад програмчлалын хэлүүдтэй адил файлаас комманд ажиллуулах, бичсэн команд болон хариуг файлд хадгалах боломжтой.
Хувьсагч зарлах шаардлагагүй шууд утгаа оноогоод явахад болно. Нэг команд бичигдэх болгонд хэвлэж харуулах ба харахыг хүсэхгүй бол үйлдлийнхээ дараа цэг таслал тавихад болно. 
Дараах дэлгэцнээс хувьсагчтай хэрхэн ажиллахыг харж болно. d нь 1 харьцах 6 хэмжээтэй, A нь 3 2 хэмжээтэй матрицууд байна. X матриц дээр өмнө утга оноосон a болон b хувьсагчуудыг ашиглажээ. Бүх ашиглан хувьсагчуудаа харах бол "whos" (хашилтгүй) коммандыг ашиглана. Мөн бүх хувьсагчуудыг чөлөөлөх устгах бол "clear" командыг ашиглана.













Мөн матрицыг үржүүлэх маш хялбархан. Энгийн * тэмдэгтийг ашиглаад үржүүлж болохуйц матрицуудын үржвэрийг гаргана. Дараах зурганд өмнө нь ашигласан X матрицыг шинээр үүсгэсэн 2x2 Y матрицаар үржүүлж байна. Түүнчлэн янз бүрийн логик үйлдлүүдийг ашиглах боломжтой.
1 == 1 гэвэл үнэн буюу 1 ийг буцаана.
1 ~= 1 нь тэнцэхгүй гэдэг нь худал
&& - AND
|| - OR
xor( a , b) - XOR
<=, >=, <, > гэх мэтээр ашиглана.







Мөн янз бүрийн матрицыг үүсгэх боломжтой. Жишээ eye нь диагноль матриц үүсгэнэ. Санамсаргүй тоо үүсгэх бол гаnd функцыг ашиглана. Дараах жишээнд 3 харьцах 3 хэмжээтэй санамсаргүй тоон матриц үүсгэж байна. randn функцыг ашигласнаар Гауссын санамсаргүй тоонуудыг үүсгэнэ. Мөн янз бүрийн хэлбэрт оруулж болно.

Жишээ нь Машин сургалттай ч юм уу, Өгөгдлийн олборлолт хийх шинэ програмаа туршиж үзэхэд дата олдохгүй байгаа гэж үзье. Сурагчдын дүнгийн хамаарлын олонлог үүсгэе.

dun = 75 + sqrt(9.5) * (randn(1, 10000));

дундаж дүн 75 тай олонлог үүсгээд гистограм аар харвал дараах байдалтай харагдаж байна.



гистограм гаргахдаа hist(dun,60) функцыг ашигласан. 60 нь нарийвчлал буюу 60 бүлгээр харж байна.
Энэхүү үүсгэх функцуудыг янз бүрийн програмчлалд ашиглаж болно. Тоглоомын баатрууд, тоглоомын объектууд, Сугалаа, Систем тестлэх болон хичээл дээрээ шипи байдлаар ч ашиглаж болох юм. 

Wednesday, September 24, 2014

Mongolian name application

Монгол нэрийн толийг өнгөрсөн нэг сарын хугацаанд хөгжүүллээ. Энэхүү гар утасны апп нь оруулсан латин болон кирил үсгээр бичсэн нэрийг Монгол бичиг рүү хөрвүүлэх боломжтой байх юм. Зөвхөн оноосон нэрийг хөрвүүлэх ба монгол бичгийн толь биш юм. За тэгээд хөрвүүлсэн нэрийнхээ зургийг хадгалах, өөр апп аар хуваалцах боломжтой байна. Энэхүү апп ыг хөгжүүлэхэд Болорсофт, МУИС ын Алтай судлалын тэнхимийн хөгжүүлсэн оноосон нэрийн баазыг ашигласан.

Дизайн нь дараах байдалтай байхаар зохиомжиллоо. Одоо кодынхоо зарим нэг алдааг засаад гүүгл плей дээр тавих болно.



Жич: Монгол нэртэй бол Монгол үсгээрээ хайхыг зөвлөж байна. Жишээ нь хайхдаа BAT биш  ‍БАТ гэж хайна уу. Харин латин нэрийг дуудлагын дагуу хайвал илүү зохимжтой

Tuesday, August 19, 2014

Дэлгэцийн харьцааг алдагдуулахгүйгээр харуулах нь

Хэд хоногийн өмнө ажил дээр хийж байгаа төсөлд маань төхөөрөмжийн дэлгэцийн хэмжээ өөрчлөгдсөн ч үзүүлэнгийн харьцаа алдагдахгүй байх даалгавар тулгарлаа. Энэ ажил вебд суурилсан үзүүлэн (presentation) бэлдэх програм бөгөөд гар утсан дээр мөн ажиллах ёстой. Дэлгэцийн хэмжээ өөрчлөгдсөн ч үзүүлэнгийн хуудсанд байх контентууд энд тэнд орохгүй томорч жижгэрэхгүй байх ёстой.

1. Арга нь pure css буюу цэвэр css ээр шийдэж болох ба гарах асуудал нь эмбэд датанууд‍(embed) дээр тус бүрчлэн css бичих шаардлагатай. Мөн урт өргөн нь хатуугаар заагдсан объектыг (Жишээ нь видео, флаш) харуулахад асуудал тулгарна.

2. Хоёр дахь арга нь zoom буюу scale хийх javascript бичих. Үүнийг хэрэгжүүлэхийн тулд wrapper div объект нь хатуугаар заагдсан байх ёстой. Түүний доторх объектууд нь хатуугаар заагдсан ба дэлгэцийн хэмжээ өөрчлөгдөхөд урт өргөн өөрчлөгдөхгүй бидэнд харагдах хэсэг өөрчлөгдөнө гэсэн үг.

Миний хувьд хоёр дахь аргыг хэрэгжүүлсэн. Хэрэгжүүлэхийн тулд html ийнхээ бүтцийг тэр чигээр нь өөрчлөх шаардлагатай боллоо. Програм хангамжийн архитектур гэдэг үг толгой руу буух нь тэр.

jquery ашиглавал илүү амархан бичигдэх боловч ангулар жаваскрипт ашиглаж байгаа болохоор ямар нэгэн сан ашиглалгүй зөвхөн ангуларын дэлгэц өөрчлөгдөх эвэнтэд бичлээ.

javascript хэсэг

app.directive('resize', ['$window', function($window) {
   return {
    link: function(scope, elem, attrs) {
     scope.onResize = function() {
      var page = document.getElementById('pages');
      var wWidth = $window.innerWidth;
      
      var pWidth = page.offsetWidth;
      var wHeight = $window.innerHeight;
      var pHeight = page.offsetHeight;
      if((pHeight/sHeight)  > (pWidth/sWidth)) 
       var m = sHeight / pHeight;
      else 
       var m = sWidth / pWidth;
   
      var cols = document.getElementsByClassName('page');
       for(i=0; i < cols.length="" angular.element="" bind="" cols="" function="" i="" m="" moz-transform="" pre="" resize="" scale="" scope.onresize="" style.zoom="m;" window="">}
}
     scope.onResize();

     angular.element($window).bind('resize', function() {
      scope.onResize();
     })
    }
   }
  }])

css хэсэг

.wrapper {
   margin: auto;
   width: 960px;
   height: 720px;

  }

Ашиглахдаа

Tuesday, April 8, 2014

Java EE7 прожект (Нэг олон холбоос DropBox гаргах асуудал)

Өгөгдлийн санд бүртгэхийн тулд хөрвүүлэх классыг үүсгэж өгөх шаардлагатай байдаг юм байна. Жишээ нь нэг сурагчийн ямар ангид сурдаг болохыг DropBox оос сонгуулж бүртгэхэд enterprise bean дээр асуудал гардаг. Энэ тохиолдолд нэг олон холбоос харгалзан анги сурагч болно. Ихэвчлэн parameter хүснэгтийн утгуудаас сонгож бүртгэл хөтлөхөд тулгардаг асуудал юм.

Манай тохиолдолд SelectOne буюу DropBox бүхий талбарыг өгөгдлийн сангаас уншиж бүрдүүлсэн бөгөөд бүртгэхэд харагдах мэдээллийг хөрвүүлэх шаардлагатай юм байна. Ингэхийн тулд өгөгдлийн сангаас харуулах сонголтын хэсэг тус бүрт java Converter хэрэгжүүлэх классыг үүсгэнэ. Session bean үүсгэсэн тохиолдолд дараах байдалтай байна.

//энэхүү нэрийг ашиглан face буюу page дээр ашиглах боломжтой
@FacesConverter(value="converterName")
public class PositionDegreeConverter implements Converter {

    @EJB
    private yourEntityFacadeLocal yourFacade;
    
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value){
        try{
              //хөрвүүлэх төрлөөс хамаарч Integer юм уу String байж болно
            Object result = yourfacade.find(new Integer(value));
            return result;
        }
        
        catch(Exception ex){
            System.out.println(ex.toString());
        }
        return null;
    }
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value){
        try{
            yourEntityBean ybean = (yourEntityBean) value;
            return String.valueOf(ybean.getYourBeanMethodId());
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
        }
        return null;
    }
}

Үүнийг selectOne буюу dropbox ийн тагт дараах байдалтай оруулна.


  
                          
                         
                        
 

Friday, April 4, 2014

Glassfish сервер болон UTF 8 encode

Тэгэхээр глассфиш серверийн үндсэн encode нь ISO-8859-1 байдгийг мэдсэн биз ээ. Oracle GlassFish Server 3.0.1 Application Development Guide. Тэгвэл ихэнх хөгжүүлэгчид ялангуяа монгол хөгжүүлэгчид үргэлж UTF-8 encode ашиглах шаардлага гардаг.

Шийдэх арга нь: Серверийн тодорхойлогч буюу descriptor файлыг үүсгэх хэрэгтэй. Жишээ нь Netbeans 8 IDE дээр прожектдоо шинэ файл New -> Other -> Glassfish -> Glassfish descriptor үүсгэнэ. sun-web.xml юм уу glassfish-web.xml үүсэх ёстой ба XML edit хэсэгт parameter-encoding таг нэмэхэд хангалттай.

Дараах байдалтай харагдана

  
   
   
    
    
     
    Keep a copy of the generated servlet class' java code.