• Какие они, ваши наблюдения и опыт о количестве интересных проектов во фрилансе/удаленной работе?

    syschel
    @syschel
    freelance/python/django/backend
    Самое сложное во фрилансе, не языки и технологии.
    • Умение продавать себя в толпе конкурентов. Это самое сложное. Есть много высококлассных специалистов, сидящих на среднем окладе. Они тупо не могут себя продать даже в другую компанию, а не редко и боятся менять привычное место.
    • Умение грамотно составить или согласовать ТЗ. Так что бы проблема заказчика решалась в оговоренные сроки и бюджет. А не перерастала в вечнострой с кучей доделок и переделок с базовым бюджетом. Когда обе стороны уже ненавидят друг друга. Ибо работая в офисе разработчиком, всё это ведут менеджеры и тим лиды, а вам спускают конкретные задачи. Вам же придётся научиться понимать, что хочет клиент, не разбирающийся в программировании, говоря то или это. Научиться понимать и предлагать те решения, которые будут ему актуальны с учётом технологий и отказывать в том, что сделать не реально. Находить компромиссы, но опять же, объясняя почему так или иначе.


    Самое лучшее для фрилансера, да и любого разработчика. Это большие и долгие проекты. Когда можно постоянно заниматься одним. А не вникать каждый раз по новой, не привыкать к новому заказчику. Да, тут есть шанс отупения и застоя в развитии, но это лечится средними своими проектами или доп работой небольшой. Хотя, если проект живой и развивающейся, руководство ищет способы развития бизнеса и само заинтересованно в росте. Тогда можно и на текущем проекте развиваться, пробуя новые технологии, службы, стеки. Это будет рост как специалиста.

    А технологии, языки. Это уже второстепенно. Главное развиваться. Ибо в попсовом PHP можно делать большие проекты и быть специалистом с большой стоимостью часа или на редком python/java сидеть и быдлокодить мелочь за копейки. Главное не метаться, а развиваться и расти, беря более сложные и более длинные проекты. И брать их не с "поддержкой", а с возможностью постоянного развития. Задачи "в стол", не интересны. А вот задачи на перспективу, на развитие. Это уже интересно. Ибо "в стол" это как правило теория(придумали, сделали, забыли). А развивающиеся, это практика на реальных условиях, когда в процессе приходится много менять (менять бизнес модель, менять архитектуру из-за возросших нагрузок, менять технологии).
    Ответ написан
    5 комментариев
  • Что делать,если на сайт залит вредоносный файл?

    @ramjke
    1. Обновление движка. Регулярно выпускаются обновления безопасноти, закрывающие дыры в функционале движка. Если обновления не ставить - Вас регулярно будут ломать.
    2. Права на папки 755, права на файлы 644 и никак иначе.
    3. Разные владельцы для разных сайтов. Если сделаете несколько сайтов под одним владельцем - есть риск заражения всех сайтов.
    4. Никаких левых плагинов с непонятных сайтов. Только офф плагины и аддоны.
    5. Анализ логов доступа к сайту. Спросите у хостера, когда начала проявляться активность - и просмотрите POST запросы к Вашему сайту в админскую директорию. Анализ логов позволит установить айпишник злоумышленника и уязвимость.
    6. Скачайте свежий бекап сайта к себе на компьютер и прогоните его антивирусом - простейшие инъекции почти любой антивирь найдёт. Особая рекомендация - если есть комп с ОС Линукс, используйте Maldet - ориентирован на безопасность сайтов.
    habrahabr.ru/post/194346
    7. Следите за тем, чтобы на тех компах, с которых Вы заходите, не было вирусов. Никогда не сохраняйте пароли в браузере и в фтп-клиентах.
    8. Нет, смена паролей не помогает, если вредоносный файл был занесён через уязвимость. Помогает соблюдение вышеописанных правил + использование актуальной, регулярно обновляемой версии движка.
    9. Ограничьте доступв админку сайта, панели управления хостинга по айпишнику (то есть оставив вход только со своих айпишников) - бережёного б-г бережёт.
    Ответ написан
    2 комментария
  • Как оптимизировать рутинный дизайн процесс?

    VladislavTM
    @VladislavTM
    UI/UX designer
    Не знаю насколько это вам поможет, но расскажу как делаю я.
    Составляю гайдлайны для каждого нового проекта:

    1. Сетка: 960 bootstrap (для стандартных проектов), либо составляю сам ориентируясь на объём контента modulargrid.org/#app, можно взять хорошие готовые сетки тут www.cssauthor.com/bootstrap-grid-system-psd-templates

    2. Типографика: сразу даёт набор (h1, h2, h3, h4, параграф, список + размеры кегля, интерлиньяж и т.д. + набор стилей css, scss, less, styl, но это больше для верстки) www.gridlover.net/app/. (Также есть множество готовых пресетов в разных пропорциях. Ну и конечно всё можно настроить вручную)
    Как более слабая альтернатива pearsonified.com/typography

    3. Шрифты: https://www.google.com/fonts/ + www.fontsquirrel.com + подбор шрифтовых сочетаний: www.typegenius.com, goo.gl/mp4IJD (подборка с designmodo.com/), ну и посерьёзней https://www.typewolf.com/

    4. Цветовая палитра (если у клиента нет брендбука, что чаще бывает): www.materialpalette.com, www.colourlovers.com, https://color.adobe.com/ + color.romanuke.com (чаще им пользуюсь, выбираю ключевой цвет бренда и подбираю подходящую палитру ориентируясь на него)

    5. Кнопки и ссылки: ну тут понятно, размеры кнопок, форма, состояния, размер текста, цвет ссылок и их стиль.

    6. Иконки: если есть готовый прототип сайта, то можно сразу составить набор иконок www.flaticon.com, dribbble с пометкой free и т.д. и т.п.

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

    В процессе дизайна:

    1. Фотографии: thestocks.im, и отличный плагин для PS — uberstock

    2. Паттерны: subtlepatterns.com

    Ну собственно и всё.
    Ответ написан
    Комментировать
  • Какую-литературу посоветуете по дизайну интерфейсов?

    @dmitryKovalskiy
    программист средней руки
    Попробуйте почитать Алана Купера. "Психбольница в руках пациентов" как теория проблемы и "Алан Купер об интерфейсе. Основы проектирования взаимодействия" как более практический подход.
    Ответ написан
    Комментировать
  • Тема для wordpress?

    cesnokov
    @cesnokov
    <head>&nbsp;</head>
    Шаблон довольно примитивен, с точки зрения простоты вёрстки. Я бы, сверстал HTML и натянул бы на каркас, например на этот: roots.io/sage. Также, для начинающего пригодятся такие ссылки:
    - "Custom Post Type" фреймворк "Pods" (pods.io);
    - Дополнительные админ панели "Redux" (https://reduxframework.com);
    - Плюшки: Twitter Bootstrap, Font Awesome, TimThumb, fancyBox и т.д.
    Ответ написан
    3 комментария
  • Как оптимальней клонировать сайт на wordpress?

    viktorvsk
    @viktorvsk
    Вопрос вообще абсурдный, таких заказчиков следует избегать в 99,999% случаев. Оставшиеся - это если вам программирование не нравится и в будущем вы хотите психоаналитикой заниматься, монографию написать ...

    Если вы не фрилансер, то ответ вообще проще простого в два шага:
    1. Эстимейтите возможные варианты
    2. Приступаете к работе над тем вариантом, который выберет заказчик

    Я бы начал эстимейтить примерно так:
    Вариант №1: Брутфорс:
    1.1 Брутфорс хостинга: ~10^36 часов
    1.2 Брутфорс аккаунта пользователя сайта ~ 10^12 часов
    1.3 Социальная инженерия ~ 24 * 30 * 3 часов
    Вариант №2 Реверс инжиниринг
    2.1. Копирование дизайна N часов
    2.2 Копирования явного функционала M часов
    2.3 Копирование неявного функционала (N + M) * 3 часов
    Вариант №3 "Адекват"
    3.1 Помощь в составлении ТЗ X часов (опционально)
    3.2 Эстимейт нового ТЗ Y часов
    Вариант 4 "Бизнесмен"
    4.1 Связаться с владельцем текущего сайта, предложить продажу сайта целеком\исходников\темы\информации о теме\...
    4.2 Предложить решение за [Сумма из пункта 4.1] * 2 заказчику
    Ответ написан
    1 комментарий
  • Как оптимальней клонировать сайт на wordpress?

    SabCoopers
    @SabCoopers
    Увеличивайте исходный ценник заказа в 15 раз.
    На вопрос заказчика «WTF?», спокойным голосом поясняете, что сюда входит стоимость взлома серверов, фтп и тп заказчика.

    А вообще, как справедливо выше уже написали - что-то вы не договариваете...
    Ответ написан
    3 комментария
  • Как скопировать из PuTTY и вставить в любой текст. редактор в Ubuntu?

    @mureevms
    Если это консольная оболочка, то просто выделением. Вставляется в любой убунтушный редактор по нажатии на скролл. (Если Вы не в курсе, почитайте про два буфера обмена в линуксах)
    Если это mcedit или mcview, то есть небольшое отличие - копировать надо так же выделением, но с зажатой клавишей shift.
    Ответ написан
    Комментировать
  • С чего посоветуете начать в сфере администрирования и защиты Веб-сайта?

    LukaSafonov
    @LukaSafonov
    Киберполигон
    Рекомендую Metasploitable, Damn Vulnerable Linux, Multidae.
    Ответ написан
    Комментировать
  • Как пояснить клиенту что такое технический долг и рефакторинг?

    Mephistophele
    @Mephistophele
    Есть 2 варианта:
    1. Обсудить с клиентом и обосновав ему, что после рефакторинга для него 2+2 будет равно 3, а не 5 как сейчас.
    2. Спрятать эти работы, размазав их тонким слоем по другим задачам. Заказчику в этом случае вы ничего не сообщаете.
    Ответ написан
    Комментировать
  • Как изменить содержимое балуна, который появляется на карте после нажатия метки, которая ставится следующим образом?

    forgotten
    @forgotten
    Руководитель разработки API Яндекс.Карт
    res.geoObjects.get(0).properties.set('balloonContent', 'bla-bla');
    Ответ написан
    Комментировать
  • Практичное использование orm. Где? Модель? Контроллер?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    В парадигме MVC работа с данными ведется в модели.
    Я бы описал MVC это как небольшую фирму в которой есть С - секретарша, которая принимает заказ и передает его M - боссу, он в свою очередь говорит V - художнику что и как нарисовать. Полученный шедевр V передает С, которая отдает его клиенту.

    "Студентов и школьников прошу продолжить играть в Dota и не отвлекаться на мой вопрос."
    Яркий пример предвзятого отношения от которого стоит избавляться..
    Ответ написан
    10 комментариев
  • Генерация уникального ID

    alexvy
    @alexvy
    интернет-маркетолог
    самый простой способ - взять unix-время, разбить на группы разрядов:
    140-785-156
    уникальности с девятью разрядами хватит на 30 лет
    даже если конкурент догадается как вы получаете ID - это ему ничем не поможет

    UPD: Проблему уникальности можно решить модифиицируя непосрдственно ключевое поле таблицы заказов - ALTER TABLE table_order AUTO_INCREMENT. mySql сам проследит за его уникальностью
    Ответ написан
    3 комментария
  • Стоит ли писать свой php-фреймворк с целью улучшения знаний в области ООП и изучения шаблона MVC?

    @romeo7
    Читая Ваш вопрос,вспомнил себя 5-ей летней давности:) На тот момент мой бэкграунд состоял из дюжины сайтов на различных CMS и одного стартапа,который ясное дело не взлетел. Я к тому моменту долго вынашивал план по реабилитации одного замороженного проекта (спортивный портал),который разрабатывал со своими товарищами ещё в студенческие годы. Изначально задачи написать свой движок не было,но... всё началось с разработки шаблонизатора с синтаксисом а-ля CMS MODx. Много читал о том,что данная реализация выделяется на фоне остальных конкурентов,по сути являясь визитной карточкой последней. На поверку оказалось, что это всего навсего синтаксическая абстракция над Smarty,со всеми вытекающими по производительности. К примеру,моя реализация имеет альтернативную поддержку нативного php-шаблонизатора
    <?=$this->getSnippet('List', $params)?>
    для тех, кто терпеть не может синтаксические абстракции (Smarty, Twing, Fenom и иже с ними.) из-за их низкой производительности и иным религиозным соображениям.
    Шло время, кодовая база росла. От паттерна Singleton до DI (Dependency Injection), к Service Locator-у. Много чего выпилено в угоду существующих решений. За последние 2 года,не без помощи Composer,стало в разы больше готовых решений,причём несколько на реализацию конкретно задачи. К примеру,из последнего - был заменён собственный файловый менеджер (манипуляция с файловой системой) на библиотеку Flysystem, ибо последняя помимо всего прочего, умеет "бегать" в облака. Круто же ;) Единственное,в моей реализации была возможность поиска по regexp-паттерну,пришлось писать абстракцию.

    Совет: Для программиста хорошим тоном является умение в своём коде наметить точки роста,а именно,чтобы другой разработчик при использовании текущего решения мог легко абстрагироваться,к примеру,через наследования от базового класса.

    Вот сходу антипример. Достаточно популярная библиотека для валидации данных Respect Validation. Требовалось реализовать интернационализацию сообщений, не было возможности вывести иерархию выброшенных во время валидации ошибок одним большим массивом,а также хотелось вернуть,к примеру,только первую ошибку (first) или последнюю (last). Пришлось форкнуть,ибо абстрагироваться попросту невозможно.

    Совет: Иногда сталкиваешься с тем, что не все возможности какой-либо библиотеки задокументированы,даже если она достаточно популярна и имеет свой красивый "твиттеробутстраповый" сайт. Загляните в unit-тесты,возможно,откроете для себя что-то новое;)

    Если всё же надумаете писать свой фреймворк,то опирайтесь на существующие решения. Выберите для себя один-два популярных фреймворка и изучите,как реализован в них тот или иной функционал,хотя бы визуально,благо документации навалом. Начните с модели MVC. Посмотрите как реализованы actions,а именно доступ к ним,фильтрация на входе и выходе в action. Я,к примеру,не сторонник реализации псевдо-аннотаций,как в Symfony,ибо в PHP поддержки нативных аннотаций пока нет,а всё остальное - это жалкое подобие через медленные Reflections,даже если всё это кэшируется. Вот и автор АОП парадигмы для PHP всё это понимает, но всё равно продолжает разрабатывать свой проект Go!. Реализация конечно интересная,но я обойдусь событийной моделью (Observer или PubSub).
    Взгляните как устроен роутинг, ибо это основополагающая для реализации SOAP и REST. К примеру,моё решение испытало влияние Lavarel Routing по части использования групп. Нынче в силу распространённости мобильных платформ всё чаще используется REST не только на основе url-а,но и на основе кастомных заголовков (X-<имя прагмы>).
    Обратите внимания на то,как осуществляется обработка ошибок/exceptions. К примеру,Yii давно ругают на то,что нет возможности верной идентификации того или иного исключения. Лучше для каждой отдельной задачи (к примеру, FileManager) свой класс Exception,который наследуется от базового:
    class Exception extends BaseException
    {
        const FILE_EXISTS = 'File exists: {path}';
    
        public function __construct(
            $level = self::ERROR,
            $msg = null,
            array $dataReplace = null,
            \Exception $handler = null
        ) {
            return parent::__construct($level, $msg, $dataReplace, $handler);
        }
    }

    Тогда в базовом классе BaseException можно легко реализовать логирование (к примеру, воспользоваться Monolog) и красивую визуальную выдачу в режиме дебага (к примеру, Whoops).
    Желательно сразу избавить себя от привычки делать "жирные" контроллеры/actions. В этом может Вам помочь различные реализации валидации,фильтрации данных,а также задания дефолтовых значение на уровне модели. Обратите внимание на метод rules. Тогда в Вашем контроллере будет лишь метод отправки уже обработанных данных на вьюху.
    Что касается ORM и DBAL (синонимы: DAO и Query Builder), то в этом случае уж точно не стоит изобретать свой "велосипед". Написать по возможности единый интерфейс для различных реляционных и нереляционных решений (СУБД, Систем полнотекстового поиска/индексаторов (Sphinx, Elasticsearch)) - более чем нетривиальная задача. Я в своём фреймворке взял за основу AR (ORM) и Query Builder Yii2. Да,в Yii отсутствует модульность,а потому всё достаточно зависимо друг от друга,но если захотеть, то можно.
    Чувствуете этот момент. Вы препарируете почти готовое (прим. Yii2 еще в состоянии беты),одно из самых выдающихся на текущий момент решений и тем самым разбираетесь во всех тонкостях, попутно проявляете активность в исправлении ошибок.
    Научитесь писать unit тесты. Множество ошибок всплывут на поверхности,да и сон Ваш тогда будет более крепким.
    Вы наверно могли для себя заметить на том же stackoverflow или иных ресурсах, задаются достаточно тривиальные вопросы по фреймворкам. Вот и сейчас пока пишу Вам этот большущий ответ,в разделе "Похожие вопросы" красуется такой вопрос "Как реализовать правильно авторизацию с сессиями ... Отсутствует элементарная дисциплина к самостоятельности. И я даже догадываюсь почему так. Фреймворков стало больше,фреймворки стали лучше. Programmer Frendly,а не страшный зверь для избранных,как было когда-то. Правда,некоторые и по сей день недружелюбно скалятся;) Так или иначе,если есть желание задать вопрос из серии каким образом в JQuery сравнить две переменные,то стоит задуматься,а надо ли тебе всё это.
    Не в коем случае не нужно уверять себя в том,что Ваш инструмент взлетит. Он не уникален,и в конечном счёте скорее всего будет состоять из множества готовых библиотек (прим. в моём случае 60 против 40% вендорного кода. Если учитывать значимость,то в этом случае, уже счёт будет не в мою пользу). К сожалению, не могу найти ссылку на англоязычную статью, где автор сетует на полный отказ от фреймворков в пользу packagist. Даже если в уникальности вашего решения нет сомнения,это ничего Вам не гарантирует. Необходимо грамотное продвижение - множество статей на тематические ресурсах,а также участие в конференциях. К примеру, PHPDaemon хоть и стартовал первым, но пока вчистую проигрывает ReactPHP, а всего-навсего необходимо было уделить внимание написанию документации. Автор PHPDaemon, Василий Зорин,как-то на вопрос чем отчается его проект от React,указал на то,что последний использует его идеи. Конечно печально за нашего соотечественника,но его проект попахивает откровенным эгоизмом.
    Делайте Ваш инструмент прежде всего для себя,и возможно,когда-нибудь он станет интересен кому-то ещё. Так или иначе,Вы получите бесценный опыт. Главное,постараться довести это дело до конца. Отличительной чертой нашей ремесленной профессии является терпение. Вот Вам и проверка этого замечательного человеческого качества:) Кстати,чтобы интерес не угас,стоит свои наработки применять,если не в продакшене,то хотя бы небольшой проект для экспериментов.
    Заметил за собой,что пока занимался разработкой инструмента,гораздо больше получил опыта,чем на предыдущих двух работах. Но это субъективно. Можно с самого начала устроится в такое место,где замечательный отзывчивый коллектив и не менее интересные проекты/стартап, а не "натяни шаблон на Wordpress". Считаю,что пусть CMS-сника - это путь в никуда, и Кипелов здесь не причём:) Чем раньше, тем раньше;)
    Мне, как и sWinDos тоже забавно смотреть на свои исходники годичной давности:)) Вам знакомо такое понятие,как "Тезаурус"? В трактовке теории информации,это экспоненциальный рост знаний/опыта до какого-то предела, после которого, эффективность полученных знаний/опыта заметно падает. Получается этакая кривая Гаусса или что-то вроде жизненного цикла знаний/опыта в отдельно взятой предметной области.

    Совет: Запомните,Ваши проекты на github-е и контрибьюторская активность - это твёрдое, незыблемое портфолио. На собеседовании в большинстве компаний вы вправе выбрать свой сценарий поведения и темы для бесед.

    P.S. Я специально не стал затрагивать моральную и финансовую сторону вопроса. Opensource или заработок? Вечные поиски свободного времени между семьёй,работой и отдыхом. Смотрю здесь уже кто-то отметился:) Если Вы ещё студент и не обременены чем-либо,то дерзайте. Вполне возможно уже по окончанию университета или даже раньше, Вы выйдите уверенным таким коренастым мидлом:) К слову,в первой организации, с которой я начал свой профессиональный путь проповедовали процедурное программирование,ибо ООП никем не понималось должным образом.
    Ответ написан
    6 комментариев
  • Как в active records в yii использовать SQL оператор IN?

    @Nc_Soft
    User::model()->findAllByAttributes(['pole_1' => [1,2,3], 'pole_2' => [4,5,6]]);
    Ответ написан
    1 комментарий
  • Какими способами можно связать базу Oracle (пакеты, триггеры, индексы, структура таблиц и т.д.) с системой контроля версий (GIT, SVN)?

    @Geny
    Если "Основная проблема - выяснить кто поменял конкретный объект базы (были печальные прецеденты). ", то можно повесить триггер на схему и логировать изменения DDL

    CREATE OR REPLACE TRIGGER ddl_log_and_lock_trigger
    AFTER
    CREATE OR ALTER OR DROP
    ON SCHEMA
    BEGIN
    .....
    END;
    Ответ написан
    Комментировать
  • Какими способами можно связать базу Oracle (пакеты, триггеры, индексы, структура таблиц и т.д.) с системой контроля версий (GIT, SVN)?

    К сказанному @mrstrictly хочу добавить:

    Обладать правами на изменение структуру БД на production должен очень ограниченный круг работников (или вообще один). У них должен быть очень простой алгоритм работы: взять последнюю версию скрипта миграции из ветки "xxx" и выполнить его после того как была отмашка от руководителя проекта.
    Разработчики переносят изменения в ветку "xxx" из ветоки в которой ведется активная разработка после проверки на development БД. То есть они как бы делают релиз скрипта миграции.

    Таким образом, если единственным источником DDL будет система контроля версий, это будет подталкивать разработчиков к внесению изменений в структуру БД через нее. И вы сможете отследить кто, что и когда менял.

    Мне видится, в этой проблеме больше организационной работы.
    Ответ написан
    Комментировать
  • Какими способами можно связать базу Oracle (пакеты, триггеры, индексы, структура таблиц и т.д.) с системой контроля версий (GIT, SVN)?

    mrstrictly
    @mrstrictly
    Если речь идет о production-БД, то самый надежный и проверенный временем алгоритм, пожалуй -- следующий:
    1. Изменения в БД оформляются в виде т.н. миграций. Движков для реализации SQL миграций -- полно. В простейшем случае, миграция -- это просто набор DDL/DML оформленных в виде, например, SQL-скрипта.
    2. Миграции хранятся в VCS. Видно кто какие изменения в них вносил.
    3. В продакшне миграции применяются автоматически под контролем DBA, либо руками самого DBA. Роль DBA может выполнять любое ответственное лицо, если у вас в штате не выделено отдельного человека.
    4. (бонус) Схема БД в продакшне после каждого применения миграции выгружается в тот же VCS в виде отдельного скрипта и содержит только DDL и справочные данные (пример: данные для наполнения таблицы марок автомобилей, данные для наполнения таблицы стран и т.п.). Это удобно для быстрого развертывания разработческих окружений синхронных с текущей продакшн-схемой БД.
    Как-то так.
    Ответ написан
    Комментировать