• Как сохранить правила iptables после перезагрузки Ubuntu?

    EKrava
    @EKrava
    в debian и ubuntu добавили пакет iptables-persistent
    который использует iptables-save/iptables-restore

    #service iptables-persistent
    Usage: /etc/init.d/iptables-persistent {start|restart|reload|force-reload|save|flush}

    после настройки правил как нужно, сделать service iptables-persistent save и при следующей загрузке они будут применены
    Ответ написан
    4 комментария
  • Как на jQuery удалить 4 последних символа из значения переменной, в которой содержится текущий URL?

    @IvanDulko
    Проблема в том что оба метода не меняют строку, а возвращают новую строку, то есть надо сделать так:
    $currenturl = $currenturl.slice(0, -4);
    // или 
    $currenturl = $currenturl.substring(0, $currenturl.length - 4));
    Ответ написан
    Комментировать
  • Как прикрепить Telegram-бота к Ruby on Rails?

    Jeiwan
    @Jeiwan
    Нужно написать сервис (app/services) для работы с ботом, сделать коллбэк у модели (например, after_create), при срабатывании коллбэка вызывать сервис и отправлять сообщение. Можно обойтись без сервиса и вызывать АПИ бота прямо в модели, но это говнокод.
    А лучше использовать sidekiq и сделать воркер, чтобы сообщение в чат отправлялось в фоновом процессе и не блокировало запрос.
    Ещё тут могут быть разные подводные камни, не знаю, как реализован бот, но судя по Telegram::Bot::Client.run, он блокирует поток. Поэтому надо использовать именно sidekiq и отдельный воркер.

    P.S. Если будет время, постараюсь сделать приложение-пример. Самому интересно стало...

    Upd
    Запилил: https://github.com/Jeiwan/rails_telegram_bot Инструкция в README, используется sidekiq, сделана только отправка сообщений. Получение сообщений сделать будет труднее, т. к. там запускается бесконечный цикл.
    Ответ написан
    2 комментария
  • Как программно скачать файл с Яндекс.Диск?

    вот пример реализации на php:

    function get_stat( $url, $headers )
    {
        $handle = curl_init();
        curl_setopt( $handle, CURLOPT_URL, $url );
        curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, false );
        curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );
        $response = curl_exec( $handle );
        $code = curl_getinfo( $handle, CURLINFO_HTTP_CODE );
        return array( "code" => $code, "response" => $response );
    }
    
    $url_yandex_disk = "https://yadi.sk/i/byMUqoSLiw3Ki";
    
    $result = get_stat( "https://cloud-api.yandex.net:443/v1/disk/public/resources/download?public_key=" . urlencode( $url_yandex_disk ), array() );
    if( $result["code"] == 200 )
    {
    	$result["response"] = json_decode( $result["response"], true );
    	echo '<a href="' . $result["response"]["href"] . '">Скачать</a>';
    }
    else
    {
    	echo "error";
    }


    а здесь работающий пример:
    https://getfile.dokpub.com/yandex/

    А здесь публикация и получение списка своих файлов на Яндекс диске:
    https://getfile.dokpub.com/yandex/publish/

    Для тех кто желает генерировать постоянно обновляемые ссылки передаваемые ,например в GET параметре, можно сделать так:

    $url_yandex_disk = $_GET["ya_url"];
    
    $result = get_stat( "https://cloud-api.yandex.net:443/v1/disk/public/resources/download?public_key=" . urlencode( $url_yandex_disk ), array() );
    if( $result["code"] == 200 )
    {
    	$result["response"] = json_decode( $result["response"], true );
    	header( "Location: " . $result["response"]["href"], true, 302 );
    	exit( 0 );
    }


    а вот на Питоне:
    import requests
    import pprint
    import urllib.parse
    
    targetUrl = "https://yadi.sk/i/03bE933n3PqpG2"
    url = "https://cloud-api.yandex.net/v1/disk/public/resources?public_key=" + urllib.parse.quote(targetUrl, safe="")
    
    responseData = requests.get(url)
    if responseData.headers["content-type"] in ["application/json; charset=utf-8", "application/json"]:
        print(pprint.pformat(responseData.json()))
    else:
        print(responseData)


    В некоторых случаях могут возникать ошибки.
    Ниже связанные вопросы с текущим ответом:
    Как правильно использовать прямую ссылку с Яндекс.диска?
    Ответ написан
    4 комментария
  • Как делать версию для слабовидящих на WordPress?

    kremlin.ru вот там внизу есть линк на версию для слабовидящих, включите и посмотрите, думаю по этому сайту можно ориентироваться, что должно быть в этой версии.
    А в гугле есть плагины с такой же панелькой и для джумлы и для вордпресса, например вот https://ru.wordpress.org/plugins/for-the-visually-...
    Ответ написан
    Комментировать
  • Зачем нужен Gulp?

    @artinnok
    бекенд-программист
    CSS и JS:
    К примеру, у вас имеется большое количество (Х штук) css или js файлов, которое вы подключаете на своих страницах посредством тэгов <link> и <src>.
    При загрузке страницы, браузер клиента будет отправлять X запросов к вашему серверу, а ваш сервер должен будет ответить на X запросов.
    Это:
    1. Тормозит загрузку страницы - будете ждать ответа от сервера
    2. Загружает ваш сервер

    С помощью сборщиков фронтэнда вы можете "склеить" все файлы в один - main.css и main.js, которые будут отдаваться 2 запросами с сервера. Также, вы сможете минифицировать CSS и JS. Под минификацией подразумевается уменьшение размеров файла на диске. Естественно, более легкий файлы будет быстрее прогружаться + минимальное количество запросов к серверу.

    IMG:
    К примеру, у вас имеется Х изображений размером 700 Кбайт. Клиенту надо будет загрузить 700 * X Кбайт. Если вы пропустите свои изображения через Gulp, то вы получите изображения с меньшим размером на диске и такого же качества, т.е. клиенту придется прогрузить примерно (500-600) * X Кбайт.
    Ответ написан
    1 комментарий
  • Зачем нужен Gulp?

    @Rabinzon
    скрин
    Все что красным, соберется в то что синим.
    Например, когда проект разбивается на мелкие 'компоненты'. И вы используете предпроцессоры, например jade, sass все это нужно как то компилить и собирать в html и css. Gulp с этим делом справляется на УРА.
    Ответ написан
    Комментировать
  • Как сделать центр карты взависимости от региона?

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    ymaps.ready(function () {
    	ymaps.geolocation.get({
    		provider: 'yandex'
    	}).then(function (result) {
    		var coords = result.geoObjects.get(0).geometry.getCoordinates();
    		/*map — ссылка на карту Google*/
    		map.setCenter(new google.maps.LatLng(coords[0], coords[1]));
    	});
    });

    Пример
    Ответ написан
    Комментировать
  • Есть ли готовый модуль WordPress, фильтр, который сохраняется и отображается на всех страницах?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если честно, то весьма грубый и сырой use case. Фильтрация на текущую сессию или навсегда? Как происходит сборс фильтров или выход на уровень выше? Как происходит смена фильтров? Вообще, такой концетп называется faceted search / поиск с импользованием фильтров, юзается на всех адекватных интернет-магазинах и в каталогах (в том числе по недвижимости). Это уже давно стандартный паттерн, и не надо ничего придумывать. Плагинов для этого паттерна - масса, как платных, так и бесплатных. В том числе и на Тостере обсуждалось не раз, я сам оставлял ссылки раз 5. Так, из памяти:

    https://facetwp.com/
    https://searchwp.com/
    https://wordpress.org/plugins/search-by-wp-search/...
    https://wordpress.org/plugins/webkite/screenshots/
    https://wordpress.org/plugins/wp-ultimate-search/
    Тут еще https://wordpress.org/plugins/search.php?type=term...

    Но у всех этих решений есть один нюанс. Если фильтрация идет только по таксономиям (рубрики, теги, кастомные таксономии) - тогда без проблем. Если нужно делать фильтры по custom post metadata (метаданным), то все они будут медленные, чем больше база - тем медленнее работа. Дело в том, что метаданные хранятся в таблице без индексов, и любой запрос требует перебора всех строк в таблице. Если сайт большой, используется много метаданных, то есть только одно решение - установка и настройка на сервере Elastic Search и поиск уже через него. Но это для продвинутых.
    Ответ написан
    Комментировать
  • Как добавить рубрики товаров WooCommerce в пункт создание меню WordPress?

    seoperin
    @seoperin
    Full stack web developer. Laravel / Vue
    Недавно был такой вопрос тут же, я же и отвечал. "Вверху страницы "Настройки экрана" ,там выезжает настройка, там выбрать то что показать или скрыть"
    Ответ написан
    5 комментариев
  • Как умело работать с Sidekiq и очередями?

    mainameiz
    @mainameiz
    Full-stack web-developer
    Очереди это, как уже сказал bmalets, что-то вроде списков задач. Они нужны в основном для управлением нагрузкой, параллельностью. По дефолту есть только очередь default.

    Классический пример разделения очередей:
    - mailer - очередь для рассылки почтовых сообщения пользователям
    - default - для всего остального

    Можно сделать так что для очереди mailer вы запускаете 10 процессов (не воркеров, а именно процессов ОС), а для default только 1. Тем самым вы делаете приоритетной очередь mailer.
    Распределением нагрузки можно также управлять с помощью "весов" (параметр -q mailer,9 default,1 ). В данном случае из 10 задач 9 будут взяты из очереди mailer и только одна из очереди default.

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

    В основном конечно же под воркерами подразумевается второй вариант.

    По вашим вопросам:
    - как воркеры исполняются?
    Процесс-обработчик берет задачу из redis и выполняет её. Тут важно понимать, что при аварийном завершении работы процесса вы можете потерять задачу (такие кейсы бывают очень критичными для бизнеса).

    - какой обьём памяти для этого нужен?
    Объем данных в redis'е можно посмотреть в админском интерфейсе.

    - почему redis

    Кто знает...

    - как это работает с redis
    ???

    - почему в perform_async нельзя передовать сами обьекты? а только id, strings, json ...?
    Можно, но не нужно. Все что попадает в perform_async должно попадать в redis. А это накладные расходы на хранение, сериализацию/десериализацию.

    - Как правильно вызывать и добавлять очереди.
    Что вы имели ввиду под "вызывать очереди"? Очереди добавляются автоматически
    Вообще формат хранения можно запросто посмотреть в самом редисе.
    Ответ написан
    1 комментарий
  • Как умело работать с Sidekiq и очередями?

    @bmalets
    Коротко про суть - в общем любой сайт должен возвращать страничку на клиент < 3 секунд. То есть рельсы должны быстро обработать запрос и вернуть ответ. Отправка почты или "работа с инстаграм" - довольно сложные для обработки задания, которые замедлят скорость HTTP-ответа. Если "тяжелую" часть работы отдать на sidekiq, то то этой проблемы не возникнет.

    Sidekiq использует Redis для хранения очередей.
    В папке /app/workers/ размещаешь нужные для тебя воркеры. Например:

    # app/workers/hard_worker.rb
    class HardWorker
      include Sidekiq::Worker
    
      def perform(name, count)
        puts 'Doing hard work'
      end
    end

    (метод перформ как точка входа нужен обезательно, название файла и класса должны заканчиваться на 'worker', ну и конечно же include Sidekiq::Worker тоже нужно).

    Когда sidekiq запущен, можешь из любой точки в коде проекта вызывать:

    HardWorker.perform_async('bob', 5)

    Что создаст новое "задание" для sidekiq и добавит его в очередь. Собственно, по мере обработки job-ов sidekiq выполнит поставленое ему задание - достанет его из очереди и воркер его выполнит. Больше воркеров - быстрее обработка, количество воркеров можна задать как аргумент при запуске sidekiq.

    P.S. Скорее всего ты сделал ошибку в воркере или неправильно делаешь вызов. Добавь свой код к вопросу.
    + посмотри рейлскаты на эту тему railscasts.com/episodes/366-sidekiq
    Ответ написан
    5 комментариев
  • Не могу настроить capistrano, что я делаю не так?

    inf
    @inf
    DevOps Engineer
    Инструкция выглядит содержащей много лишней ерунды. Рекомендую читать с Capistrano Setup.
    По минимум для установки capistrano нужно:
    1. Понять какие инструменты нужны для деплоя: rvm, bower, etc ...
    2. Добавить всё что нужно в Gemfile
      # Use Capistrano for deployment
      group :development do
        gem 'capistrano'
        gem 'capistrano-rails'
        gem 'capistrano-bundler'
        gem 'capistrano-rvm'
        gem 'capistrano-passenger'
        gem 'capistrano-bower'
      end
    3. Откапистранить приложение bundle exec cap install
    4. Затребовать все эти модули в Capfile
      require 'capistrano/rvm'
      require 'capistrano/bundler'
      require 'capistrano/rails'
      require 'capistrano/bower'
      require 'capistrano/passenger'

    5. Заполнить минималистский config/deploy.rb
      # config valid only for current version of Capistrano
      lock '3.3.5'
      
      set :application, 'my_awesome_site'
      set :repo_url, 'git@bitbucket.org:username/my_awesome_site.git'
      
      # Default deploy_to directory is /var/www/my_app_name
      set :deploy_to, "/home/user/www/#{fetch(:application)}"
      
      # Default value for :scm is :git
      set :scm, :git

    6. Задать специфичные параметры среды развёртки в config/deploy/production.rb
      role :app, %w{myhosting.ru}
      role :web, %w{myhosting.ru}
      role :db,  %w{myhosting.ru}
      
      
      # Extended Server Syntax
      # ======================
      # This can be used to drop a more detailed server definition into the
      # server list. The second argument is a, or duck-types, Hash and is
      # used to set extended properties on the server.
      
      server 'myhosting.ru', user: 'user', roles: %w{web app db}
      set :rails_env, 'production'
      
      set :rvm_type, :user                     # Defaults to: :auto
      set :rvm_ruby_version, '2.1.4@r4'      # Defaults to: 'default'

    7. Всё. Потом сделать bundle exec cap production deploy:check и долго долго делать bundle exec cap production deploy отлавливая ошибки деплоя и исправляя их :)
    Ответ написан
    2 комментария
  • Nginx redirect from http to https?

    @metajiji
    Согласно официальной документации рекомендуют использовать такую конструкцию:
    server {
            listen 80;
            server_name example.com;
            return 301 https://$server_name$request_uri;  # enforce https
    #        rewrite ^(.*) https://www.example.com$uri permanent;
    }
    Ответ написан
    6 комментариев
  • Пригоден ли Sublime Text 3 для Ruby on Rails?

    @gsmetal
    Я пользуюсь давно и доволен. Мой список основных плагинов:
    1. BeautifyRuby;
    2. Better CoffeeScript;
    3. BracketHighlighter;
    4. Case Conversion;
    5. Rails Migrations List;
    6. SublimeGit;
    7. Ruby Hash Converter (правда я его ставил из гита, оно не работало в ST3);
    8. SublimeERB.

    Но самая часто используемая фича — это, конечно, ctrl+p.
    Ответ написан
    Комментировать
  • Как добавить в избранное на Хабрахабр?

    Sterhel
    @Sterhel
    ee2ad52278f745b89be8769ad3249f42.png
    Ответ написан
    Комментировать
  • Как привязать footer к низу экрана в Twitter Bootstrap?

    Sergei_Erjemin
    @Sergei_Erjemin
    Улыбайся, будь самураем...
    Блин… что за советы… там есть встроенный класс: navbar-fixed-bottom

    <div class="navbar-fixed-bottom row-fluid">
          <div class="navbar-inner">
              <div class="container">
    
    Ответ написан
    7 комментариев
  • Как сделать так чтобы CTRL+C/CTRL+V в Mac OS X работали аналогично cmd+v/cmd+с?

    IGHOR
    @IGHOR
    Qt/C++ DEV/CTO
    В настройках клавиатуры есть назначение модификаторов, и по умолчанию там
    macvswindows.com/images/3/3a/modifiers.png
    поменяйте местами Command и Control и будет вам аналогия Windows Ctrl+C и Ctrl+V
    Ответ написан
    2 комментария