2015/10/09

Big integer add, multiply operations in C++

64 бит хэмжээнээс хэтрэх, натурал тоонуудыг нэмэх, үржих үйлдлүүдийг C++ дээр бичив. Жишээ кодонд тооны факториал олох програмыг хавсаргав.

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
int n, s;

string add(string a, string b){
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    //cout << a << " + " << b << endl;
    string sum = "";
    int a_len = a.length();
    int b_len = b.length();
    int max_len = max(a_len, b_len);
    int carry = 0;
    //cout << a << endl << b << endl;
    for(int k = 0; k < max_len ; k++){
        int digit_a = (k < a_len ? a[k] - '0' : 0);
        int digit_b = (k < b_len ? b[k] - '0' : 0);
        sum += ((digit_a + digit_b + carry) % 10) + '0';
        carry = (digit_a + digit_b + carry) / 10;
        
    }
    if(carry) sum += "1";
    //cout << sum << endl;
    reverse(sum.begin(), sum.end());
    return sum.length() == 0 ? "0" : sum;
}
string multiply(string a, string b){
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    string product = "";
    int a_len = a.length();
    int b_len = b.length();
    int max_len = max(a_len, b_len);
    
    string offset = "";
    for(int i = 0; i < a_len; i++){
        int carry = 0;
        string temp_product = offset;
        for(int j = 0; j < b_len; j++){
            temp_product += (a[i]-'0')*(b[j]-'0')%10 + carry + '0';
            carry = (a[i]-'0')*(b[j]-'0')/10;
        }
        if(carry) temp_product += carry + '0';
        
        reverse(temp_product.begin(), temp_product.end());
        product = add(product, temp_product);
        offset += "0";
    }
   
    return product[0] != '0' ? product : "0";
}
int main(){
    string result = "1";
    cin >> n;
    for(int i = 1; i <= n; i++ ){
        result = multiply(result, to_string(i));
    }
    cout << result << endl;
    return 0;
}

2015/10/05

Тэмцээн #01

Өнгөрөсөн амралтын өдрүүдэд зохиогдсон https://www.hackerrank.com/contests/sict01/challenges тэмцээнд идэвхитэй оролцож амжилт гаргасан найзууддаа баярлалаа.

2014/05/15

Jquery Ajax loader


$(function () {
                if (window.location.hash){ contentload(window.location.hash);}

                $("body").on("click", "a", function(event){
                    fragment = this.hash; 
                    if(this.hostname == window.location.hostname )
                    {
                        if($(this).attr('data-toggle') != "dropdown" && $(this).attr('target') != "_blank")
                        {
                            var load_url = this.href.split('<?php echo $_SERVER['SERVER_NAME']?>');
                            contentload(load_url[1], true);
                        }
                        return false;
                    }
                });
                
                window.onpopstate = function(event) {
                        load_url = location.href;
                        contentload( load_url, false);
                        console.log("path: " + load_url);
                       
                };
                
        });
        function contentload(load_url, is_link) {
                $("#body-loader").show();
                
                $.ajax({
                    url      : load_url,  
                    success  : function(data) {
                        $('#container-wrapper').html(data);
                        $("#body-loader").hide();
                        if(is_link)
                        {
                            var full_url = '//<?php echo $_SERVER['SERVER_NAME']?>'+load_url;
                            history.pushState({}, 'New URL: ' + full_url, full_url);
                        }
                        load_start();
                    }                     
                });    
        }

Cache header for Apache


<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>


<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 2 days"
</IfModule>

2014/03/17

Quote.mn - Онч үгсийн сайт

Quote.mn
Хэдэн жилийн өмнө, тодруулбал 2011 оны 7 сарын 10-ны өдөр онч мэргэн үгсийн сайт хийх шийдвэрээ биелүүлэхээр http://quote.mn/ домэйнийг худалдаж авснаа санаж байна. Санаагаа хэрэгжүүлэхээр 2 ч удаа кодын ажлыг гүйцэлдүүлсэн ч нэвтрүүлж чадалгүй орхисон.

Гадны сайтуудаас гайгүй хэдэн онч үг бот гүйлгэж авсан ч тэр өгөгдлийн сангаа хуудаслаж, оновчилж зохион байгуулахаас залхуурч нэг алгасав. 2 жилийн дараа Монгол хэл рүү нээлттэй орчуулгатай хийхээр болж, нийтийн сүлжээнүүдээр зарлан идэвхитэн орчуулагч хайхаа шийдсэн ч уур амьсгал эсрэгээрээ, "онч үгсийг үзэн ядагчид" нийтийн сүлжээдээр дүүрэн байгааг мэдээд хүсэл унтарсан удаа бий.

Ухаалаг үгсийг олон уншаад, хэлээд давтаад байх нь хүнийг ухаантай харуулдаг ч ухаантай болгочихдоггүй, үйл хөдлөлөөрөө ухааныг баталдаг. Гэхдээ төрөлхийн боловч тэлж нээгдээгүй ухаанд ухаарал нэмэрлэх үгс л ус, агаар мэт хэрэгцээтэй байж болох, үгүй ч байж болох.

3 жилийн өмнө худалдаж авч хадгалсан домэйнийг юутай ч нэг бүтээл болгож гаргалаа. Монгол хэл дээр гаргах, орчуулгын систем хийх санаа байсан ч нэг хэсэгтээ хийхгүй. Монгол хэл дээр орчуулах нь зүйтэй, дэмжинэ, оролцоно гэсэн санал хүсэлт хангалттай олон иртэл англи хэл дээрхи агуулга, системийг хөгжүүлнэ.

2014/02/06

Symfony 1.4: sfImageFileValidator

Symfony 1.4 дээр upload хийж буй зургийн өргөн, өндрийг шалгах шалгагч.

$this->validatorSchema['picture'] = new sfImageFileValidator(
     array(
       'required' => $this->getObject()->isNew() ? true : false,
       'path' => sfConfig::get('sf_upload_dir') . '/content_picture',
       'max_size' => 1048576,
       'min_height' => '292',
       'min_width' => '640',
       'mime_types' => array(
         'image/jpeg',
         'image/pjpeg',
         'image/png',
         'image/x-png',
         'image/gif',
          )
        ),
        array(
         'required' => 'Та зураг оруулна уу',
          'max_size' => 'Таны оруулсан зурагны хэмжээ иx байна. Хамгийн иxдээ 1024kb.',
          'mime_types' => 'Та зөвxөн зурган файл оруулаx боломжтой'));

Байдлаар ашиглана. Validator-ийн код:

2014/01/20

Symfony 1.4: sfWidgetFormDoctrineChoice виджетийн method-ийг параметертэй болгож сайжруулсан нь.

<?php
/**
* sfWidgetFormDoctrineChoiceWithParams represents a sfWidgetFormDoctrineChoice with parameter capability on table_method.
*/
class sfWidgetFormDoctrineChoiceWithParams extends sfWidgetFormDoctrineChoice {
  /**
  * @see sfWidget
  */
  public function __construct($options = array(), $attributes = array()) {
    $options['choices'] = array();
    parent::__construct($options, $attributes);
  }
  /**
  * Constructor.
  *
  * Available options:
  *
  *  * model:        The model class (required)
  *  * add_empty:    Whether to add a first empty value or not (false by default)
  *                  If the option is not a Boolean, the value will be used as the text value
  *  * method:       The method to use to display object values (__toString by default)
  *  * key_method:   The method to use to display the object keys (getPrimaryKey by default)
  *  * order_by:     An array composed of two fields:
  *                    * The column to order by the results (must be in the PhpName format)
  *                    * asc or desc
  *  * query:        A query to use when retrieving objects
  *  * multiple:     true if the select tag must allow multiple selections
  *  * table_method: A method to return either a query, collection or single object
  *
  * @see sfWidgetFormSelect
  */
  protected function configure($options = array(), $attributes = array()) {
    $this->addRequiredOption('model');
    $this->addOption('add_empty', false);
    $this->addOption('method', '__toString');
    $this->addOption('key_method', 'getPrimaryKey');
    $this->addOption('order_by', null);
    $this->addOption('query', null);
    $this->addOption('multiple', false);
    $this->addOption('table_method', null);
    parent::configure($options, $attributes);
  }
  /**
  * Returns the choices associated to the model.
  *
  * @return array An array of choices
  */
  public function getChoices() {
    $choices = array();
    if (false !== $this->getOption('add_empty')) {
      $choices[''] = true === $this->getOption('add_empty') ? '' : $this->translate($this->getOption('add_empty'));
    }
    if (null === $this->getOption('table_method')) {
      $query = null === $this->getOption('query') ? Doctrine_Core::getTable($this->getOption('model'))->createQuery() : $this->getOption('query');
      if ($order = $this->getOption('order_by')) {
        $query->addOrderBy($order[0] . ' ' . $order[1]);
      }
      $objects = $query->execute();
    } else {
      $results = $this->callTableMethod();
      if ($results instanceof Doctrine_Query) {
        $objects = $results->execute();
      } else if ($results instanceof Doctrine_Collection) {
        $objects = $results;
      } else if ($results instanceof Doctrine_Record) {
        $objects = new Doctrine_Collection($this->getOption('model'));
        $objects[] = $results;
      } else {
        $objects = array();
      }
    }
    $method = $this->getOption('method');
    $keyMethod = $this->getOption('key_method');
    foreach ($objects as $object) {
      $choices[$object->$keyMethod()] = $object->$method();
    }
    return $choices;
  }
  /**
  * Gets result for 'choices' from the Table class of model
  *
  * @return mixed Result of table method [Doctrine_Query, Doctrine_Collection, Doctrine_Record]
  */
  private function callTableMethod() {
    $tableMethod = $this->getOption('table_method');
    if (is_array($tableMethod)) {
      $results = call_user_func_array(array(Doctrine::getTable($this->getOption('model')),
        $tableMethod['method']), $tableMethod['parameters']);
    } else {
      $results = Doctrine::getTable($this->getOption('model'))->$tableMethod();
    }
    return $results;
  }
}
?>

Ашиглахдаа:

<?php
$this->setWidgets(array(
  'portraits' => new customWidgetFormDoctrineChoiceWithParams(array(
    'model' => 'EclecticPortrait',
    'multiple' => true,
    'expanded' => true,
    'table_method' => array('method' => 'getUserPortraits', 'parameters' => array($this->getOption('contact'), $this->getOption('id'))),
    )),
  ));
?>

2013/12/30

MySQL: Latin1 convert to UTF8

Олон жилийн өмнө үүсгэж байсан датабэйсүүд ихэвчлэн Latin1 үсгэн кодчилолтой байх нь элбэг. Үнийг орчин цагт хөрвүүлж, нийтлэг хэрэглэгддэг unicode руу хөрвүүлэх асуудал, бэрхшээлүүд бишгүй гардаг.

http://www.badral.net/?p=127 Бадрал ахын блогт линукс шелл командаар баазыг хөрвүүлэх команд байсан ч виндовс дээр хөвүүлэхэд асуудал гарав.

# mysqldump -u dbuser -pdbpass --opt --skip-set-charset --default-character-set=latin1 --skip-extended-insert databasename > database.sql
# sed -i 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/g' database.sql // эсвэл perl -i -pe 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/' database.sql гэсэн ч болно.
# sed -i '1i SET NAMES utf8;' database.sql // эсвэл ямар нэг засварлагчаар vi database.sql гэдэг ч юм уу нээгээд толгойд нь "SET NAMES utf8;" гэсэн мөр нэмнэ.
# cat database.sql | mysql -u dbuser -pdbpass

MySQL датабэйсийхээ charset-г utf8 болгож өөрчилснийхөө дараа дараах query-г ажиллуулж Unicode руу хөрвүүлж авав.

UPDATE content SET title = CONVERT(CAST(CONVERT(title USING latin1) AS BINARY) USING utf8);