Задать вопрос
  • Каким образом возможно подключиться по ssh к виртуальной машине, если хост машина не подключена к сети?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    В virtual boxe настройках виртуальной машины в свойствах сети выбираем bridged adapter, перезапускаем виртуалку, после этого руками пишем IP-адреса из одной подсети на хост и гостевой системе
    Ответ написан
    Комментировать
  • Как собрать приложение c++ с openssl?

    @xandox
    >g++: error: openssl.c: No such file or directory
    Если я тебя правильно понял, то ты собираешь не openssl, а прилодение которое с ним работать должно, тогда тебе этот openssl.c нафиг не нужен

    1) Убедись что openssl у тебя на машине установлен. Вместе с заголовочными файлами и библиотеками
    2) Для того что бы собрать твой проект тебе нужно, что-то вроде этого
    g++ function.cpp main.cpp -o my_openssl_use -I<PATH_TO_OPENSSL/include> -L<PATH_TO_OPENSSL>/lib> -lssl -lcrypt

    твой бинарник будет называться my_openssl_use
    Ответ написан
  • Yii: rules и очень много сценариев, в которых чёрт ногу сломит?

    zetamen
    @zetamen
    В поисках нового
    Можно скомпоновать правила по сценариям, в вашем примере это выглядело бы так:
    public function rules()
    {
    	return array(
    		array('phone', 'length', 'max' => 12),
    		array('icq', 'length', 'max' => 9),
    		array('email', 'email'),
    		array('login', 'length', 'max' => 80),
    		array('email', 'length', 'max' => 200),
    		//registration
    		array('login, email, password, retypePassword', 'required', 'on'=>'registration'),
    		array('login, email', 'unique', 'on'=>'registration'),
    		array('login', 'match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i', 'on'=>'registration'),
    		array('retypePassword', 'compare', 'compareAttribute' => 'password', 'on'=>'registration')
    		//updateByAdmin
    		array('login, email, password, retypePassword', 'required', 'on'=>'updateByAdmin'),
    		array('login, email', 'unique', 'on'=>'updateByAdmin'),
    		array('login', 'match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i', 'on'=>'updateByAdmin'),
    		array('retypePassword', 'compare', 'compareAttribute' => 'password', 'on'=>'updateByAdmin')
    		//updateByModerator
    		array('email', 'required', 'on'=>'updateByAdmin'),
    		array('login', 'match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i', 'on'=>'updateByAdmin'),
    		array('email', 'unique', 'on'=>'updateByAdmin'),
    		//changePassword
    		array('password, currentPassword, retypePassword', 'required', 'on'=>'changePassword'),
    		array('currentPassword', 'passwordValidator', 'on'=>'changePassword'),
    		array('retypePassword', 'compare', 'compareAttribute' => 'password', 'on'=>'changePassword')
    		//changeEmail
    		array('email, currentPassword', 'required', 'on'=>'changeEmail'),
    		array('email', 'unique', 'on'=>'changeEmail'),
    		array('currentPassword', 'passwordValidator', 'on'=>'changeEmail'),
    	);
    }


    В чем фишка всего этого? Кода, по сравнению с вашим примером, стало больше, но и его читаемость возросла.
    Ответ написан
    3 комментария
  • Yii: rules и очень много сценариев, в которых чёрт ногу сломит?

    XAKEPEHOK
    @XAKEPEHOK Автор вопроса
    Новое решение: отделить сценарии от правил валидации. Решил разом все свои проблемы

    Расширил ActiveRecord
    class ActiveRecord extends CActiveRecord {
      protected $modelRules = [];
    
      ...
    
      /**
       * @return array общие (базовые для модели) правила валидации, описанные в формате
       * array(
       *   'login' => array(
       *     ['required'],
       *     ['length', 'max' => 200]
       *   ),
       *   'firstName' => array(
       *     ['required'],
       *     ['length', 'max' => 200]
       *   ),
       * )
       */
      public function baseRules()
      {
        return array();
      }
    
      /**
       * @return array список сценариев с установленными правилами валидации для каждого сценария.
       * Правила валидации берутся из массива @see baseRules()
       * 'createUser' => ['login','firstName']
       * Существует возможность задать индивидуальные правила валидации для отдельного поля в заданном сценарии. Например:
       * 'createUser' => array(
       *   'login',
       *   'firstName' => array(
       *     '*', //можем унаследовать правила из @see baseRules()
       *     ['!required'], //можем удалить валидатор "required", указанный в @see baseRules() при наследовании правил
       *     ['in', 'range' => array('Alex','Jack','Sam','Jane')], //и добавляем новое правило
       *   ),
       * )
       */
      public function scenarioRules()
      {
        return array();
      }
    
      /**
       * Формирует валидатор в соотстветствии с требованиями Yii
       * @param $field string поле модели
       * @param $validator array массив с параметрами валидатора
       * @param $scenario string сценарий
       */
      protected function addBaseRule($field,$validator,$scenario)
      {
        $validatorName = [];
        preg_match('/^(!)?([^!]+)/',$validator[0],$validatorName);
        $validator[0] = $validatorName[2];
        $ruleKey = $field.'_'.$validator[0].'_'.$scenario;
    
        if (empty($validatorName[1])) {
          if (!empty($scenario)) $validator['on'] = $scenario;
          $validator[1] = $validator[0];
          $validator[0] = $field;
          $this->modelRules[$ruleKey] = $validator;
        } else unset($this->modelRules[$ruleKey]);
      }
    
      /**
       * Формирует валидатор в соотстветствии с требованиями Yii из массива @see baseRules()
       * @param $field string поле модели
       * @param $scenario string сценарий
       */
      protected function addBaseRules($field,$scenario)
      {
        $baseRules = $this->baseRules();
        if (isset($baseRules[$field])) foreach($baseRules[$field] as $validator) $this->addBaseRule($field,$validator,$scenario);
      }
    
      public function rules()
      {
        $this->modelRules = [];
        $scenarioRules = $this->scenarioRules();
        if (empty($scenarioRules)) $scenarioRules = [''];
        foreach ($scenarioRules as $scenario => $rules) {
          //Если сценариев нет, то устанавливаем общие для всех правила
          if ($scenario == 0 && empty($rules)) $rules = array_keys($this->baseRules());
          foreach ($rules as $field => $rule) {
            //Если в сценариях заданы правила
            if (is_array($rule)) {
              //Добавляем родительские правила, если есть «*»
              if (in_array('*',$rule)) $this->addBaseRules($field,$scenario);
              foreach ($rule as $validator) {
                //Проверяем, что правило не является маской. Т.е. «*»
                if (is_array($validator)) $this->addBaseRule($field,$validator,$scenario);
              }
            } else $this->addBaseRules($rule,$scenario);
          }
        }
        foreach ($this->modelRules as &$rule) uksort($rule,function($a,$b){
          if (is_numeric($a) && is_numeric($b) && $a>$b) return 1;
          return is_numeric($a) ? -1 : 1;
        });
        return $this->modelRules;
      }


    В итоге получил такую модель User
    class User extends CActiveRecord {
    
      public $currentPassword;
      public $retypePassword;
    
      pulbic function baseRules()
      {
        return array(
          'login' => array(
            array('required')
            array('length', 'max' => 80),
            array('unique'),
            array('match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i'),
          ),
          'email' => array(
            array('length', 'max' => 200),
            array('unique'),
            array('email'),
            array('required'),
          ),
          'password' => array(
            array('required'),
          ),
          'currentPassword' => array(
            array('required'),
            array('passwordValidator'),
          ),
          'retypePassword' => array(
            array('required'),
            array('compare','compareAttribute' => 'password'),
          ),
          'phone' => array(
            array('length', 'max' => 12),
          ),
          'icq' => array(
            array('length', 'max' => 9),
          ),
        );
      }
    
      pulbic function scenarios()
      {
        return array(
          'registration' => array('login','email','icq','phone'),
          'updateByAdmin' => array(
            'login',
            'email',
            'icq',
            'phone',
            'password' => array(
              array('default'),
            )
          ),
          'updateByModerator' => array('email','icq','phone'),
          'changeEmail' => array('email','currentPassword'),
          'changePassword' => array('password','retypePassword','currentPassword'),
        );
      }
    }


    Расширенный AR формирует типичный для Yii массив rules, используя данные из методов scenarios() и baseRules()
    Ответ написан
    Комментировать
  • Как и чем быстрее всего начать зарабатывать на программировании/веб-программировании?

    @CAMOKPYT
    Забудь про фриланс, сколько бы про него не говорили, это биржа ДЕШЕВОЙ рабочей силы со всеми вытекающими последствиями в виде кидалова, низкой зп, скучной работы, туда идут люди с серьезными проблемами вроде невозможности перебраться в город, социопатии, инвалидности, "утонченная личность", фриланс это почти всегда вынужденная мера. Вообще фриланс и стабильный заработок несовместимые понятия, просто потому что фриланс подразумевает постоянный поиск мелкой работы, никакой заказчик не будет давать большой серьезный проект фрилансеру никогда, потому что это большая ответственность, посмотрите соседние вопросы, пацики с рейтами 150баксов в час работают 10 часов в месяц, а остальное время ищут заказы, причем это люди с опытом и портфолио + отличный английский. Начинать карьеру с фриланса это 100% гарантия того что, все что можно сделать неправильно (техническая сторона), будет сделано неправильно, потому что работает, дедлайн вчера, а подсказать или сделать код ревью некому, никакие книжки тут не помогут, выбора не будет, ты либо читаешь либо работаешь. Так что не советую ввязываться в эту тему. Лучше начать работы в офисе под строгим надзором. Ну и конечно html+css+js это мало, нужно знать еще около программисткие штуки вроде систем контроля версий, багтрекеры, несколько ide/ текстовых редакторов, если это веб почти гарантированно надо иметь представления о http/https, ООП, возможно sql. Не то чтобы для 20к месяц все это нужно отлично знать, но как минимум иметь представление, чтобы не отвлекаться. Вот по фронтэнду. Для большой гарантии устройства на работу, как уже сказали выше, лучше сделать себе сайт, а еще лучше сделать небольшое портфолио и выложить на гитхаб, это сейчас очень модно. На изучения всего вышеперечисленного уйдет 1-2 месяца если сидеть по 8-4 часа в день примерно, свой сайт где-то неделю на разработку визитки и еще неделя на вылизывание, но оно того стоит, а в процессе поиска работы можно и на гитхаб по чуть-чуть кидать, хотя вряд ли получится много. Удачи.
    Ответ написан
    8 комментариев
  • Как в Yii передать параметры в JS или записать кусок js-кода в свойство контроллера/компонента?

    nikel303
    @nikel303
    Я сделал таким образом:

    В базовый класс контролера:
    class Controller extends CController {
        public $jsParams = array();
        /* ... */


    дальше, во въюшке или в экшене
    добавляем элементы в этот массив, например:
    public function actionIndex() {
      $oRequest = Yii::app()->getRequest();
      $this->jsParams['csrf'] = array($oRequest->csrfTokenName => $oRequest->getCsrfToken());
    }


    ну и дальше рендим этот массив в главном layout, например:
    Yii::app()->clientScript->registerScript('js.params', 'var jsParams=' . CJSON::encode($this->jsParams).';', CClientScript::POS_HEAD);


    в скриптах можно получить доступ так:
    jsParams = jsParams || {};
    console.log(jsParams);
    Ответ написан
    Комментировать
  • Как в Yii передать параметры в JS или записать кусок js-кода в свойство контроллера/компонента?

    AMar4enko
    @AMar4enko
    Плохо искали, для этого используется CClientScript.
    На самом деле ваша история с $cssArr и $jsArr это велосипед, потому что все необходимые для этого инструменты как раз CClientScript и предоставляет.

    Например, для добавления в выходную страницу JS-файла используется
    www.yiiframework.com/doc/api/1.1/CClientScript#reg...

    Для добавления CSS-файла
    www.yiiframework.com/doc/api/1.1/CClientScript#reg...

    А для добавления "сырого" скрипта
    www.yiiframework.com/doc/api/1.1/CClientScript#reg...

    Во всех вышеперечисленных методах вы можете выбрать, куда именно Yii запихает эти файлы и скрипты. Конкретно для сырых скриптов есть CClientScript::POS_READY - т.е. переданный код будет находится в обертке JQuery ready и выполнится после иницализации jQuery
    Ответ написан
    Комментировать
  • Какую книгу почитать по PostgreSQL?

    @petr-korobeinikov
    www.postgresql.org/docs/books — теми, что для версии 9+ можно спокойно обзаводиться и читать. Акцентирую внимание на "PostgreSQL Server Programming", "PostgreSQL: Up and Running" и "PostgreSQL 9 Administration Cookbook".
    postgresql.leopard.in.ua — довольно хорошая книга в свободном доступе, больше про админство, но по своему опыту скажу, что разработка и администрирование PostgresQL очень тесно связаны.
    Ответ написан
    1 комментарий
  • Yii не видит изменения в файлах?

    Rpsl
    @Rpsl
    Кратко о себе

    Да, это может быть opcache или eaccelerator. А зачем вообще их использовать вместе?

    Покажите что в php.ini есть про opcache и eaccelerator

    Ответ написан
    4 комментария
  • Yii не видит изменения в файлах?

    kotomyava
    @kotomyava
    Системный администратор

    Это может быть следствием установки apc.stat=0 или аналогичной настройки другого кешера опкода. Кеш файловой системы или ssd тут не при чём.

    Ответ написан
    1 комментарий
  • Yii и Smarty-renderer

    XAKEPEHOK
    @XAKEPEHOK Автор вопроса
    Сам спросил, сам ответил.
    Yii::app()->viewRenderer->getSmarty()->setTemplateDir(Y::alias('webroot.themes.'.Y::param('domain')));
    $this->render('webroot.themes.'.Y::param('domain').'.index', array('page' => $page));
    
    Ответ написан
    Комментировать
  • Сколько времени должно занять подключение робокассы у программиста на php?

    @kolesnikov
    Написать кусок кода который будет тупо работать — за полчаса можно, но вот время сверху будет зависеть от того куда ее подключать, как сие творение написано, реализация всяких там биллингов-шмилингов и прочей трихомудии… Плюс отладка. Почему-то у всех кто говорит «хочу подключить робокассу» дальше идет строка «написать историю пополнений», «написать API по работе с финансами внутри проекта (переводы, конвертации, ф-ии получить остаток и т.д. )» и вот это уже не 2 часа делается… ну а если все есть и надо только вызвать уже готовую в апи ф-ю пополнить баланс на стока-то и указать из какой платежной системы поступила оплата — то да, полчаса-час…
    Ответ написан
    10 комментариев
  • Сколько времени должно занять подключение робокассы у программиста на php?

    @edogs
    Пара часов абсолютный максимум если именно робокасса. Если дольше, то программисту пока еще учиться надо, а не работать. Если профи, то полчаса максимум — там все очевидно, стандартно + примеры кода есть рабочие.
    С другими платежными системами может дольше занимать, из-за большей сложности (данные на почту и pgp сигнатуры) или из-за большей глюкавости (порядок и тип аргументов при формировании хэша не очевиден).
    Это, разумеется, без учета «бюрократического» времени, т.е. если аккаунт уже полноценно работает.
    Ответ написан
    4 комментария
  • Как удалить вопрос?

    DenisOgr
    @DenisOgr
    Developer
    Можно сделать вопрос черновиком и никто не будет видеть Ваш вопрос.
    Ответ написан
    1 комментарий
  • Как удалить вопрос?

    Shultc
    @Shultc
    RnD Developer
    Можно нажать на кнопку «Редактировать» и переделать его на вопрос получше ;)
    Ответ написан
    4 комментария
  • Динамическое добавление полей в форме?

    taliban
    @taliban
    php программист
    Простейший вариант:
    Делаем шаблончик нужного хтмл но как значение переменной
    var tpl = "
    <div>\
        <input name='name[%%num%%]'>\
        <input name='name[%%num%%]'>\
        <input name='name[%%num%%]'>\
    </div>\
    ";

    При нажатии на кнопку добавления новой строки просто заменяете в переменной %%num%% на счетчик++
    var currentTpl = tpl.replace(/%%num%%/g, counter++)
    и вставляете после текущих полей
    Ответ написан
    3 комментария
  • Динамическое добавление полей в форме?

    nixmale
    @nixmale
    <div id="parentId">
      <div>
        <nobr><input name="name[1]" type="text" style="width:300px;" />
        <select size="1" name="type[1]" style="width:150px;">
          <option value="text">Текстовое поле</option>
          <option value="int">Целое число</option>
          <option value="float">Число-цена</option>
        </select>
        <a style="color:red;" onclick="return deleteField(this)" href="#">[—]</a>
        <input name="url[1]" type="text" style="width:300px;" />
        <a style="color:green;" onclick="return addField()" href="#">[+]</a></nobr>
      </div>
    </div>
    
    <script>
    var countOfFields = 1; // Текущее число полей
    var curFieldNameId = 1; // Уникальное значение для атрибута name
    var maxFieldLimit = 25; // Максимальное число возможных полей
    function deleteField(a) {
      if (countOfFields > 1)
      {
     // Получаем доступ к ДИВу, содержащему поле
     var contDiv = a.parentNode;
     // Удаляем этот ДИВ из DOM-дерева
     contDiv.parentNode.removeChild(contDiv);
     // Уменьшаем значение текущего числа полей
     countOfFields--;
     }
     // Возвращаем false, чтобы не было перехода по сслыке
     return false;
    }
    function addField() {
     // Проверяем, не достигло ли число полей максимума
     if (countOfFields >= maxFieldLimit) {
     alert("Число полей достигло своего максимума = " + maxFieldLimit);
     return false;
     }
     // Увеличиваем текущее значение числа полей
     countOfFields++;
     // Увеличиваем ID
     curFieldNameId++;
     // Создаем элемент ДИВ
     var div = document.createElement("div");
     // Добавляем HTML-контент с пом. свойства innerHTML
     div.innerHTML = "<nobr><input name=\"name[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" /> <select size=\"1\" name=\"type[" + curFieldNameId + "]\" style=\"width:150px;\"><option value=\"text\">Текстовое поле</option><option value=\"int\">Целое число</option><option value=\"float\">Число-цена</option></select> <a style=\"color:red;\" onclick=\"return deleteField(this)\" href=\"#\">[—]</a> <input name=\"url[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" /> <a style=\"color:green;\" onclick=\"return addField()\" href=\"#\">[+]</a></nobr>";
     // Добавляем новый узел в конец списка полей
     document.getElementById("parentId").appendChild(div);
     // Возвращаем false, чтобы не было перехода по сслыке
     return false;
    }
    </script>
    
    Ответ написан
    1 комментарий