Ответы пользователя по тегу PHP
  • Ценится ли IT-специалист, который умеет все?

    viktorvsk
    @viktorvsk
    Работодатель ценит того, кто умеет решать его задачу в поставленных сроках с адекватными ресурсами.
    Если вы умеете вышивать крестиком, то работая в айти конторе вам это врядли поможет.

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

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

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

    Сегодня очень много людей помешаны на стартапах. Не у всех из них много ресурсов. Если вы можете за неделю состряпать прототип его бизнес логики, сделать дизайн, от которого не будет тошнить, в нем можно будет разобраться, еще и сносно открыть на мобильнике. После - вы арендуете ему сервер под его нужны (shared, vps, vds, collocation) и сможете его настроить и задеплоить в продакшн, а через какое-то время еще и сделать на phone gap тормозящий аналог результирующего приложения - он явно отдаст вам предпочтение перед толпой компаний со штатом по 10 человек на проект, из которых 2 - менеджеры, и 1 эйчар

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

    viktorvsk
    @viktorvsk
    Обычно, разбивают классификацию на подгруппы:
    - По типу интерпретации\комиляции языка
    - По платформе использования
    - По виду хранения записей в базе данных
    - По среднему урвоню зарплат
    - По среднестатическому-годовому размеру команд на энтерпрайзах

    То есть, не просто "классификация по...", а как пишут в учебниках: "Классификация по типу виртулацизации бывает...". А там уже скилы, связанные с каждой, например

    Хотя вообще, полезность идеи сомнительна, имхо
    Ответ написан
    2 комментария
  • У кого есть опыть разработки под TecDoc?

    viktorvsk
    @viktorvsk
    Работал с parts-soft.ru
    Правда, проекты на рельсах
    Ответ написан
    Комментировать
  • Какая архитектура mysql необходима для создания простой социальной сети?

    viktorvsk
    @viktorvsk
    Взять и создать. Главное, правильно. И побезопаснее. Ну, с лайками можно не очень безопасно. А вот с друзьям - очень безопасно! И, главное, со всеми правильно это сделать!
    Ответ написан
    Комментировать
  • Как при помощи php подключится к api vkontaket?

    viktorvsk
    @viktorvsk
    А на документацию аллергия?
    Тогда так:
    <?php
    /*
     * Class Vk
     * author: Dmitriy Nyashkin
     */
    class Vk{
    
        const API_VERSION = '5.24';
    
        const CALLBACK_BLANK = 'https://oauth.vk.com/blank.html';
        const AUTHORIZE_URL = 'https://oauth.vk.com/authorize?client_id={client_id}&scope={scope}&redirect_uri={redirect_uri}&display={display}&v=5.24&response_type={response_type}';
        const GET_TOKEN_URL = 'https://oauth.vk.com/access_token?client_id={client_id}&client_secret={client_secret}&code={code}&redirect_uri={redirect_uri}';
        const METHOD_URL = 'https://api.vk.com/method/';
        
        
        public $secret_key = null;
        public $scope = array();
        public $client_id = null;
        public $access_token = null;
        public $owner_id = 0;
    
        /**
         * Это Конструктор (Кэп.)
         * Передаются параметры настроек
         * @param array $options
         */
        function __construct($options = array()){
    
            $this->scope[]='offline';
    
            if(count($options) > 0){
                foreach($options as $key => $value){
                    if($key == 'scope' && is_string($value)){
                        $_scope = explode(',', $value);
                        $this->scope = array_merge($this->scope, $_scope);
                    } else {
                        $this->$key = $value;
                    }
    
                }
            }
        }
    
        /**
         * Выполнение вызова Api метода
         * @param string $method - метод, http://vk.com/dev/methods
         * @param array $vars - параметры метода
         * @return array - выводит массив данных или ошибку (но тоже в массиве)
         */
        function api($method = '', $vars = array()){
            
            $vars['v'] = self::API_VERSION;
            
            $params = http_build_query($vars);
    
            $url = $this->http_build_query($method, $params);
    
            return (array)$this->call($url);
        }
    
    
        /**
         * Построение конечного URI для выхова
         * @param $method
         * @param string $params
         * @return string
         */
        private function http_build_query($method, $params = ''){
            return  self::METHOD_URL . $method . '?' . $params.'&access_token=' . $this->access_token;
        }
    
        /**
         * Получить ссылка на запрос прав доступа
         *
         * @param string $type тип ответа (code - одноразовый код авторизации , token - готовый access token)
         * @return mixed
         */
        public function get_code_token($type="code"){
    
            $url = self::AUTHORIZE_URL;
    
            $scope = implode(',', $this->scope);
    
            $url = str_replace('{client_id}', $this->client_id, $url);
            $url = str_replace('{scope}', $scope, $url);
            $url = str_replace('{redirect_uri}', self::CALLBACK_BLANK, $url);
            $url = str_replace('{display}', 'page', $url);
            $url = str_replace('{response_type}', $type, $url);
    
            return $url;
    
        }
    
        public function get_token($code){
    
            $url = self::GET_TOKEN_URL;
            $url = str_replace('{code}', $code, $url);
            $url = str_replace('{client_id}', $this->client_id, $url);
            $url = str_replace('{client_secret}', $this->secret_key, $url);
            $url = str_replace('{redirect_uri}', self::CALLBACK_BLANK, $url);
    
            return $this->call($url);
        }
    
        function call($url = ''){
    
            if(function_exists('curl_init')) $json = $this->curl_post($url); else $json = file_get_contents($url);
    
            $json = json_decode($json, true);
    
            if(isset($json['response'])) return $json['response'];
    
            return $json;
        }
    
        // @deprecated
        private function curl_get($url)
        {
            if(!function_exists('curl_init')) return false;
    
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $tmp = curl_exec ($ch);
            curl_close ($ch);
            $tmp = preg_replace('/(?s)<meta http-equiv="Expires"[^>]*>/i', '', $tmp);
            return $tmp;
        }
    
        private function curl_post($url){
    
            if(!function_exists('curl_init')) return false;
    
            $param = parse_url($url);
    
            if( $curl = curl_init() ) {
    
                curl_setopt($curl, CURLOPT_URL, $param['scheme'].'://'.$param['host'].$param['path']);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
                curl_setopt($curl, CURLOPT_POST, true);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $param['query']);
                $out = curl_exec($curl);
    
                curl_close($curl);
    
                return $out;
            }
    
            return false;
        }
        /**
         * @param array $options
         */
        public function set_options($options = array()){
    
            if(count($options) > 0){
                foreach($options as $key => $value){
                    if($key == 'scope' && is_string($value)){
                        $_scope = explode(',', $value);
                        $this->scope = array_merge($this->scope, $_scope);
                    } else {
                        $this->$key = $value;
                    }
    
                }
            }
    
        }
    
        /**
         * @param bool $gid
         * @param array $files
         * @return array|bool
         */
        function upload_photo($gid = false, $files = array()){
    
            if(count($files) == 0) return false;
            if(!function_exists('curl_init')) return false;
    
            $data_json = $this->api('photos.getWallUploadServer', array('group_id'=> intval($gid)));
    
            if(!isset($data_json['upload_url'])) return false;
    
            $temp = array_chunk($files, 4);
    
            $files = array();
            $attachments = array();
    
            foreach ($temp[0] as $key => $data) {
                $path = realpath($data);
    
                if($path){
                  $files['file' . ($key+1)] = (class_exists('CURLFile', false)) ? new CURLFile(realpath($data)) : '@' . realpath($data);
                }
            }
    
            $upload_url = $data_json['upload_url'];
    
            $ch = curl_init($upload_url);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
    
            $upload_data = json_decode(curl_exec($ch), true);
    
            $upload_data['group_id'] = intval($gid);
            
            $response = $this->api('photos.saveWallPhoto', $upload_data);
    
            if(count($response) > 0){
            
                foreach($response as $photo){
            
                    $attachments[] = $photo['id'];
                }
            }
            
            return $attachments;
    
        }
    
        /**
         * Заливка документа (например GIF файл)
         *
         * @param bool $gid
         * @param $file
         * @return bool|string
         */
        function upload_doc($gid = false, $file){
    
            if(!is_string($file)) return false;
            if(!function_exists('curl_init')) return false;
    
            $data_json = $this->api('docs.getUploadServer', array('gid'=> intval($gid)));
    
            var_dump($data_json);
    
            if(!isset($data_json['upload_url'])) return false;
    
            $attachment = false;
    
            $path = realpath($file);
    
            if(!$path) return false;
    
            $files['file'] = (class_exists('CURLFile', false)) ? new CURLFile($file) : '@' . $file;
    
            $upload_url = $data_json['upload_url'];
    
            $ch = curl_init($upload_url);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
    
            $upload_data = json_decode(curl_exec($ch), true);
    
            $response = $this->api('docs.save', $upload_data);
    
            if(count($response) > 0){
    
                foreach($response as $photo){
    
                    $attachment = 'doc'.$photo['owner_id'].'_'.$photo['did'];
                }
            }
    
            return $attachment;
    
        }
    
        /**
         *
         * Заливка видео
         *
         * http://vk.com/dev/video.save
         *
         * @param array $options
         * @param bool $file
         * @return bool|string
         */
        function upload_video($options = array(), $file = false){
    
            if(!is_array($options)) return false;
            if(!function_exists('curl_init')) return false;
    
            $data_json = $this->api('video.save', $options);
    
            if(!isset($data_json['upload_url'])) return false;
    
            $attachment = 'video'.$data_json['owner_id'].'_'.$data_json['vid'];
    
            $upload_url = $data_json['upload_url'];
            $ch = curl_init($upload_url);
    
            curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
    
            // если указан файл то заливаем его отправкой POST переменной video_file
            if($file && file_exists($file)){
                //@todo надо протестировать заливку
                $path = realpath($file);
    
                if(!$path) return false;
    
                $files['video_file'] = (class_exists('CURLFile', false)) ? new CURLFile($file) : '@' . $file;
    
                curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
                curl_exec($ch);
    
            // иначе просто обращаемся по адресу (ну надо так!)
            } else {
    
                curl_exec($ch);
            }
    
            return $attachment;
    
        }
    
    }
    Ответ написан
    8 комментариев
  • Какой движок выбрать для многофункционального портала?

    viktorvsk
    @viktorvsk
    Хотите что-то стоящее, долговечное, расширяемое и перспективное - забудьте про движки и цэмээски при таких запросах.

    Наймите одного человека, который поможет вам (заказчику) составить грамотное ТЗ и примерные стеки технологий, на которых это можно решить.

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

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

    Не связывайтесь с агенствами.

    Будьте готовые потратить до полугода времени. Платить от 5 долларов в час хотя бы. Подумайте о рисках минимум х1.5.

    Ну, это если хотите реально, а не абы-как и чисто поиграться. А в итоге забросить или вернуться в самое начало.

    Прочел, что сложности с пунктами 7-10.

    7) Запретить скачивать эксель - легко. Запретить парсер - сложно, долго, дорого. ГЛУПО.

    8) Парсить легко. Сложно - обходить ограничения и блокировки, если они есть (не все этим страдают). Тут не ждите универсального решения. Даже если кто-то сделает решение, которое будет работать весь срок договора - то когда-то оно таки отвалится и, возможно, придется делать заново.

    9) Скрыть номер от одной категории и разрешить другой - легко. Онлайн оплата - легко до тех пор, пока вы работаете с нормальными платежными шлюзами.

    10) Платная регистрация - опять же, зависит от шлюза и степени "критичности". Например, если сделки на миллионы -будет дорого, если цена ошибки (взлома, утечки) не так велика - то не проблема. С партнерской программой - очень широкий вопрос. Но по факту тоже, особенности только в платежном шлюзе (способе)
    Ответ написан
    Комментировать
  • Как быстро записываются данные?

    viktorvsk
    @viktorvsk
    Данные записываются очень быстро. Так быстро, что обычно их прочесть не успеваешь, а они уже записались. Сделать этот процесс можно быстрее если: 1) уменьшить количество данных, 2) увеличить мощность вычислительных средств
    Ответ написан
    Комментировать
  • Как лучше хранить данные?

    viktorvsk
    @viktorvsk
    Это называтся префильтр и постфильтр.

    Постфильтр хорош для экономии места и лишней паранойи.

    Префильтр хорош для гибкости: вдруг когда вы решите дать больше\меньше возможностей для постов.
    Ответ написан
  • Как сделать код?

    viktorvsk
    @viktorvsk
    Это конкурс интуитивного программирования на джиквери?
    Ответ написан
  • Как выполнить js код из php ?

    viktorvsk
    @viktorvsk
    Ставите phantom.js, делаете нужный скрипт с этой функцией и из php вызываете, кажется, при помощи:
    <?php
    $var = exec('phantomjs heavyFunction.js params');

    Естественно, что бы этот exec возвращал именно нужные Вам данные, это нужно описать в функции, которую скормите фантому. Это все описано в документации.
    Ответ написан
    2 комментария
  • Как сделать автоматическое открытие файла в каталоге?

    viktorvsk
    @viktorvsk
    <?php
    # cat/index.php
    include '../catalog.php';

    Ничем не хуже модрерайтов
    Ответ написан
  • Как скрыть модуль на мобильном устройстве?

    viktorvsk
    @viktorvsk
    MQ загружают картинки?
    Ответ написан
    Комментировать
  • Как получать информацию?

    viktorvsk
    @viktorvsk
    Уберите эту строчку:
    Я хотел бы узнать как получить информацию с двух сайтов и сравнить ее?

    И скопируйте на freelansim.ru, fl.ru и т.д.
    Эту будет первым шагом решения такой задачи.
    Ответ написан
    Комментировать
  • Как можно разрешить масштабирование странницы только до 300%?

    viktorvsk
    @viktorvsk
    На ваш сайт никто не зайдет :(
    Ответ написан
    Комментировать
  • Как прикрутить к MVC работу с Ajax?

    viktorvsk
    @viktorvsk
    Видимо, у вас проблемы с авторизацией. Для этого люди придумали сессии. Один раз авторизуетесь, например, аяксом вот так:
    $.post('http://example.com/auth', data: { pass: "qwerty", pass_confirmation: "qwerty" })
    , как-то так. Сервер создает для вас сессию, возвращает кукис с этой сессией. Вы ее храните и дальше по страничкам лазите, без нужды авторизации на каждой.

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

    Я так понял, проблемы тут не с роутингом.
    Да и вообще, пробуйте типичные задачи решать готовыми средствами (фреймворки). Кучу времени сэкономите
    Ответ написан
    Комментировать
  • Для какого типа веб проектов используют PHP фреймворки?

    viktorvsk
    @viktorvsk
    CMS - для стандартных и типичных задач.
    Фреймворки - для уникальных.

    По сути, можно было бы и без фреймворков. Делать каждый раз по уму, 100% для своих собственных нужд и никакого оверхеда. Но жизнь коротка.
    Ответ написан
    1 комментарий
  • Как/чем диск С почистить (win8)?

    viktorvsk
    @viktorvsk
    Documents and settings, application data, local data, как-то так,вроде
    А вообще, открываете корень и смотрите, у кого аномальный размер.
    Если директорий много, то пользуетесь методом "пополам":
    Есть 100 директорий, надо узнать какая самая большая
    1) Выбираете директории от 1 до 50, смотрите размер, если явно не много, дальше
    2) Выбираете от 50 до 100. Видите, что очень большой размер
    3) Выбираете от 50 до 75...
    Ответ написан
    Комментировать
  • Чем отличается junior от middle? а Senior?

    viktorvsk
    @viktorvsk
    Зарплатой и умением сказать "я - миддл" или "я - джуниор" и убедить в этом собеседника.
    Ответ написан
    1 комментарий
  • Возможен ли хайлоад на больших фреймворках?

    viktorvsk
    @viktorvsk
    Хайлоад и высокие нагрузки - это сколько попугаев?
    Ответ написан
  • Url - как избежать такой проблемы?

    viktorvsk
    @viktorvsk
    Скорее всего, у вас преждевременная оптимизация. Попробуйте для начала воооооообще не задумываться о производительности, пока явно не увидите, что что-то тормозит\не хватает памяти etc
    Ответ написан
    1 комментарий