2017/01/04

Detecting & clearing INODE junks

Ubuntu серверийн маань Inode хязгаар дүүрээд серверт ямарч шинэ файл үүсэх боломжгүй болох алдаа тохиолдоод ухаж үзэв.

$ df -i 

командаар шалгахад 100 хувь дүүрсэн үзүүлэлт харуулав.

Шалтгааныг хайж хаана тэр олон файл үүсээд байна вэ гэсэн асуудлыг мөшгөвөл

$ for i in /*; do echo $i; find $i |wc -l; done

Командаар аль фолдерт хэт олон файл үүссэн байгааг харах боломжтой.

Сэжиг төрсөн фолдер ажиглагдвал

$ for i in /home/*; do echo $i; find $i |wc -l; done

Энэ командаар дэд фолдеруудынх нь файлын тоог нарийвчилж шинжилж болно.

Миний тохиолдолд /var/lib/php5 хавтсанд хэт олон тооны session файл үүссэн байсныг

$ cd /var/lib/php5
$ find . -name "sess_*" -print | xargs rm -v

командаар устгав

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'))),
    )),
  ));
?>