понедельник, 4 марта 2013 г.

администрируем свой сервер через веб или как поставить webmin


webmin очень удобная система администрирования через веб интерфейс(хорошо руссифицированая)

устанавливаем необходимые библеотек
sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl


sudo nano /etc/apt/sources.list
добавляем в файл /etc/apt/sources.list репозитарий webminа
deb http://download.webmin.com/download/repository sarge contrib

скачиваем и ставим ключ репозитария
wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.asc

обновляем и ставим
sudo apt-get update
sudo apt-get install webmin

https://<ваш ip>:10000

или прокидываем порт и аминим свой сервак хоть с телефона

з.ы.
входим пользователем имеющим доступ в sudo или rootом

меняем язык на русский
Webmin -> Change Language and Theme






установка KDE на ubuntu

из стандартного репозитария
sudo apt-get install kde-full

самая новая версия

добавляем репозитарий
sudo add-apt-repository ppa:kubuntu-ppa/backports

обновляем

sudo apt-get update

ставим

sudo apt-get install kubuntu-desktop

русифицируем

sudo apt-get install kde-l10n-ru

воскресенье, 3 марта 2013 г.

начал писать программу кубика рубика

начал писать программу кубика рубика. Сначала решил сверстать "карту кубика рубика" чтобы потом было понятно какие элементы брать за конечные оъекты. Для чего каждый неизменяемый элемет (по сути фрагмент который физически вытащить из кубика) я решил обозначить буквой английского алфавита. Я к середине нумерации я стал сомневаться что букв хватит и о чудо элементов оказалась ровно 26. Ни одной лишней буквы.

A B C
D E F
G H I
A D G
J K L
Q R S
G H I
L M N
S T U
I F C
N O P
U V W
S T U
R X V
Q Y W
Q Y W
J Z P
A B C

установка xdebug на ubuntu

sudo apt-get install php5-dev php-pear
sudo pecl install xdebug

затем ищем xdebug.so
find / -name 'xdebug.so'

у меня нащелся здесь

/usr/lib/php5/20090626+lfs/xdebug.so

открываем с правами root (для редактирования)
sudo gedit /etc/php5/apache2/php.ini
или
sudo vim /etc/php5/apache2/php.ini (подразумевается что вы знаете vim это не простой редактор)
или
sudo nano /etc/php5/apache2/php.ini

добавляем в конец

zend_extension="/usr/lib/php5/20090626+lfs/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000


рестарт уем апач
sudo /etc/init.d/apache2 restart

смотрим наличие xdebug в phpinfo();

в качестве бонуса xdebug.ini с более удобными настройками

zend_extension=/usr/lib/php5/<ваша версия>+lfs/xdebug.so
xdebug.default_enable = On
xdebug.auto_trace=On
xdebug.trace_output_dir=/home/user/
xdebug.var_display_max_depth=6
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.idekey=netbeans-xdebug
xdebug.remote_autostart=1
xdebug.remote_log=/tmp/xdebug.log
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir=/tmp/profiler
xdebug.show_local_vars=1

а подключать его так
создаем его здесь

/etc/php5/mods-available/xdebug.ini

и
делаем символьную ссылку так
sudo ln -s /etc/php5/mods-available/xdebug.ini /etc/php5/apache2/conf.d/

рестартуем апач





календарь на php(продолжение)

сегодня я переделал код и отделил отображение от логики 
 
interface Show{
    function show();
}


class Calendar{
    private $date; //сдесь храним дату на которую делаем календарь
    private $arr_calendar; //массив из всех дат(DateTime) месяца 
    function __construct(DateTime $date) { //принимаем только формат DateTime
        $this->date=$date;
    }

     /**
     * функция возвращает массив обектов состоящих из дат текущего месяца
     * @return array
     */
    function get_calendar(){ 
        // идем от 1 числа по всем числам месяца
        for ($i=1;$this->date->format('t')>=$i;$i++){
            $tmp_date = new DateTime($i.".".$this->date->format('m').".".$this->date->format('Y'));
            $this->arr_calendar[] = array(
                    "oject_data"     => $tmp_date,  //дата объектом
                    "active_data"    => $this->test_curret_date($tmp_date), //проверку на текущию дату
                    );
        }
        return $this->arr_calendar;
    }
    
    /**
     * если переданная дата будет равна дате $this->date то вернем true
     * @param DateTime $current_date проверяемая дата 
     * @return boolean
     */
    private function test_curret_date(DateTime $current_date){
        if ($current_date->format('d.m.Y')==$this->date->format('d.m.Y')){
            return true;
        }else{
            return false;
        }
    }
}


class ShowCalendar implements Show{
    private $calendar;
    private $calendar_format;//формат в днях недели 1=>"Понедельник", ...  7=>"Воскресение",
    
    private $list_property=array("show_dat", "dat_format", "show_mount");
    
    private $show_dat=true;
    private $dat_format=self::DAY_SHORT_FORMAT;
    
    private $show_mount=true;
    private $mount_format=self::MOUNT_FULL_FORMAT;
    
    
    const DAY_SHORT_FORMAT = "d.m";
    const MOUNT_FULL_FORMAT = "m.Y";
    
    function set_params($key, $value){
       if (in_array($key, $this->list_property)){
           $this->$key=$value;
       } 
    }

    function __construct(Calendar $calendar,array $calendar_format =  array(
                                                                            1=>"Понедельник",
                                                                            2=>"Вторник",
                                                                            3=>"Среда",
                                                                            4=>"Четверг",
                                                                            5=>"Пятница",
                                                                            6=>"Суббота",
                                                                            7=>"Воскресение",
                                                                        ) ) {
        $this->calendar=$calendar->get_calendar();
        $this->calendar_format=$calendar_format;
    }
    /**
     * функция получения отображения 
     * @return string
     */
    function show() {
        //отдельно получаем и собираем вместе элементы (имитация темплейта)
       $template = $this->show_get_style().
                   $this->show_get_header().
                   $this->show_get_body().
                   $this->show_get_footer();
       return $template;
    }
    /**
     * функция получения header
     * @return string
     */
    private function show_get_header(){
        $template="<table>".
                        "<tr>";
        if ($this->show_mount){
            $mount_tmp=current($this->calendar);
                        $template .="<tr>".
                        '<td colspan=7>'.
                        $mount_tmp["oject_data"]->format($this->mount_format).
                        "</td>".
                        "</tr>";
        }
        
                foreach ($this->calendar_format as $day_name){
                    $template .="<td>".
                                    $day_name.
                                "</td>";
                }
        $template .="</tr>";
        
        return $template;
    }
    /**
     * функция возвращает footer таблицы
     * @return string
     */
    private function show_get_footer(){
        $template ="</table>";
        
        return $template;
    }
    /**
     * функция возращает основное тело таблицы
     * @return string
     */
    private function show_get_body(){
        //получаем календарь в виде массива
        $arr_calendar=array();
        foreach ($this->calendar as $day_element){
            if (!isset($arr_calendar[$day_element["oject_data"]->format("W")])){
                $arr_calendar[$day_element["oject_data"]->format("W")]=array();
            }
            $arr_calendar[$day_element["oject_data"]->format("W")][$day_element["oject_data"]->format("N")]=array(
                                            "data"  =>$day_element["oject_data"]->format($this->dat_format),
                                            "active"=>$day_element["active_data"],
                                        );
        }
        //собираем календарь в таблицу
        $template="";
        foreach($arr_calendar as $row){
            $template .="<tr>";
            for($i=1;7>=$i;$i++){
              
                if (isset($row[$i])){
                    //ячейка определена
                    $template .="<td ".($row[$i]["active"]&&$this->show_dat?'class="active"':'').">";
                        
                        $template .=$row[$i]["data"];
                    
                    $template .="</td>";
                }else{
                    //ячейка пустая
                    $template .="<td></td>";
                }
            }
            $template .="</tr>";
        }

        return $template;
    }
    /**
     * функция возвращает стили для календаря
     * @return string
     */
    private function show_get_style(){
        $template='<style type="text/css">'
        .'.active{'
        ." color: red;"
        ." background: #ccc;"
        .'}'
        .'table tr td{'
        ." text-align: center;"
        ." border: 1px solid black; "
        ." padding: 5px; "
        .'}'
        .'</style>';
        return $template;
    }
}

$n=new DateTime("now");

$n1=$n->sub(new DateInterval('P1M'));
$calendar = new ShowCalendar(new Calendar($n1));
$calendar->set_params("show_dat", false);
echo $calendar->show();

$n2=$n->add(new DateInterval('P1M'));
$calendar = new ShowCalendar(new Calendar($n2));
echo $calendar->show();

$n3=$n->add(new DateInterval('P1M'));
$calendar = new ShowCalendar(new Calendar($n3));
$calendar->set_params("show_dat", false);
echo $calendar->show();

суббота, 2 марта 2013 г.

календарь на php

сегодня впервые мне удалось написать ООП код от которого я почти не испытываю тошнотворного ощущения как обычно бывало раньше
class Calendar{
    private $date; //сдесь храним дату на которую делаем календарь
    private $arr_calendar; //массив из всех дат(DateTime) месяца 
    function __construct(DateTime $date) { //принимаем только формат DateTime
        $this->date=$date;
    }
    /**
     * функция возвращает массив обектов состоящих из дат текущего месяца
     * @return array
     */
    function get_calendar(){ 
        // идем от 1 числа по всем числам месяца
        for ($i=1;$this->date->format('t')>=$i;$i++){
            $this->arr_calendar[] = new DateTime($i.".".$this->date->format('m').".".$this->date->format('Y'));
        }
        return $this->arr_calendar;
    }
    /**
     * отображает календарь
     * @param array $calendar_format 
     * example 
     * array(
                1=>"понедельник",
                2=>"вторник",
                3=>"среда",
                4=>"четверг",
                5=>"пятница",
                6=>"суббота",
                7=>"воскресение",
            )
     */
    function show_calendar($calendar_format){
        // пока сделано без MVC
        $this->get_calendar(); //получаем календарь в массив
        $run=true;
        echo "<table>";
           echo "<tr>";
                    echo "<td colspan=7>";
                        echo $this->date->format('d.m.Y');
                    echo "</td>";

            echo "</tr>";

            echo "<tr>";
                foreach($calendar_format as $day_name){
                    echo "<td>";
                        echo "<b>".$day_name."</b>";//выводим название недели в загаловке таблицы
                    echo "</td>";
                }
            echo "</tr>";
            while ($run){
                echo "<tr>";
                foreach($calendar_format as $key_dat=>$day_name){
                    if (current($this->arr_calendar)->format('N')==$key_dat){
                        echo "<td>";
                            
                            //проверяем на текущею дату если текущая то выделяем красным
                            if ($this->test_curret_date(current($this->arr_calendar))){
                                echo '<b style="color: red;">';
                            }
                                
                                echo current($this->arr_calendar)->format('d');//выводим активный элемент массива
                                
                            //проверяем на текущею дату 
                            if ($this->test_curret_date(current($this->arr_calendar))){
                                echo "</b>";
                            }
                             
                        echo "</td>";
                        next($this->arr_calendar);//переходим на следущий элемент массива
                        //
                        //проверка конца массива если конец выходим из цикла 
                        if (current($this->arr_calendar)->format('d')==$this->date->format('t')){
                            $run=false;
                        }
                    }else{
                        echo "<td></td>";
                    }
                }
            }
            echo "</tr>";
        echo "</table>";
    }
    /**
     * если переданная дата будет равна дате $this->date то вернем true
     * @param DateTime $current_date проверяемая дата 
     * @return boolean
     */
    private function test_curret_date(DateTime $current_date){
        if ($current_date->format('d.m.Y')==$this->date->format('d.m.Y')){
            return true;
        }else{
            return false;
        }
    }
}

$calendar = new Calendar(new DateTime("11.05.2010"));

$calendar->show_calendar(
            array(
                1=>"понедельник",
                2=>"вторник",
                3=>"среда",
                4=>"четверг",
                5=>"пятница",
                6=>"суббота",
                7=>"воскресение",
            )
        );


php отладка ООП кода при помощи Reflection API

однажды один опытный программист на мой вопрос можно ли узнать какие методы у объекта не видя его кода сказал что это не возможно. Сейчас я зная что это не так.
 
<?php
$date = new DateTime("now");
//$date2 = new DateTime("02/03/2013");
$class_info = new ReflectionClass($date);
?>
<pre>
    <?
    Reflection::export($class_info);
    ?>
</pre>
но оказалась что это возможно и данный код дает довольно много инфы
    Class [  class DateTime ] {

  - Constants [11] {
    Constant [ string ATOM ] { Y-m-d\TH:i:sP }
    Constant [ string COOKIE ] { l, d-M-y H:i:s T }
    Constant [ string ISO8601 ] { Y-m-d\TH:i:sO }
    Constant [ string RFC822 ] { D, d M y H:i:s O }
    Constant [ string RFC850 ] { l, d-M-y H:i:s T }
    Constant [ string RFC1036 ] { D, d M y H:i:s O }
    Constant [ string RFC1123 ] { D, d M Y H:i:s O }
    Constant [ string RFC2822 ] { D, d M Y H:i:s O }
    Constant [ string RFC3339 ] { Y-m-d\TH:i:sP }
    Constant [ string RSS ] { D, d M Y H:i:s O }
    Constant [ string W3C ] { Y-m-d\TH:i:sP }
  }

  - Static properties [0] {
  }

  - Static methods [3] {
    Method [  static public method __set_state ] {
    }

    Method [  static public method createFromFormat ] {

      - Parameters [3] {
        Parameter #0 [  $format ]
        Parameter #1 [  $time ]
        Parameter #2 [  $object ]
      }
    }

    Method [  static public method getLastErrors ] {

      - Parameters [0] {
      }
    }
  }

  - Properties [0] {
  }

  - Methods [15] {
    Method [  public method __construct ] {

      - Parameters [2] {
        Parameter #0 [  $time ]
        Parameter #1 [  $object ]
      }
    }

    Method [  public method __wakeup ] {
    }

    Method [  public method format ] {

      - Parameters [1] {
        Parameter #0 [  $format ]
      }
    }

    Method [  public method modify ] {

      - Parameters [1] {
        Parameter #0 [  $modify ]
      }
    }

    Method [  public method add ] {

      - Parameters [1] {
        Parameter #0 [  $interval ]
      }
    }

    Method [  public method sub ] {

      - Parameters [1] {
        Parameter #0 [  $interval ]
      }
    }

    Method [  public method getTimezone ] {

      - Parameters [0] {
      }
    }

    Method [  public method setTimezone ] {

      - Parameters [1] {
        Parameter #0 [  $timezone ]
      }
    }

    Method [  public method getOffset ] {

      - Parameters [0] {
      }
    }

    Method [  public method setTime ] {

      - Parameters [3] {
        Parameter #0 [  $hour ]
        Parameter #1 [  $minute ]
        Parameter #2 [  $second ]
      }
    }

    Method [  public method setDate ] {

      - Parameters [3] {
        Parameter #0 [  $year ]
        Parameter #1 [  $month ]
        Parameter #2 [  $day ]
      }
    }

    Method [  public method setISODate ] {

      - Parameters [3] {
        Parameter #0 [  $year ]
        Parameter #1 [  $week ]
        Parameter #2 [  $day ]
      }
    }

    Method [  public method setTimestamp ] {

      - Parameters [1] {
        Parameter #0 [  $unixtimestamp ]
      }
    }

    Method [  public method getTimestamp ] {

      - Parameters [0] {
      }
    }

    Method [  public method diff ] {

      - Parameters [2] {
        Parameter #0 [  $object ]
        Parameter #1 [  $absolute ]
      }
    }
  }
}
PHP: The Right Way блог програмышки
Яндекс.Метрика