понедельник, 14 сентября 2015 г.

как оно это все.. ну там... внутри (о плагинах)

Вообще, лучше начал измышления с определения:
Плаги́н (англ. plug-in, от plug in «подключать») — независимо компилируемый программный модуль, динамически подключаемый к основной программе и предназначенный для расширения и/или использования её возможностей. Плагины обычно выполняются в виде библиотек общего пользования. (https://ru.wikipedia.org/wiki/Плагин попутно замечу что геолокация ru.wiki аж в далеких сша, по сему стоит относится ко всем материалам несколько с сомнением
 Ну, вроде как все подходит: подгружаются в главное окно независимо от страниц и расширяют функционал (авторизация, поиск и т.п.) и как показывает опыт, это реально бывает очень и очень удобно. Но вот, при реализации возник вопрос: делать ли зависимость плагинов от групп, то есть, для группы "гости" показывать панель авторизации, а для иных групп - нет, выходит очень удобно: не надо делать лишние и пустые проверки внутри самих плагинов - все уже укра.. сделано за нас.

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

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

единственное, чем. пожалуй, пока ограничу плагины - у них не будет бегрануда (он просто им не нужен, во-вервых, а, во-вторых, если их оставить, то каждый модуль помимо своей работы будет выпиливать еще и работу плагинов, а оно нам надо?).

понедельник, 7 сентября 2015 г.

как оно это все.. ну там... внутри

Сия запись - рассуждение, анализ уже содеянного, для тех, кто, возможно, пойдет тем же путем. Речь пойдет о новой версии MWCe, та, что с именованием 1.6.2.

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

В текущем же случае, получалось несколько странно: либо вписывать их в головной Controller, чтобы при каждом обращении к очередной странице оно все генерировалось и не надо было бы заботится о том чтобы вписывать их каждый раз, но большое "но" заключалось в том, что это "почти" страницы, да и как быть с ajax запросами к страницам, тоже генерировать плагины, что там и не нужны?..  В общем, даже если я их и вписываю в контроллер, то остается вопрос с использованием MVC в плагинах, так как если уж писать  как положено, так сразу, а не "потом допилю" - нет ничего более постоянного, чем временное.
Делать нечего - напилил PController специально для плагинов, отличие от страниц в том, что в плагине точка входа только одна, потому что, в любом случае, вызывать экшены как-то не нужно (ну, по крайней мере, в моем видении), хотя при желании можно сделать ajax запросы и достичь нужного функционала.
На самом деле, вышло совсем не плохо: получилось так, что на уровне плагина можно при определенных обстоятельствах изменить страничку без перезагрузки, так как плагин запускаются гораздо раньше (банальная подмена get-параметра страницы усе решила), чем генерация страничек и вообще их логика, что очень удобно при сокрытии страниц от определенных пользователей или  при выведении логин-формы. Свои велосипеды я пока выкладывать не буду, но придет время - все можно будет скачать и посмотреть на мой кривой код и лайв-примеры.
Единственное, что меня беспокоит - для каждого плагина по факту инициализируется 2 класса: контроллер и модель, коннект к бд проходит чуть пораньше и всего 1 раз, так как иначе создавать подключение для каждого плагина (коих может быть сколь угодно) + еще страница было бы подобно выстрелу себе в ногу и расстрелу сервера баз данных, по понятным причинам. Тык вот, время генерации и потребляемые ресурсы. сейчас пока пишу админку, так сказать - сердце самого движка (если мозг - контроллеры и модели) смотрю и стараюсь воевать за каждую сотую долю времени генерации...

среда, 2 сентября 2015 г.

воскресенье, 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 баксов, но оно того стоило, офигенная штука!
В общем, постараюсь почаще тут отписываться...
И да, кстати, у кого есть возможность дать мне инвайт на хабре, буду оч признателен.