воскресенье, 30 августа 2015 г.

Немного о старом и еще чуть-чуть о новом MuWebClone и о его развитии

Я как-то подзабросил блог. Надо бы чуть-чуть его подраззабросить.
***
Сопсно, речь поведу о новом mwce, шо будет нового и как оно примерно будет работать. Пока это мысли-наработки, частично даже  реализованные.
Итак, прежде чем говорить о версии 1.6.2, вспомним, а что было до... Хотя, скорее для себя я вспомню :).
Сначала было слово... ну, это понятно.
Первый страшный mwc был создан на основе тогда знаменитого muweb. Причем, создан - громко сказано, выглядело это "я слепила из того что было", даже хуже.
Потом "проект" был заброшен, но идея жила, а автор усиленно (когда не мешала лень) пытался выпрямить руки.
Потом появился  уже mwc, как оформившийся сайт с какими-то плюшками от 0.1 до 1.4, потом был 1.5 с шаблонзатором и говнокодом, но уровень хелоувордщика преодолен не был.
Потом было решено сделать 1.6, его можно считать попыткой ребетенка сделать первые щаги.
Сделал. Принцип его был "почти MVC": как таковой mvc используется только в недрах сайта, все остальное заточено под простое функциональное программирование с небольшими вкраплениями классов, так сказать, для простого хелоувордщика, да...
Так вот, так как некоторая основа используется в энтерпрайзе (для интрасети  и не совсем в виде системы управления проектами), я понял, что местами я уперся в потолок возможностей того "творения", что было запилено + постоянная халтурка с напилом модулей всем тем, кто в свое время обзавелся 1.6 двиглом:
сайты сами по себе несколько отличались: у одного было отличие в шаблонизаторе, у второго куча баз, у третьего еще что-то там...

Ну, в общем для тех, кто хоть раз занимался паттерном mvc сейчас уже ухмыляется: мол, да, ты описываешь преимущества как раз-таки обычного model-view-controller паттерна.

Так как я особо не парился в свое время с шаблонами программирования, то и использовал их не ахти как активно (даже сейчас считаю, что лучше недобдеть чем перебдеть, в данном случае, ибо если шаблоны использовать там, где они на фиг не нужны, то кроме захламления кода ничего хорошего не получится), то сел штудировать книги, статьи, код. Ну и, в конце концов, насмотревшись творений умных дядь типа yii и симфоний, я пришел к выводу, что, пожалуй,  стоит "убрать" ограничение "онли простой подход", и на свет в муках начала вырисовываться 1.6.2 (1.6.1 все тот же 1.6, только со своеобразным "сервис паком").

Концепция нового 1.6.2 будет примерно в следующем:
- есть основа с классами-родителями: контроллера, модели, ряда вспомогательных классов, сторонних библиотек
- есть билды (привет, bundle), унаследованные от данных родителей, со своими направлениями расширения.
Это автоматически помогает мне в 1 месте держать хоть все проекты кастумеров и допиливать их в нужном направлении, причем, при выявлении более удачного подхода для решения какой-либо задачи я могу путем изменения родителя запилить для всех проектов сразу очередной патчик (или для каждого в отдельности, если это не касается ядра), то есть по факту управление уровнем абстракции. Лично мне нравится такая идея :) Ваш Кэп.
- есть поддержка плагинов.
а куда без них? попробовав раз - торчу и сейчас.
- есть возможность писать и обычные функциональные скрипты как это было во всех предыдущих версиях. Это значит, что до сих пор, кому-то не нужно будет затачиваться на тему, как работает все это внутри и как писать свои контроллеры, модели и шаблоны. То есть, я не отказался от гибридного подхода, а все также его продвигаю. Стрелять по воробьям из такнка - это весело и даже иногда действенно, но требует затрат времени, которое, как обычно, еще вчера закончилось. Это, конечно, навалило ряд вопросов, как это все заставить работать... вроде как разрулил, на тестах посмотрим, был я прав или не очень.  Ваш Кэп.

Потом я подумал, что иметь конечно кастумеров - круто, но все-таки изначально, в саамом начале пути mwc, ставшего аж mwce была цель сделать лвиг для всех, а не только для тех, кто готов платить. Поэтому сам "движок" будет свободным и доступен для скачивания, возможно, сделаю репозиторий на том же гите, пока не решил. А вот билды уже буду писать или дорабатывать под конкретные нужды людей, будь то просто сайт-визитка или же muonline проект, а может даже ла проект, не знаю, время и востребованность очередного велосипеда покажет, нужно ли оно или нет.
Да и чего греха таить, хочешь найти ошибки и усовершенствовать то, что есть наиболее быстрым способом? Выложи в паблик! Ну "тыпонел" да? Ваш Кэп.

За сим пока откланиваюсь, ежели будет еще что интересного - отпишу.

P.S.:Если кому-то интересно, как организовывалась система управления проектами или как я доходил до понимания, что ж такое этот мэ вэ цэ, то пишите, напишу статейки еще. 


вторник, 19 августа 2014 г.

После отпуска

Как-то несколько лениво втягивается все после отпуска :) На работе ожидается много интересных задач, прям-таки, пребываю в нетерпении оных. + надо совершить победный рывок для mwc 1.6 и потихоньку реинкарнировать и отрефакторить mwc 1.5. Как - то пора уже поставить точку, а то пока многоточие..  

среда, 30 июля 2014 г.

первый блин комом

Наконец-то, поставили новый двиг на сервер, который не игц. Узнал много нового. Некоторое из нового о себе :).
И кстати, пришел к выводу, что mailto все-таки вещь иногда ооочень полезная.

четверг, 24 июля 2014 г.

приключения с IMAP на php

В рамках корпоративной ERP-системы (упоминал в своей прошлой записи) разрабатывается web-mail-клиент (о как). Долго думал, использовать Pop3 или же imap. Все-таки выбрал imap, посмотрел в интернетах на наличие готовых решений. Нашел, но немного не того, пришлось пилить. Процесс, конечно еще продолжается, но костяк более-менее сделал (Скажу сразу, что дополнял класс. Он работает, но ряд вещей стоит все же переписать:

/*
 * Класс предназначен для считывания данных(писем) почты посредством работы (IMAP подключени к серверу)
 */
class ImapCheck
{
    private $mbox;
    private $htmlmsg;
    private $plainmsg;
    private $charset;
    private $attachments = array();
    private $unread;
    private $hcharset;
    private $filescount =0;

   /* public function __get($name)
    {
        if ($name=='mail') return $this->unread;
        else return null;
    }*/
    public function getmail()
    {
        return $this->unread;
    }

    /**
     * Конструктор
     * @param string $host  хост
     * @param string $login  аккаунт ящика
     * @param string $pwd  пароль
     * @param array $options
     * [letterID] = null|int - если известен ид письма
     * [search] =
     * ALL - return all messages matching the rest of the criteria
    ANSWERED - match messages with the \\ANSWERED flag set
    BCC "string" - match messages with "string" in the Bcc: field
    BEFORE "date" - match messages with Date: before "date"
    BODY "string" - match messages with "string" in the body of the message
    CC "string" - match messages with "string" in the Cc: field
    DELETED - match deleted messages
    FLAGGED - match messages with the \\FLAGGED (sometimes referred to as Important or Urgent) flag set
    FROM "string" - match messages with "string" in the From: field
    KEYWORD "string" - match messages with "string" as a keyword
    NEW - match new messages
    OLD - match old messages
    ON "date" - match messages with Date: matching "date"
    RECENT - match messages with the \\RECENT flag set
    SEEN - match messages that have been read (the \\SEEN flag is set)
    SINCE "date" - match messages with Date: after "date"
    SUBJECT "string" - match messages with "string" in the Subject:
    TEXT "string" - match messages with text "string"
    TO "string" - match messages with "string" in the To:
    UNANSWERED - match messages that have not been answered
    UNDELETED - match messages that are not deleted
    UNFLAGGED - match messages that are not flagged
    UNKEYWORD "string" - match messages that do not have the keyword "string"
    UNSEEN - match messages which have not been read yet
     * флаги для поиска
     */

    public function ImapCheck($host, $login, $pwd, $options = array('search'=>'ALL'))
    {
        $messages=array();
        $folder="INBOX";
        //$folder="[Gmail]/&BCEEPwQwBDw-"; // если вам захочется почитать спам на гугломыле.
        $this->mbox = imap_open ("{$host}$folder", $login,$pwd) or die(imap_last_error());//OP_HALFOPEN

        if(isset($options["search"]))
        {
            if(!isset($options["letterID"]) || $options["letterID"] == NULL)
            {
                $arr = imap_search  ($this->mbox, $options["search"]);

                if ($arr !== false)
                {
                    foreach ($arr as $i)
                        $messages[]=$this->getLEtter($i);

                    $this->unread=$messages;
                    unset($messages);
                }
                else {$this->unread=false;}
            }
            else
                $this->unread[$options["letterID"]]=$this->getLEtter($options["letterID"]);
        }
        else
            die("parametr options->search are empty!");
    }

    /**
     * заголовок от письма
     * @param $num номер письма в ящике
     * @return array
     */

    public function getHeaderInfo($num)
    {
        $headerArr = imap_headerinfo ( $this->mbox, $num);

        $elements = imap_mime_header_decode($headerArr->subject);
        $subj = "";

        for ($p = 0; $p < count($elements); $p++)
        {
            if($elements[$p]->charset !="default" && strtolower($elements[$p]->charset) !="utf-8")
            {
                $subj .= iconv($elements[$p]->charset, 'UTF-8', $elements[$p]->text);
                $this->charset = $elements[$p]->charset;
                $this->hcharset = $elements[$p]->charset;
            }
            else if($elements[$p]->charset =="default")
            {
                $subj.= iconv('KOI8-R','UTF-8', $elements[$p]->text);
                $this->charset = 'KOI8-R';
                $this->hcharset = 'KOI8-R';
            }
            else
            {
                $subj.=$elements[$p]->text;
                $this->charset = 'UTF-8';
                $this->hcharset = 'UTF-8';
            }
        }

        if(!isset($headerArr->sender[0]->personal))
            $headerArr->sender[0]->personal = "unknown";

        return array(
            'from'=> $headerArr->sender[0]->mailbox . "@" . $headerArr->sender[0]->host,
            'to'=> $headerArr->to[0]->mailbox . "@" . $headerArr->to[0]->host,
            'name'=> $this->decode($headerArr->sender[0]->personal) ,
            'subject'=>$subj,
            'Date'=>strtotime($headerArr->Date)
        );
    }

    /**
     * чтение письма по номеру
     * @param $num номер
     * @return array
     */
    public function getLetter($num)
    {

        $return = $this->getHeaderInfo($num);
        $this->getmsg($num); //читаем тело письма (сообщение)

        //imap_setflag_full($this->mbox, $i, "\\Seen"); //прочли письмо, поставили флаг, что прочли

        $return["charset"] = $this->charset;
        $return["plain"] = $this->plainmsg;
        $return["html"] = $this->htmlmsg;
        $return["attach"] = $this->attachments;
        $return["letterID"] = $num;

        return $return;
    }

    private function decode($enc)
    {
        $parts = imap_mime_header_decode($enc);
        $str='';
        for ($p=0; $pcharset;
            $part = $parts[$p]->text;
            if ($ch!=='default')
                $str.=mb_convert_encoding($part,'UTF-8',$ch);
            elseif ($ch=='default')
                $str.=mb_convert_encoding($part,'UTF-8','KOI8-R');

            else $str.=$part;
        }
        return $str;
    }

    private function getmsg($mid)
    {
        $this->htmlmsg = $this->plainmsg =  $this->charset = '';
        $this->attachments = array();

        $s = imap_fetchstructure($this->mbox,$mid);


        if (!isset($s->parts))
            $this->getpart($mid,$s,0);
        else
        {
            foreach ($s->parts as $partno0=>$p)
                $this->getpart($mid,$p,$partno0+1);
        }
    }

    private function getpart($mid,$p,$partno)
    {
        $data = ($partno) ? imap_fetchbody($this->mbox,$mid,$partno): imap_body($this->mbox,$mid);


        if ($p->encoding==4)
            $data = quoted_printable_decode($data);
        elseif ($p->encoding==3)
            $data = base64_decode($data);

        $params = array();

        if (isset($p->parameters))
            foreach ($p->parameters as $x)
                $params[ strtolower( $x->attribute ) ] = $x->value;

        if (isset($p->dparameters))
            foreach ($p->dparameters as $x)
                $params[ strtolower( $x->attribute ) ] = $x->value;


        if (isset($params['filename']) || isset($params['name']))
        {
            $filename = (isset($params['filename']))? $params['filename'] : $params['name'];
            if(isset($this->attachments[$filename])) //если уже есть в атачменте такой файл, делаем "версионность"
            {
                $this->filescount ++;
                $filename = $this->filescount."_".$filename;
            }
            $this->attachments[$filename] = $data;
        }
        elseif ($p->type==0 && isset($data))
        {

            if (strtolower($p->subtype)=='plain')
            {
                $this->plainmsg .= trim($this->ConvBody($data)) ."\n\n";
            }
            else
                $this->htmlmsg .= $this->ConvBody($data) ."

"; if(isset($params['charset'])) $this->charset = $params['charset']; } elseif ($p->type==2 && isset($data)) { $this->plainmsg .= trim($this->ConvBody($data)) ."\n\n"; } if (isset($p->parts)) { foreach ($p->parts as $partno0=>$p2) $this->getpart($mid,$p2,$partno.'.'.($partno0+1)); } } private function ConvBody($text) { if(!empty($this->hcharset) && $this->hcharset !='UTF-8') { $text = iconv($this->hcharset, 'UTF-8', $text); } return $text; } /** * Закрыть имап подключение */ public function close() { imap_close($this->mbox); } } //TODO: отловить момент, когда делают рассылку и данный пользователь так же учавствует в ней, выдает адрес, перввый из списка [to]


подключение и юзание:
require "inc/imap.php";
$options = array('search'=>'SINCE "'.date("j F Y",strtotime("-1 DAY")).'"');//тип поиска сообщений на почте - собираем сообщения со вчера по седня :)
$rm = new ImapCheck("{server.ru/imap}","mail@server.ru","password",$options);
$mail_list = $rm->getmail(); //получили письма
$rm->close();
выплюнет массив с письмами примерно так: [from] =>откуда [to] => кому [name] => имя приславшего [subject] => название [Date] => дата, письма [charset] => кодировка [plain] => если обычный текст [html] => если хтмл-код [letterID] => id письма на сервере (не постоянно! по факту это просто количественный номер) [attach] => Array ( [название_изображения] => бинарное содержание(то есть можно обычным fput воткнуть куда надо) )
да, кстати,есть небольшая бага: в некоторых случаях название атачей будет типа =?UTF_8?B?..... лечится просто :
iconv_mime_decode("название файла",0, "кодировка")
надеюсь, кому-то помог.

среда, 23 июля 2014 г.

о прошедшем о0

Давненько я тут ничего не постил, почти как год :) С того времени достаточно много всего поменялось/изменилось:
- наконец-то сделал MWC(e) 1.6
- начал изучение дополнительных ОО-языков
- несколько поднатаскался в T-SQL
- произошел ряд изменений в команде p4f.

Ну, по чуть-чуть обо всем.

Самая главная цель была дописать свеженький mwc, который потихоньку начал превращаться в CMS. Причем, в процессе создания напилил ( и продолжаем улучшать) совершенно нечаянно ERP-систему для фирмы, где я сейчас работаю. Писалась она не в 1 наглую рожу (мою), но еще есть грамотный Архитектор и T-SQL программист (хотя, последнее он яростно отрицает ^_^ , а зря). В общем, оно мне не плохо помогло самому поднатаскаться в SQL и осознать, что я несколько недооценивал СУБД. Двиг стал по-серьезнее, хотя, это все еще не совсем полноценная CMS (ну, на мой взгляд). Примечательно то, что чем более совершенствовал сам MWC, тем более приходило осознание, что му как-то не так уж и нужно мне вообще. Двиг готов, но по факту для му работает только на 1 хосте. И меня не тянет трындеть о нем направо и налево вообще о0, это давно стало уже хобби, нежели попыткой заработать на печеньки халтурой. До сих пор, я не использовал никаких глобальных фреймоврков а ля code engineer vii и т.п. Как-то слишком "гигантско" оно для цели небольшой кмс, хотя, бесспорно быстрее должна идти разработка (ну, в плане отсутствует разработка ядра, так как оно уже есть в виде самого фреймворка). Как то более безопасно выходит, что ли, когда знаешь все как и где и какие засады могут быть, а главное, четко представляешь возможности и пути улучшения.
Как ни странно, но использовать ООП в php меня сильно научили... java/c#, где сама концепция языка есть ООП.

Про команду сильно распространяться не хочу, так как есть ряд спорных моментов и исходя из возможных обид, напишу только что не сошлись характерами, в первую очередь. Сам античит как и ланчер перерабатываются, так как найден более простой и надежный способ защиты, на который следовало перейти уже давно. Но это отдельная история и писать пока что-либо подробно не стану, по крайней мере, пока.

Постараюсь оживить немного блог, но обещать не стану.  

среда, 14 августа 2013 г.

14.08.2013

Уже как-то не оригинально начинать запись в этом блоге со слов "дааа.. что-то я давно тут не писал". На самом деле, новостей - гора и возвышенность рядом. Со временем, как обычно - "то оно есть и вдруг его нет" (c). ДА и, честно говоря разговаривать самому с собой - не весело :).
Ну да  и ладно...

..Пообедав, в оставшееся обеденное время полез я на хабру, на хабре наткнулся на пост, почитал, в голове возникли образы со старых фильмов (или фильма, уже не помню): "в далеком будущем мир поделен между огромными корпорациями, борющимися за влияние..." блин, прямо нострадамусы какие-то.
И ведь оно действительно так. Идет война - в первую очередь информационная, призы которой - деньги, известность, власть и.. информация, на которой, сопсно, все и строится... Все следят друг за другом, собирают информацию вплоть до того, сколько раз бегал в туалет за день... Самое забавное, что мол вот! все для рекламы и т.п.  но "мы то с вами знааааем" (c). заскрипел где-то голосок*

на самом деле, за все нужно платить, за удобство - тоже. только вот цена иногда страшная - обрушение стереотипов, стирание личностей (вспоминаем про нашу моду, да, голые ж... будут модны - будут толпы голозадых макак), но речь не об этом... думаю :)

у меня случился парадокс - выбирал себе планшетник... по сути, выбирался даже не производитель а.. ось о0. выбор стоял адройд vs иось, много народу советовало, мол, бери себе адройдовоз, это офигенно, столько преимуществ, система открытая, пересоберешь её и прям все супер будет...
меня ломало, на самом деле... Переломный момент  наступил после размышлений(вот ведь, горе от ума, а) - слишком много стало гугла. Да, он удобен, хорош, и т.п. но эта зараза слишком любопытная, да, даже на иоси у меня есть ид, но яблоки пока что не специализируются на сборе информации личностной( привычки, предпочтения и т.п.) о клиентах/пользователях, в отличии от гугла. Я пожертвовал большей гибкостью системы, но в замен получил стабильность и приемлемую работу. Да, много есть углов у эплов из-за их "железного занавеса", но с другой стороны как-то спокойнее о0.

и да, хочется сказать, что я дико не люблю хромиум, который писан гуглом за то....
..а вот не скажу:
во-первых, не только гугл его пилил
во-вторых, никто не заставлял оперу переходить на это "чудо". У хромиума, на мой взгляд ооочень много недостатков, но, за все надо платить, в данном случае это цена за скорость и поддержку последних стандартов. Но вот для кого она приемлема, а для кого нет?   

вторник, 7 мая 2013 г.

не знаю как назвать

Сегодня вышел интересный опыт - попался мне сайт одного человека из mu-comunity, он ко мне и раньше попадал, правда, другие версии, некоторые модули были под обфускацией. Я все как - то не решался её снять, но, в этот раз появилась, относительно свободная минута ну и ради интереса сел разбирать.
К своему удивлению, разобрал. Понадобился час времени для того, чтобы полностью расшифровать обфусцированные модули.. Ну и с "чистым" кодом я решил посмотреть на весь сайт. Был несколько удивлен, как-то все оказалось легко. Много с чем я не согласен, но это дело того, кто писал. Если посчитал, что так должно быть - значит, так и должно быть.
Но, не это главное. Когда, грубо говоря, я по кусочкам кода собрал весь сайт воедино... кхм.. получил легкое разочарование. Мне, беря во внимание разговоры, которые были про сайт от покупателей и просто по описаниям, казалось что это мегасложная махина, с неимоверным функционалом и уровнем абстракции в коде. Ан нет. Обычный, в общем-то, сайт с уклоном на функциональное программирование.  Сравнивать его с MWC не стану, а то пойдут слухи, что я хейтер и лицемер.
На самом деле, если учесть работы автора в паблик (релиз первой паблик версии) видно, что человек решил отойти от того, что делал раньше, пересмотреть все.
А еще, честно говоря, надеюсь, что тот сайт, что мне попался  достаточно старой версии и что в новой все действительно, как я думал.  

пятница, 5 апреля 2013 г.

о всем по немногу и о госах

Долго я как-то ничего не писал сюда. Новостей, на самом деле, накопилось много:
я ток-ток сдал госы ы... осталось написать диплом и радоваться жизни, как дипломированному специалисту.
Ну и касаемо MWC. Тепериче он становится MWCE, во-первых, чтобы не путали с конференцией мобайл, а во-вторых, это действительно уже становится движком. Причем, новая версия будет полноценной КМС, которую можно ставить как на ms sql, так и на mySql, как для му серверов, так и для любых иных проектов.
Ну и на сладость, купил себе лицензионную ИДЕ под проганье... потратил 100 баксов, но оно того стоило, офигенная штука!
В общем, постараюсь почаще тут отписываться...
И да, кстати, у кого есть возможность дать мне инвайт на хабре, буду оч признателен.

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

O crysis 3

Помню, когда поиграл во 2 кризис, облазил весь интернет, в поисках информации про 3 (играл я несколько позже, чем вышла игра). Так вот, в этот раз я чуть снова не пропустил начала веселья :)  Как очухался, по быстрому полез на ориджин и купил обычную версию (не, ну как обычно, печаль была в том, что нужно было подождать пару дней и взять со скидкой, но желание посмаковать новую часть, теперь уже трилогии, было сильнее). Сразу скажу - не разочаровался. Отличное музыкальное сопровождение, обалденное качество cryengine, интересный сюжет (хотя, надо признать, что направление заезжено: как - то давно, с другом разговаривал по поводу кризиса 2 и он мне сказал: "это же прототайп! чистой воды он!", но.. я не играл, возражать не стану и сейчас). Единственное что не 1 я заметил - как то быстро все прошло, то есть, создалось ощущение, что вроде только начал, а уже конец. НО могу сказать что я просидел за игрой 12 часов, правда, не занимался спидраном : вычищал некоторые зоны под корень с луком наперевес, наслаждаясь, так сказать, новым девайсом :).

Пройдя кризис 3, ощутил дежа вю: полез в интернет с вопросом "будет ли кризис 4?", ответ нашел - будет, но это будет нечто кардинально новое. Заинтриговали ребята с крайтека, будем ждать. Хотя, сама история показалась какой-то незаконченной:
- что было с психом, как поймали? он был аж не один, а с толпой в нанокостюмах... как что и где?
- куда совсем пропал алькатрас - да, да, да, личность пророка его поглотила, но как-то ощущается недосказанность что ли..
- что было в период между 2 и 3 частами ?! вах, жуть как интересно, так как там тоже осталось много вкусностей.

В общем, как минимум на парочку дополнений (как кризис вархед) тут набралось, на мой взгляд.
Иээх, буду внимательно следить, что же будет в 4 кризисе... или в кризис: хроники чего-то там, или в что-то там оф кризис...  время покажет :D

среда, 26 декабря 2012 г.

ого...

Как же я давно сюда не заходил! Последний раз был я тут.. ого.. 29 сентября. Ну, жаловаться на время, я думаю, не стоит. Ведь когда захотел - вроде как и нашел. В общем-то готовлюсь к диплому.
Решил отписаться здесь, так как думаю с небольшой но все же проблемой этой сталкивалось большинство.
Суть: приперло мне по работе узнать количество рабочих дней в php, как ни странно, ни 1 встроенной функции не нашел (от зараза... ) , решил не унывать и пошел щупать гуглю. После тесного общения с оной нифига вразумительного не нашел, лишь пару человеков намекали на то, как можно реализовать сию штуковину, то есть, функцию по рассчету.
В общем, мой моск решил сию задачу, возможно даже верно, код нижее:

/**
* Считает рабочие дни недели (без учета праздников, т.е убирает выходные)
* @cdays(int) - количество дней до нужной даты
* количество рабочих дней(int)
**/
function WorkDays($cdays)
{
 if($cdays<0)
 {
  $koef =-1;
  $cdays=abs($cdays);
 }
 else
  $koef =1;
  
 $weekends = floor($cdays/7)*2; //выходные с целых недель в сроке
 $freeDay = $cdays%7; //кол-во дней, недотянувшее до целой недели
 $cdays-=($weekends+$freeDay); //вычитаем точно известные выходные и вычитаем все "пока лишние" дни
 
 
 if ($freeDay>0)//если есть свободные дни
 {
  $nownum = @date('w'); //номер дня недели(сегодняшнего), как точка отсчета
  $all = $nownum+$freeDay; //сегодняшний день недели + кол-во дней
  if ($all-7 >= 0) //если во время срока точно есть выходные
   $freeDay-=2;
  elseif($all-6 >=0)
   $freeDay--;
  $cdays+=$freeDay; 
 }
 return $cdays*$koef;
}
Сопсно, получилось вот такое вот чудо, не знаю, насколько оно верно буит отрабатывать у кого - то, у меня она пока работает как надо. если кто-то найдет ошибку, оч прошу сообщить :) За сим пока откланиваюсь, но обещаю появляться почаще.

суббота, 11 августа 2012 г.

немного размышлений и новостей

Давненько я тут ничего не писал. 2 патча на сайт успел запилить, а тут как то все не отписывался, хотя, поводов то уже было много, и мыслей тоже. В общем, начинать надо сначала, наверно :)
что порадовало: порадовала тема вафлана, где он решил излить историю создания ммв, позже платного wbv, зацепил меня там момент
Так же MuWebClone был основан из всего разного, в нём и MMW, и DSW, и DEW ну вообщем всякое разное.
На самом деле MWC был основан 2 раза: 1й раз это был переписанный му веб 0.8, затем в него вошел 0.3 мувеб.. в общем, учился я тогда прогать только. Потом настал перерыв у проекта. Далее, был никому не известный сайт, который писал я же, и он был полностью на класах, но, по моему мнению, тогда это было уныло и проект не удался, хотя работает. Рано тогда мне было писать в классах, ой как рано.
Немного позже (год-полтора) уже стартовал тот MWC, который пишется/модернизируется сейчас. Да, примерно 20% сайта были уже готовые модули, правда я их усиленно переписал под свой двиг, но как бы про уникальные вещи, которые разбрелись по вебам тоже есть.
Всё самое сочное решил воссоединить в одно единое, простота, скорость и надёжность была моя цель.
 на самом деле, это была не только его цель. Начинал писать новый движек я с этим девизом, да и, наверное все сейчас стремятся к этому.

Вообще забавно, самый мой первый релиз мвц был как раз с таким вот описанием, позже я ушел на сухую констатацию возможностей и краткое описание, а те, кто начинал с описания возможностей пришел как раз к тому с чего я начинал.

Хотя, вебы действительно очень похожи, принципами работы, модулями, я как то в последнее время даже не уверен, стоит ли вообще устраивать эти "кто лучше" или нет. Так как многим нравится одно, вторым другое. Кому - то удобнее так, кому -то вообще дев нравится...

Что касается последнего апдейта.. пришлось вымученно сделать капчу отключаемой, так как у многих в дизах её нет и вписывать явно не хотят/не могут.  Хотя я сугубо против отключения, но если надо... пусть не руками лазят по коду, а в настройках отключают...

вообще, чем дальше пишу, тем больше понимаю, что близится 2.0... Просто еще раз переписывать весь двиг придется, так  как в этом иногда такие куски кода нахожу, что в панике сижу и думаю "КАК!? КАК Я ТАКОУЮ :?*"№;%№;: МОГ НАПИСАТЬ?!!!"..
но 2.0 вряд ли будет фришным, ой как вряд ли.