• Как подготовиться к закону Яровой?

    @nirvimel
    1. Купите недорогой VPS (от $15/год, можно даже дешевле) и поднимите на нем личный VPN. В Сети есть куча подробных руководств как это делается. Только не надо говорить, что у вас нет на это денег, интернетом вы же не бесплатно пользуетесь. Просто примите это как небольшую дополнительную плату за интернет за ваш спокойный сон.
    2. Работая через VPN (обязательно), заведите себе новый почтовый ящик на зарубежном сервере у компании, у которой нет никакого бизнеса и любых коммерческих интересов в РФ. Пусть это будет не мажорный гигант индустрии, а скромная компания, малоизвестная в РФ. Главное - это наличие SSL в веб-интерфейсе и в IMAP, в остальном почта есть почта, она просто работает, и этого достаточно.
    3. Работая через VPN, заведите себе новый аккаунт в vk facebook и/или google (если вы неспособны полностью отказаться от использования социалок). При регистрации указывайте место проживания подальше от РФ. Учитывайте, что все гиганты индустрии, имеющие большой бизнес в РФ, полностью сотрудничает с ГБ, но аккаунты нерезидентов, зарегистрированные и посещаемые с зарубежных IP, они не станут сливать по умолчанию (но по первому запросу сольют мгновенно). Так что забудьте про любые приваты в социалках, ведите все общение так, как будто все это читает весь ваш квартал и все те, кому бы вам меньше всего хотелось это показывать. Для приватного общения пользуйтесь только безопасной почтой (пункт 2) и защищенными чатами, на telegram jabber на зарубежных серверах. Все это касается только тех, кто не может окончательно завязать с пагубной зависимостью от соц.сетей. Очевидно, наиболее безопасным (и полезным для здоровья) вариантом является полный отказ от социалок.
    4. Не вбрасывайте в старые ящики и соц.аккаунты адреса и ссылки на новые чистые, не указывайте новые адреса в любых исходящих и старайтесь, чтобы они не попали во входящие. Помните, что в любой социалке и любом веб-интерфейсе почты (сотрудничающей) кнопка "удалить" скрывает удаляемое только от вас самих и не более того.
    5. (Самый неприятный пункт) Забудьте про vk, mail.ru и российские gmail и facebook. - КАК? - Так! Я понимаю, что это не легко, что они давно стали частью вашей жизни. Но это придется сделать! Поговорите сами с собой, спросите себя что для вас важнее: ваша личная безопасность, спокойствие и крепкий сон или старые привычки, которыми вы опутаны, и которые не хотят отпускать вас? Учтите, что продолжая пользоваться местными социалками (и сотрудничающими иностранными), вы продолжаете каждый день генерировать на себя тонны компромата, который может обернуться против вас в самый неожиданный момент самым неприятным образом. Проявляя активность в своих старых аккаунтах, вы не даете им "протухнуть" и не даете даже формального повода добрым компаниям снести их через пол года, после истечения отведенного законом срока хранения (как известно, vk не ограничивается минимальным сроком хранения, а хранит все метаданные и текст практически вечно за исключением видео/аудио).
    Ответ написан
    26 комментариев
  • Как редактировать текстовые файлы в java построчно?

    List lines = Files.readAllLines(Paths.get("res/file.txt"));
    //перебираете циклом
    for(String s : lines)
    {
    s = "Бла-бла-бла!"
    }
    /* Если нужно удалить - для перебора используйте Iterator.
    Не забудьте : */ 
    Files.write(Paths.get("res/file.txt"), lines);
    //иначе результат не запишется


    С FileWriter и BufferedWriter также.
    Ответ написан
    Комментировать
  • Как правильно использовать Docker для веб разработки?

    zvd
    @zvd
    Software developer interesting in DevOps
    Добрый день.
    Все, как вы их назвали, «задачи» должны быть по разным контейнерам.

    1. Что брать за базовый образ?
    Что используете то и берите. Используете в работе Debian? Берите Debian ( https://registry.hub.docker.com/_/debian/ )
    2. Чтобы создать свой базовый образ который будете в дальнейшем использовать для приложения, вот вам пример Dockerfile:
    #
    # MyBaseimage Dockerfile
    #
    
    # Pull base image.
    FROM ubuntu:14.04
    
    MAINTAINER Your Name <your.email@gmail.maybe>
    
    RUN apt-get update
    RUN apt-get upgrade -y
    
    RUN apt-get install -y language-pack-en
    ENV LANGUAGE en_US.UTF-8
    ENV LANG en_US.UTF-8
    ENV LC_ALL en_US.UTF-8
    
    RUN locale-gen en_US.UTF-8
    RUN dpkg-reconfigure locales
    
    RUN echo "Etc/UTC" > /etc/timezone
    RUN dpkg-reconfigure -f noninteractive tzdata
    
    RUN apt-get install -y build-essential
    RUN apt-get install -y python python-dev python-setuptools python-pip python-virtualenv
    RUN apt-get install -y libxml2-dev wget
    RUN apt-get install -y libpcre3
    RUN apt-get install -y libpcre3-dev
    RUN apt-get install -y libssl-dev
    RUN apt-get install -y libncurses5-dev
    RUN apt-get install -y git git-core
    RUN apt-get install -y libpq-dev
    
    # install nginx
    RUN apt-get install -y software-properties-common python-software-properties
    RUN apt-get update

    Собрать image в директории где у вас лежит Dockerfile
    docker build -t your_docker_account/your_baseimage .

    3. Dockerfile для сборки вашего образа уже с приложением
    #
    # MyApp Dockerfile
    #
    
    # Pull base image.
    FROM your_docker_account/your_baseimage
    
    MAINTAINER Your Name <your.email@gmail.maybe>
    
    # Set instructions on build.
    RUN virtualenv /env
    ADD ./ /code
    
    RUN cd /code; /env/bin/python setup.py install
    RUN cp /code/config/config.yml.docker_example /etc/code/config.yml
    
    # Expose ports.
    EXPOSE 8484
    WORKDIR /code
    CMD ["/env/bin/python", "app.py"]

    4. Собрать образ с приложением
    docker build -t your_docker_account/your_app_container .

    5. Запустить контейнер с БД, в качестве примера PostgreSQL
    docker run -p :5432:5432 --name my_postgresdb_container -e POSTGRESQL_DB=mydb_name -e POSTGRESQL_USER=mydb_user -e POSTGRESQL_PASS=super_secret_password -d kamui/postgresql

    для mariadb аналонично, контейнеры ищем здесь: https://registry.hub.docker.com/
    6. Запустить контейнер с вашим приложением, пример:
    docker run -d -p :5000:5000 \
      --name my_app_container \
      --link my_postgresdb_container:postgresdb \
      -e DOCKERDB_ENV_POSTGRESQL_DB=mydb_name \
      -e DOCKERDB_ENV_POSTGRESQL_USER=mydb_user \
      -e DOCKERDB_ENV_POSTGRESQL_PASS=super_secret_password \
      your_docker_account/your_app_container

    7. Подключиться к запущенному контейнеру с приложением
    docker exec -it your_app_container /bin/bash
    8. Читать stdout запущенного приложения в контейнере
    docker logs -f your_app_container

    + Чтобы автоматизировать запуск всех необходимых контейнеров берите Docker Compose ( https://docs.docker.com/compose/ )
    Пример файла конфигурации:
    your_app:
      build: .
      links:
        - postgresdb
      ports:
        - "5000:5000"
      environment:
        DOCKERDB_ENV_POSTGRESQL_DB: mydb_name
        DOCKERDB_ENV_POSTGRESQL_USER: mydb_user
        DOCKERDB_ENV_POSTGRESQL_PASS: super_secret_password
    postgresdb:
      image: kamui/postgresql
      ports:
        - "5432:5432"
      environment:
        POSTGRESQL_DB: mydb_name
        POSTGRESQL_USER: mydb_user
        POSTGRESQL_PASS: super_secret_password

    И теперь вместо пунктов 5 + 6 где мы запускали контейнеры мы можем всё стартануть одной командой
    docker-compose up

    + можно смонтировать код в контейнер и разрабатывать непосредственно в docker'контейнере.
    Надеюсь чем-то вам помог.
    Ответ написан
    3 комментария
  • Как настроить совместную работу sublime text 3, github и bitbucket?

    Базовые знания:
    1. Создаем новый репозиторий в GitHub/Bitbucket.
    2. Создаем папку проекта с файлом .gitignore (в нем пишем форматы файлов и пути, которые не должны отслеживаться системой контроля версий: всякие логи *.log, временные файлы *.tmp, пути /trash и т.п.)
    3. В терминале находясь в данной директории инициализируем git.
    git init
    4. В ST пишем код и сохраняем в этой директории.
    5. В терминале смотрим изменения, добавляем и ставим в очередь на коммит в git все созданные файлы/директории
    git status
    git add -A

    6. Делаем коммит-мерж
    git commit -m 'Initial commit'
    7. Добавляем связь с удаленным репозиторием
    git remote add origin <адрес репозитория из п.1 на GitHub/Bitbucket>
    git remote -v

    8. Пушим локальные изменения в удаленный репозиторий
    git push origin master

    Далее в процессе работы повторяем пункты 4-8.

    Если нужно затянуть новый удаленный репозиторий
    git clone https://github.com/repo

    Для ветвления сначала достаточно знать только checkout и merge.
    Ответ написан
    3 комментария
  • React, redux, react-router, react-router-redux, как и где делать редирект после логина?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Мыслите верно, делать dispatch REDIRECT стоит после dispatch SUCCESS_LOGIN.

    Судя по документации, в action creators (создатель действия, первый блок кода) вы все делаете правильно.

    Далее проверяйте у себя (я приведу код, похожий на ваш):

    1) в месте, где передаете history (обычно это Root/App компонент, то есть родитель всего)
    import { AppContainer } from 'react-hot-loader'
    import React from 'react'
    import ReactDOM from 'react-dom'
    import { Router, browserHistory } from 'react-router' // раз
    import { Provider } from 'react-redux'
    import { routes } from './routes'
    import { syncHistoryWithStore } from 'react-router-redux' //два
    import configureStore from './store/configureStore'
    
    const store = configureStore()
    
    const history = syncHistoryWithStore(browserHistory, store) //три
    const rootEl = document.getElementById('root')
    
    ReactDOM.render(
      <Provider store={store}>
        <AppContainer>
          <Router history={history} routes={routes} /> //четыре
        </AppContainer>
      </Provider>,
      rootEl
    )


    2) в месте, где настраиваете объект store (обычно, это функция configureStore)
    import { routerMiddleware } from 'react-router-redux' //раз
    import { browserHistory } from 'react-router' //два
    import { createStore, applyMiddleware, compose } from 'redux'
    import thunkMiddleware from 'redux-thunk'
    import createLogger from 'redux-logger'
    import { rootReducer } from '../reducers'
    
    export default function configureStore() {
      const store = compose(
        applyMiddleware(thunkMiddleware),
        applyMiddleware(createLogger()),
        applyMiddleware(routerMiddleware(browserHistory)), //три (!)
      )(createStore)(rootReducer)
    
      if (module.hot) {
        // Enable Webpack hot module replacement for reducers
        module.hot.accept('../reducers', () => {
          const nextRootReducer = require('../reducers').rootReducer
          store.replaceReducer(nextRootReducer)
        });
      }
    
      return store
    }


    3) combineReducers с роутингом (как у вас и написано)
    import { combineReducers } from 'redux'
    import { routerReducer } from 'react-router-redux' //раз
    import products from './products'
    import login from './login'
    import notificationBar from './notificationBar'
    import provider from './provider'
    
    export const rootReducer = combineReducers({
      products,
      login,
      notificationBar,
      provider,
      routing: routerReducer, //два
    })


    Из вашего вопроса информации недостаточно, но судя по всему вы либо:
    а) передаете не верный history в configureStore
    б) не выполнили syncHistoryWithStore (из пункта 1)

    --- дополнительно ---
    Как вариант посмотрите как сделать редирект после логина в redux с помощью middleware (упрощенный вариант, но хорошо для понимания основ)

    Так же есть "простой" вариант - хранить необходимые данные после логина (токен, свойства юзера, и т.д.) в localStorage. И после логина, делать стандартный browserHistory.push
    Ответ написан
    1 комментарий
  • Как развить навык проектирования приложения или как стать Senior?

    @OldCrazyCoder
    Писать код. Читать код. Например, популярные опенсорсные проекты на гитхабе. Если очень уж книгу хочется, то вот минимальный джентельменский набор:
    1. Совершенный код. С. Макконнелл
    2. Чистый код: создание, анализ и рефакторинг. Роберт Мартин
    3. Приёмы объектно-ориентированного проектирования. Паттерны проектирования. Банда четырех))
    4. PHP. Объекты, шаблоны и методики программирования. Мэт Зандстра
    5. Рефакторинг: улучшение существующего кода. Мартин Фаулер
    И т.д. Книг крайне много. И статей много. И простое их чтение мало что даст. Практика, много практики. Критичное отношение к своему коду, однако без перегибов - не стоит упираться в перфекционизм.
    Ответ написан
    Комментировать
  • Как настроить доступ из интернета к нескольким сайтам на OpenServer?

    @alex_dark Автор вопроса
    Я поанализировал некоторые факты и ответ hap2yman:

    При обращении по адресу myIP/domain не открывается нужный сайт, хотя по логике должен, ведь для IP адреса dev.testN.ru это папка, которую он должен открывать.

    Если есть папка localhostи в ней различные сайты, то в адресной строке можно обращаться localhost/someSiteName- все открывается. А папка localhost соответствует адресу 127.0.0.1 (локальной машине)

    В документации openServerнаписано:

    Чтобы при наборе IP адреса вашего компьютера открывался определенный локальный сайт, можно создать алиас вида ваш_внешний_ip => ваш_локальный_домен


    ------
    Итак. Как сделать несколько сайтов на внешку:

    1) В папке domainsудаляем папку localhost(или изменяем её название, чтоб убрать ассоциацию с 127.0.0.1)

    2) В папке domainsсоздаем папку, которая послужит корнем для доменов. Например routeFolder. В ней уже будут лежать папки dev.test1.ru, dev.test2.ru, dev.test3.ru и т.д.

    3) В настройках -> вкладка "Сервер" -> IP-адрес сервера ставим наш внешний IP

    e2c68b8f38b947ceae2aed8948c8d576.jpg

    4) В настройках -> вкладка "Алиасы" -> привязываем IP к папке `routeFolder` и сохраняем настройку

    ba6086d760874e188a463e05b1b097c8.jpg

    Всё, перезагружаем сервер.

    P.S. Не забываем открыть порт для входа с внешки.

    P.P.S. При наборе IP будет видна папка с нашими доменами. Чтоб их не было видно, можно в корень (т.е. в папку routeFolder) кинуть .htaccess, который будет автоматом с корня перенаправлять, например, на сайт№1
    Ответ написан
    Комментировать
  • Как верстать с использованием ReactJS?

    kostya-frank
    @kostya-frank
    Системный администратор
    >> или статическая информация (которую нет смысла пропускать через js)
    Для таких ситуация обычно создается компонент <StaticInformation page="page1" />, в котором, к примеру, с помощью componentDidMount() заполняется div информацией, полученной с помощью post/get запроса.

    >> уроками где рассматривается более обширная архитектура чем в туториалах по SPA
    https://www.youtube.com/watch?v=MhkGQAoc7bc&list=P... - самые адекватные уроки

    >> Для ситуации когда нужно отрендерить два компонента в разных местах страницы
    Изначально создается родительский компонент App extends React.Component (к примеру), в котором в методе render имеем:
    <section>
       <Header />
       <Content />
       <Footer />
    </section>

    Подключаем import Header from ... и далее работает с каждым компонентом отдельно.

    Сам всегда использую react-router, так как он вполне подходит и для многостраничных сайтов (тык). Перебрасываем пользователя на index.html при любом запросе и обрабатываем все уже внутри приложения. Для пользователя разницы никакой.

    Если хотите полностью отдельные страницы, то можно насоздавать html страницы, подключив по куче модулей, как Вы и сказали, но данный вариант обычно не используется.
    Ответ написан
    Комментировать
  • Порядок изучения react.js?

    VirmarY
    @VirmarY
    Full-stack web developer
    Ну вот вам для затравки:
    [pluralsight.com] React Fundamentals
    [Tuts Plus] Getting Started With React.js Video Tu...
    [Egghead.io] React Lessons
    scotch.io
    sitepoint.com
    codementor

    а дальше документация + поиск статей на английском
    Ответ написан
    Комментировать
  • Как разбить таблицу на несколько?

    @bkosun
    countries (id, name)
    regions (id, country_id, name)
    cities (id, country_id, region_id, name)
    Ответ написан
    4 комментария
  • Как сравнить button==button из массива в c#?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Кнопки сравнить просто так не получится, это разные экземпляры и они будут разными, даже если имеют одинаковый набор значений свойств.

    Можно сравнить, например, Text.

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

    private Button FirstButton = null;
    
    void S_MouseClick(object sender, MouseEventArgs e)
    {
      var button = (sender as Button);
    
      if (this.FirstButton == null)
      {
        // это первая кнопка в текущей сессии,
        // запоминаем ссылку на кнопку
        this.FirstButton = button;
      }
      else
      {
        // это вторая кнопка в текущей сессии
        // сравниваем текст с первой
        if (this.FirstButton.Text == button.Text)
        {
          Console.WriteLine("Текст совпадает!");
          // меняем свойства кнопок
          this.FirstButton.Text = button.Text = "--";
          this.FirstButton.Enabled = button.Enabled = false;
        }
        else
        {
          Console.WriteLine("Текст не совпадает.");
        }
        // сбрасываем выбор, запуская тем самым новую сессию
        this.FirstButton = null;
      }
    }

    Если понадобится сравнивать более двух кнопок, то придется делать коллекцию.

    Вместо Text можно сравнивать по какому-нибудь другому признаку. У элементов есть свойство Tag, которое можно использовать для хранения любых дополнительных данных.

    Если все будет совсем сложно, то можно расширить Button дополнительными свойствами путем наследования. В таком случае можно будет переопределить Equals и с операторами поиграть.
    Ответ написан
    2 комментария
  • Как правильно в php работа с шаболном?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    $url = str_replace(['<login>', '<password>'], [$login, $password], $url);
    Ответ написан
    Комментировать
  • Как сделать правильный UPDATE данных на сайте php?

    Uwe_Boll
    @Uwe_Boll
    Я Злой и Страшный Уве Болл в Разработке знаю Толк
    заведи массив с названиями полей а потом гуляй по посту foreach'em и проверяй существует ли ключ в массиве полей и пустое ли значение значение в посте дальше логику Сам додумаешь
    Ответ написан
    1 комментарий
  • Как сделать правильный UPDATE данных на сайте php?

    1. У вас тут SQL-инъекций разбросано много
    2. Примерно так:
      $updatingFields = [];
      
      foreach (['name', 'familia'] as $field) {
          if (isset($_POST[$field]) && $fieldValue = trim($_POST[$field])) {
              $updatingFields[] = sprintf("%s = '%s'", $field, $link->real_escape_string($fieldValue));
          }
      }
      
      $result = null;
      if (count($updatingFields)) {
          $query = sprintf(
              "
                  UPDATE users
                  SET %s
                  WHERE id = '%s'
              ",
              implode(', ', $updatingFields),
              $link->real_escape_string($id)
          );
      
          $result = $link->query($query);
      }

    3. Узнайте что такое подготовленные выражения и PDO или любой другой Database abstraction layer
    4. Узнайте что такое query builder
    Ответ написан
    1 комментарий
  • Какова правильная логика обновления клиента игры?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Есть версия и есть хеш-сумма текущей версии всех данных приложения (файлы + БД).
    При запуске - проверяются оба значения.
    При несоответствии - выполняется операция синхронизации:
    1. Выявление различий
    2. Подготовка списка изменений относительно текущей версии у пользователя
    3. Резервирование текущей версии пользователя
    4. Загрузка всех необходимых файлов на устройство пользователя. (с возможностью докачки при разрыве соединения)
    5. Выполнение изменений.
    6. Проверка сделанных изменений (п.1)
    7. Удаление резервной копии (созданную в п.3)
    При прерывании любого из пунктов (сел аккумулятор у ПК или смартфона и прочее) - всегда должна быть возможность продолжить обновление с прерванного шага.
    Ответ написан
    Комментировать
  • Какова правильная логика обновления клиента игры?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Из личного опыта: imho самое правильное это иметь неразрывную цепочку обновлений с первой версии до текущей, т.е 1>2, 2>3, 3>4 итд.
    Периодически для чистой установки выпускать мажорные версии, - но при этом все равно иметь неразрывную цепочку обновлений.

    Делать патчи вида 1>4, 2>4 итд - по моему опыту архи неправильно, т.к создает огромные риски неявных багов + затраты на сборку таких патчей.

    По факту для пользователя нет проблемы установить много обновлений.

    Будет осуществляться проверка на то, какая из блоков цифр в версии отличается.
    Это Вы какие то мелкие частности обсуждаете.

    Как у них осуществляется проверка наличия даже самого ненужного файла? Удалил файл из каталога, а он берет и докачивает его. Проверяет перед запуском все каталоги на время изменения и сравнивает с серверными?

    Вопрос третий: Насколько эффективно будет сравнивать время изменения каталогов у пользователя и сравнивать с серверными? Ведь если даже в самой глубокой директории был изменен/удален/создан файл, то самый верхний по иерархии каталог будет иметь дату изменения ту, когда был затронут файл. Соответственно, таким образом можно избежать большого количества рекурсивных проверок.
    И, соответственно, обновиться будет проще. Удаляем измененный каталог и закачиваем заново.
    Привязываться к дате изменений - не лучшая идея. Проверка обходит каталоги рекурсивно, сравнивает не только список файлов но и их хеши. Почитайте как работает dropbox/яндекс.диск, да тот же торрент наконец
    Ответ написан
    4 комментария
  • Как убрать повторяющиеся слэши в .htaccess?

    @AlexBurma
    Попробуй это:

    RewriteCond %{THE_REQUEST} ([^\s]*)\/{2,}(\?[^\s]*)?
    RewriteRule (.*) %1 [R=301,L]
    Ответ написан
    1 комментарий
  • Можно ли подружить react.js и php, и есть ли примеры?

    @IvanDix
    React в браузере выполняется, его можно использовать без node.js. А php выполняется на сервере. Т.е. они друг другу изначально ни как, ни мешают. И их можно легко подружить.
    На React можно писать на чистом JS. Но так ни кто не делает. Пишут на jsx, это js с сахаром. Который можно компилировать прямо в браузере

    type=text/babel ... , или используя node.js и уже отдавать чистый js.

    Для разработки на React ставят webpack(написан на node.js) или аналог. Опять же можно без него, но с ним гораздо удобнее. Настраивается очень легко. Вот по этим скринкастам https://learn.javascript.ru/screencast/webpack
    Ответ написан
    Комментировать
  • Как найти максимальное значение без ?/switch/if?

    @Alexander1705
    Можно написать функцию max без использования условных операторов:

    def max_(a, b):
        return (a + b + abs(a-b)) / 2;
    
    m = 0
    arr = [1, 2, 3, 4, 5, 6, 98, 65, 190]
    for val in arr:
        m = max_(m, val)
    
    print(m)
    Ответ написан
    2 комментария
  • Математика для разработки игр. Что посоветуете?

    @diegocoder
    Основы 3D математики (координаты, ориентация, стол...
    FAQ: 3D математика
    Основы 3D математики: Векторные и матричные преобр...
    ЧАВО по матрицам и кватернионам
    Линейная алгебра для разработчиков игр
    Как вращается камера в 3D играх или что такое матр...
    Каверзные кватернионы
    Вращение и кватернионы. Сборник рецептов.

    на английском:
    Vector Math for 3D Computer Graphics
    General math
    Making WebGL Dance - лучше начать с этого для понимания всего в целом а затем уже перейти к остальным ссылкам

    именно так, всё сразу открывай и читай. это может и не цельные учебники но тем не менее дают хорошее понимание о том, с чем придется иметь дело. к тому же во многих статьях приводятся куски кода. если знаешь математику первого курса то считай что 90% изучено.
    Ответ написан
    Комментировать