• PHP Simple HTML DOM Parser. Как спарсить вместе с переносом строк?

    @matperez
    вроде как ваш вопрос
    stackoverflow.com/questions/4812691/preserve-line-...
    Ответ написан
    Комментировать
  • Как в PHPStorm изменить задержку автосохранения?

    anton_lazarev
    @anton_lazarev
    TYsJTJx.png
    Ответ написан
    Комментировать
  • Как получить значения ячеек из одного листа в другой Excel?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Надо в режиме редактирования пустой ячейки напечатать знак =, затем перейти на другой лист и указать ячейки, на которые вы хотите ссылаться. В конце нажать Enter.
    Получится что-то типа =Лист2!B7 для ячейки.
    Или =СУММ(Лист2!B5:C8) для диапазона.
    Также можно вызвать окно формулы и, не закрывая его, перейти на другой лист и указать нужные ячейки в качестве параметров.
    Короче, главное, чтобы первым символом шёл знак =
    Ну или вручную набирайте ИмяЛиста! (с восклицательным знаком в конце), а потом координаты на другом листе.
    В гугл документах всё то же самое, только ещё кавычки: ='сотрудники'!F26
    Ответ написан
    1 комментарий
  • Что такое rest api простыми словами?

    HorrorInferno
    @HorrorInferno
    веб-разработчик, бэкэндер
    Если совсем простыми, то некий сервис даёт тебе доступ к своим данным, но не напрямую, а через оболочку, которая назвается REST API. Тебе даётся некий url, по которому ты можешь получить те самые данные. Как правило, при изменении параметров этого url, ты получаешь разные данные.
    Пример:
    Допустим ты берешь в качестве сервиса Википедию. Его специальный url, по которому ты можешь получить данные (его еще называют endpoint) выглядит так: https://en.wikipedia.org/w/api.php
    Допустим нам нужно найти какую-то краткую выдержку из вики по ключевым словам. Первым делом мы идем в документацию и смотрим, какие параметры нам для этого нужны. Для данной задачи нам потребуется url со следующими параметрами:
    https://en.wikipedia.org/w/api.php?action=opensearch&search=<search string>&prop=info&format=<format>&inprop=url


    search string - словосочетание, по которому мы хотим искать.
    format - формат в котором будет выдан ответ (самые популярные это json и xml)

    Пример обращения к WikiAPI:
    https://en.wikipedia.org/w/api.php?action=opensearch&search=microsoft&prop=info&format=json&inprop=url


    Ответ от WikiAPI:
    [
    "microsoft",
    [
    "Microsoft",
    "Microsoft Windows",
    "Microsoft Word",
    "Microsoft Excel",
    "Microsoft Office",
    "Microsoft Visual Studio",
    "Microsoft PowerPoint",
    "Microsoft SQL Server",
    "Microsoft Office 2007",
    "Microsoft Access"
    ],
    [
    "Microsoft Corporation (, abbreviated as MS) is an American multinational technology company with headquarters in Redmond, Washington.",
    "Microsoft Windows, or simply Windows, is a metafamily of graphical operating systems developed, marketed, and sold by Microsoft.",
    "Microsoft Word is a word processor developed by Microsoft. It was first released on October 25, 1983 under the name Multi-Tool Word for Xenix systems.",
    "Microsoft Excel is a spreadsheet developed by Microsoft for Windows, macOS, Android and iOS. It features calculation, graphing tools, pivot tables, and a macro programming language called Visual Basic for Applications.",
    "Microsoft Office is an office suite of applications, servers, and services developed by Microsoft. It was first announced by Bill Gates on 1 August 1988, at COMDEX in Las Vegas.",
    "Microsoft Visual Studio is an integrated development environment (IDE) from Microsoft. It is used to develop computer programs for Microsoft Windows, as well as web sites, web apps, web services and mobile apps.",
    "Microsoft PowerPoint is a presentation program, created by Robert Gaskins and Dennis Austin at a software company named Forethought, Inc.",
    "Microsoft SQL Server is a relational database management system developed by Microsoft. As a database server, it is a software product with the primary function of storing and retrieving data as requested by other software applications—which may run either on the same computer or on another computer across a network (including the Internet).",
    "Microsoft Office 2007 (codenamed Office 12) is a version of Microsoft Office, a family of office suites and productivity software for Windows, developed and published by Microsoft.",
    "Microsoft Access is a database management system (DBMS) from Microsoft that combines the relational Microsoft Jet Database Engine with a graphical user interface and software-development tools."
    ],
    [
    "https://en.wikipedia.org/wiki/Microsoft",
    "https://en.wikipedia.org/wiki/Microsoft_Windows",
    "https://en.wikipedia.org/wiki/Microsoft_Word",
    "https://en.wikipedia.org/wiki/Microsoft_Excel",
    "https://en.wikipedia.org/wiki/Microsoft_Office",
    "https://en.wikipedia.org/wiki/Microsoft_Visual_Studio",
    "https://en.wikipedia.org/wiki/Microsoft_PowerPoint",
    "https://en.wikipedia.org/wiki/Microsoft_SQL_Server",
    "https://en.wikipedia.org/wiki/Microsoft_Office_2007",
    "https://en.wikipedia.org/wiki/Microsoft_Access"
    ]
    ]
    Ответ написан
    2 комментария
  • Как изменить иконки папок, и файлов?

    akaKAIN
    @akaKAIN
    Решается путем установки плагинов.
    https://plugins.jetbrains.com/plugin/10044-atom-ma...
    https://plugins.jetbrains.com/plugin/11058-extra-icons
    и др.
    Ответ написан
    Комментировать
  • Пишу на PhpStorm. Стоит ли переходить на Sublime Text 3?

    DAVIDhaker
    @DAVIDhaker
    Я почти полтора года кодил в Sublime Text. Редактор шикарный, и все такое, но для больших проектов он не подходит. PHPDoc не поддерживается в полной мере, автоформатирования кода толкового нет, инструментов рефакторинга/перестановки кода нет. Автокомплит не особо умен.
    Перейдя на PHPStorm разработка стала более комфортной. Там есть все, что нужно прям из коробки! А чтобы сделать достойную IDE из Sublime Text, нужно долго и упорно ставить гору плагинов, и то не факт, что получится сделать так, чтобы было все удобно.

    Sublime Text - хорош не как IDE, а как редактор.

    Сравните написание кода в Notepad (дэфолтный блокнот Windows, в котором даже нет умной табуляции) и в какой-нибудь хорошей специализированной IDE, почувствуйте разницу и суть и перестаньте задавать глупые вопросы.
    Так же хочу отметить : выбор основного инструмента разработки зависит от опыта и знаний программиста.
    Ответ написан
    Комментировать
  • Как объединить два объекта javascript с заменой значений по ключу, если он существует?

    @paulvoloschuk
    Object.assign
    Линк

    var a = {a:1, b:2, c:3};
    var b = {a:2, b:2};
    
    console.log(Object.assign(a,b));   // result Object {a: 2, b: 2, c: 3}
    Ответ написан
    Комментировать
  • Проект под NodeJS для изучения возможностей платформы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Напишите свой http фреймворк поверх expressjs, сейчас это модно. Еще круче - заюзать вместо Postgresql - монгу. Самый топчик - еще GraphQL прикрутить.
    Ответ написан
    4 комментария
  • Проект под NodeJS для изучения возможностей платформы?

    @SEOVirus
    Лучше всего делать то, что вы сможете потом продать или заюзать где-то эти наработки, чтобы... ну... снова продать :)) Не теряйте время зря, монетизируйте даже момент обучения. Подумайте, какой опыт у вас вообще позади, что там было, в чём вы умели зарабатывать деньги - в том направлении и идите с новыми технологиями, мб они лучше решат ваши задачи. Ну и продайте, да :) Хуже всего когда ты отклоняешься в новую область и ты там никто, полный ноль, вот это печально. Пытайтесь захватить ваш прошлый опыт, тогда новые технологии усилят вас, а иначе может оказаться так, что стартанёте с нулём.
    Ответ написан
    1 комментарий
  • Как через API Facebook опубликовать запись на стене группы?

    @vista1x
    1) Для начала создаешь приложение. Сделать это можно тут https://developers.facebook.com
    Важные моменты: в настройках необходимо указать email и активировать приложение (раздел app review)
    2) Нужно получить ключ для работы с апи. Идешь сюда https://developers.facebook.com/tools/explorer, в правом верхнем углу жмешь Get Token -> Get Page Access Token, даешь разрешения на запрос прав доступа. Жмешь снова Get Token и выбираешь свою группу, потом жмешь Request publish_pages и снова соглашаешься. Тут мы получили временный ключ. Нужно обменять его на постоянный (ну как постоянный.. действовать он будет 60 дней, далее - нужно будет снова получать).
    Выполняешь такой запрос (в этом же приложении)
    oauth/access_token?grant_type=fb_exchange_token&client_id=[ID_ПРИЛОЖЕНИЯ]&client_secret=[КЛЮЧ_ПРИЛОЖЕНИЯ]&fb_exchange_token=[ТОКЕН]

    То, что в квадратных скобках, естественно, подставляешь своё. Токен берешь из поля "маркер доступа". Выполняешь запрос, в ответе будет твой токен. Ура.

    Теперь то, что касается программирования:
    1) Берешь Facebook SDK https://github.com/facebook/facebook-php-sdk-v4/ (ставить конечно лучше через композер, но если не имеешь представления "что это и как с этим работать", то просто скачиваешь и инклудишь себе автозагрузчик, должно работать.
    2) Сам постинг.
    $app_id = ''; // ид приложения. берешь в настройках приложения (или копируешь с адресной строки)
    $app_secret = ''; // ключ приложения. берешь в настройках приложения
    $access_token = ''; // токен, который мы получили
    $page_id = ''; // id группы
    
    $fb = new Facebook\Facebook(array(
        'app_id' => $app_id,
        'app_secret' => $app_secret,
        'default_graph_version' => 'v2.2',
    ));
    $fb->setDefaultAccessToken($access_token);
    
    // а тут мы непосредственно постим запись на стену. 
    // в этом примере запись представляет собой картинку + текст
    $data = [
        'message' => 'Текст',
        'source' => $fb->fileToUpload('/полный/путь/к/картинке'),
    ];
    $batch = [
        'photo' => $fb->request('POST', "/{$page_id}/photos", $data),
    ];
    $responses = $fb->sendBatchRequest($batch);


    Если пост не уходит, смотришь переменную $responses - в ней есть ответ сервера.
    Ну и документацию не стоит обходить стороной https://developers.facebook.com/docs/php/gettingst... Тут, кстати, описана установка SDK поподробнее
    Ответ написан
    6 комментариев
  • Возможно открыть ссылку в новом браузере?

    @alex999921
    Думаю нет, js не может управлять запуском программ
    Ответ написан
    Комментировать
  • Какой выбрать монитор для кодинга в 2019?

    @eugene159
    Я рекомендую выбирать через Яндекс Маркет (или другие похожие сайты). Там очень хорошая возможность фильтрации, а также можно почитать отзывы от других людей - того, кто уже купил монитор и протестировал его. Это важно, т.к. есть много нюансов, которые можно заметить только во время эксплуатации. Например, монитор может быстро греться. У него, спустя некоторое время, могут начать появляться битые пиксели / остаточные явления. У него могут быть проблемы с настройкой цвета (и после покупки нужно будет сидеть и настраивать его, чтобы было более-менее естественно). И это невозможно проверить, пока не поработаешь за ним.

    1. То есть, первый критерий - много хороших отзывов.

    2. Диагональ. Имхо, чем больше, тем лучше, ведь текст (код, документация, ТЗ, переписка с коллегами / клиентами) можно будет сделать крупнее. А чем крупнее текст, тем меньше устают глаза, тем дальше можно сесть от монитора (но не обязательно).

    Я как-то читал комменты к одному большому (больше 32 дюймов) монитору на Яндекс Маркете. Там один чел написал, что когда работает за ним, еще и разминает шею и глаза (что хорошо для здоровья).

    Но здесь есть важный момент. Мониторы с диагональю больше 32 дюймов - редкость. Не в каждом магазине они есть (Чтобы прийти и посмотреть качество сборки). И как правило, они все с какими-то недостатками (Они еще несовершенны. Да и это не совсем стандартный размер). Выбора среди мониторов с такой диагональю мало.
    Кроме того, если диагональ такая большая и без изгиба, то за ним может быть неудобно работать, на нем могут быть блики.

    Я думаю, что идеально было бы взять 2 безрамочных 32 дюймовых монитора и кронштейны для них - чтобы можно было наклонить их так, как захочется (вместо изогнутости). Но у меня есть некоторые проблемы со зрением, которые не корректируются очками. Возможно, вам бы и одного 32 дюймового хватило. Или двух, но меньшей диагонали.

    У 34 дюймового монитора часто высота меньше, чем у 32. По-моему, это не очень хорошо, особенно для web'а. На некоторых сайтах шапка фиксированная. И если у вас сильно увеличен интерфейс (или сам сайт), то эта шапка может занимать немалую часть высоты монитора. Также на некоторых сайтах есть меню, которое по задумке программиста выскакивает на пол экрана по высоте. У вас оно будет больше.

    3. Обязательно с Flicker-Free (это технология защиты от ШИМ'а - мерцания, от которого устают глаза).

    4. Матрица. Коротко напишу об особенностях каждого типа матриц.
    • IPS - самые большие углы обзора. Лучше всего подойдет, если вы решили взять монитор с большой диагональю и без изгиба.
    • VA - черный цвет. Имхо, такие мониторы важнее людям, работающим с видео или с изображениями. С другой стороны, возможно, вы извлечете из него плюс, если любите темные темы в IDE.
    • TN - скорость отклика. Но углы обзора у мониторов с данным типом матриц хуже всего. Я думаю, что это самый плохой вариант для работы. Обычно такие мониторы берут для игр.

    Конечно, все зависит от цены монитора. Возможно, у дорогого VA или TN вы даже не заметите разницы в углах обзора со средненьким или дешевым IPS. Но зачем переплачивать за это?
    Прикладываю картинку из интернета, на которой сравниваются углы обзора разных матриц.
    5dadff7f91a04441078419.jpeg
    5. Если говорим про усталость глаз, то стоит упомянуть функцию подавления синего цвета. Имхо, это ненужная функция. В Windows есть "Ночной свет" - по сути, то же самое, только удобнее - в любой момент можно отключить / настроить щелчком мыши, не надо лезть за монитор и перебирать на нем кнопки.
    Если вы пользуетесь другой ОС, то можно найти программу с таким же функционалом (например, f.lux).

    6. Разрешение. Не советую гнаться за большим разрешением. Чем больше разрешение, тем меньше пиксели. И тем меньше текст, который вы читаете.
    В Windows есть масштабирование. Но далеко не все приложения корректно масштабируются. В некоторых все очень мыльное, в некоторых текст увеличивается, а input для него - нет (прикладываю скриншот из программы Embarcadero Rad Studio, увеличение в Windows 150%).
    5dae000c023a7560386043.png
    Более того, чем больше разрешение, тем больше требования к самому компьютеру (особенно к видеокарте).

    Касательно ppi, здесь все очень индивидуально.
    У вас есть сейчас какой-то монитор, правильно? Если вам комфортно за ним, то берите новый монитор с таким же ppi. Если нет, то сходите к другу, у которого монитор с другим ppi и попробуйте поработать.
    Я работаю с увеличенным интерфейсом в 150%, у меня 93 ppi, я не замечаю размытости шрифта, мне комфортно. В то же время, у меня есть друзья, которые с таким же ppi работают со 100% увеличением, им все нравится.
    Ответ написан
  • Насколько удобно Docker интегрирован в PhpStorm?

    romash
    @romash
    web-разработчик
    Про xdebug могу сказать, что вы скорее всего что-то не так готовите. Важно понимать, что сам xdebug является по сути клиентом, который отправляет данные дебаг-серверу (в данном случае его поднимает PHPStorm). Исходя из этого можно с уверенностью заявить, что в docker-compose вообще ничего, связанного с дебагом быть не должно (максимум сюда можно отнести проброс папки vendor, если вам нужно в дебаге проходить по подгруженным композером библиотекам).

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

    Я ставлю в конфиге xdebug.remote_connect_back=on, тогда не нужно указывать xdebug.remote_host и он ищет сервер на ip, с которого открыли страницу. Правда так не подебажишь cli, но ip-шник хоста тоже можно как-то достать, можете погуглить, если очень хочется.

    Допустим, у вас в xdebug.ini написано следующее:
    zend_extension=xdebug.so
    xdebug.remote_enable=on
    xdebug.remote_autostart=on
    xdebug.remote_connect_back=on
    xdebug.remote_port=9999


    Тогда в PHPStorm достаточно:
    Settings > Languages & Frameworks > PHP > Debug
    В разделе Xdebug указать порт 9999 и поставить галку на Can accept external connections.
    В самом низу, в Advanced settings убрать галку с Notify if debug session was finished without being paused

    Settings > Languages & Frameworks > PHP > Servers
    Добавить сервер:
    Name и Host указать из server_name nginx (с другими прокси не настраивал)
    Port тоже из конфига nginx, а не тот, что пробрасывается наружу!
    Эти данные php берет от своей прокси внутри контейнера и передаёт при поднятии сессии дебага, так что, если неправильно указать, Path mapping не заработает.
    Галочка на Use path mappings и поставить в соответствие папке проекта абсолютный путь внутри контейнера

    Также на всякий случай и для сравнения инструкция для VSCode:
    Установить расширение PHP Debug и добавить в конфигурацию дебага следующее
    {
        "name": "Listen for XDebug in Docker",
        "type": "php",
        "request": "launch",
        "port": 9999,
        "pathMappings": {
            "Абсолютный путь к папке проекта в контейнере": "${workspaceRoot}"
        }
    }


    Это дело у меня прекрасно работает и из под винды со старой docker-machine, и "огромным бубном" я бы это не называл...
    Ответ написан
    Комментировать
  • Как правильно сделать перенос строки на PHP?

    Что значит красиво?

    Можно просто взять
    echo implode(PHP_EOL, $randArray);
    И каждый элемент выведется с новой строки (между ними будет перенос строки).

    Для верстки понятно, что работать не будет, там уже используйте
    echo implode('<br>', $randArray);

    Можно выводить в цикле
    foreach($randArray as $item) {
      echo $item;
    }


    2. echo не работает для массивов, выводится "Array"
    Ответ написан
    4 комментария
  • Как правильно организовать роутинг на node?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Чтобы сделать хорошо, нужно сделать без express, например, аналог Вашего кода:

    var http = require('http');
    
    var me = { name: 'jura', age: 22 };
    
    var routing = {
      '/': 'welcome to homepage',
      '/user': me,
      '/user/name': function() { return me.name; },
      '/user/age': function() { return me.age; }
    };
    
    var types = {
      object: function(o) { return JSON.stringify(o); },
      string: function(s) { return s; },
      undefined: function() { return 'not found'; },
      function: function(fn, req, res) { return fn(req, res) + ''; },
    };
    
    http.createServer(function (req, res) {
      var data = routing[req.url],
          result = types[typeof(data)](data, req, res);
      res.end(result);
    }).listen(80);


    И более универсальный вариант с параметрами:

    var http = require('http');
    
    var me = { name: 'jura', age: 22 };
    
    var routing = {
      '/': 'welcome to homepage',
      '/user': me,
      '/user/name': function() { return me.name; },
      '/user/age': function() { return me.age; },
      '/user/*': function(client, par) { return 'parameter=' + par[0]; }
    };
    
    var types = {
      object: function(o) { return JSON.stringify(o); },
      string: function(s) { return s; },
      number: function(n) { return n + ''; },
      undefined: function() { return 'not found'; },
      function: function(fn, par, client) { return fn(client, par); }
    };
    
    var matching = [];
    for (key in routing) {
      if (key.indexOf('*') !== -1) {
        var rx = new RegExp(key.replace('*', '(.*)'));
        matching.push([rx, routing[key]]);
        delete routing[key];
      }
    }
    
    function router(client) {
      var rx, par, route = routing[client.req.url];
      if (route === undefined) {
        for (var i = 0, len = matching.length; i < len; i++) {
          rx = matching[i];
          par = client.req.url.match(rx[0]);
          if (par) {
            par.shift();
            route = rx[1];
            break;
          }
        }
      }
      var renderer = types[typeof(route)];
      return renderer(route, par, client);
    }
    
    http.createServer(function (req, res) {
      res.end(router({ req: req, res: res }) + '');
    }).listen(80);
    Ответ написан
    3 комментария
  • Умеет ли phpstorm делать поиск/замену при массовом поиске в файлах?

    @SilverSlice
    Edit - Find - Repalce in path
    Ответ написан
    Комментировать
  • Особенности сравнение дат в php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    string date ( string $format [, int $timestamp = time() ] )

    Поскольку вы неправильно используете функцию date(), сравниваются просто строки. Строки сравниваются посимвольно. Ноль меньше, чем два, поэтому сравнение немедленно возвращает true.

    Правильно сравнивать даты так:
    $first = DateTime::createFromFormat('d.m.Y', '01.01.2016');
    $second = DateTime::createFromFormat('d.m.Y', '25.12.2015');
    var_dump($first < $second);

    Или так:
    var_dump(strtotime('01.01.2016') < strtotime('25.12.2015'));
    Ответ написан
    Комментировать
  • Как работают тома в Docker?

    @askhat
    Не считая хост директорий, есть 2 способа делать персистанс в докере: (1) дата-контейнеры и (2) вольюмы. На примере композа, рассмотрим оба варианта.

    1. Дата-контейнеры
    Самый старый и, на мой взгляд, костыльный способ. Заключается в том, что данные будут сохраняться в контейнере в котором не запущен процесс, и по факту контейнер остановлен. В качестве такого контейнера можно использовать «основной» имедж или использовать специальный, как tianon/true.
    docker-compose.yml
    version: '2'
    services:
      web:
        image: 'nginx'
        volumes_from:
          - 'data'
      data:
        build: './public_html'

    public_html/Dockerfile
    FROM nginx
    ADD index.html /var/www/public_html
    CMD /bin/true

    Обратите внимание на директиву CMD в Докерфайле дата-контейнера. Не смотря на то что исходным имеджем является nginx, как и в сервисе web, команда /bin/true не запустит процесс, а лишь сигнализирует докеру об успешной сборке контейнера. docker-compose ps покажет что дата-контейнер иммет статус типа Exit..., и это именно то состояние которого мы ищем для этого контейнера.
    Прим.: для tianon/true директиву CMD указывать не обязательно, однако придётся указать директиву VOLUME, так как в отличии от основного имеджа, она не указана в исходном Докерфайле.

    2. Вольюмы
    Или, как их называют официально, именованные вольюмы. Более очевидный способ работать с персистансом.
    docker-compose.yml
    version: '2'
    services:
      web:
        image: 'nginx'
        volumes:
          - 'web_data:/var/www/public_html'
    volumes:
      web_data:

    Такая конфигурация автоматически создаст вольюм с именем web_data и замапит его на папку /var/www/public_html внутри контейнера web, при старте композа. Обратите внимание, что в этом примере вольюм обозначен как ключ без значений, это валидный ямл синтаксис, и, в данном случае, означает что композ сфолбэчит опции вольюма на дефолтные, обязательной из которых является driver: 'default'. В случае если вы поднимаете композ локально или на удалённой докер машине, дефолтный драйвер вам подойдёт, если только вы не знаете что нет.
    Прим.: из драйверов, которые представляют особый интерес, во всяком случае мне, драйвер для NFS и DigitalOcean Block Storage.

    Дефолтное поведение докера — не удалять ничего пока пользователь не попросит этого эксплицитно, это распространяется как на дата-контейнеры, так и на вольюмы.
    Ответ написан
    2 комментария