• Как прибавить число к названию переменой?

    Lynn
    @Lynn
    nginx, js, css
    Не надо этого хотеть
    Ответ написан
    Комментировать
  • Наилучшая структура Django-проекта?

    @rodion4dev
    Отвечая на вопрос, увы, таковой нету. Вы должны сами для себя решить и не спустя три месяца.

    Но если желаете более предметно, то вот Вам мои ощущения по поводу Вашей структуры, к которой вы пришли...

    Первое, что бросается в глаза - настройки. Да, Вы следуете идеологии Django, которая неявно шепчет всем нам как их компоновать: но это небезопасно. Почему в настройках у вас модули, два из которых отражает какое-то окружение (разработка, боевое и что-то общее между тем и тем)? Исходя из Вашей структуры сразу витает в воздухе вопрос: "А почему настройки боевого окружения вдруг должны быть в репозитории? А как быть с секретным ключом? А безопасно ли это?". Следующий логичный вопрос удобства: почему я, как разработчик, вдруг должен заставлять своих DevOps'ов компоновать и поддерживать за меня настройки в виде файлов (модулей)? Это ведь исполняемый файл и там бесчисленное количество возможностей; более того, это не безопасно. Сейчас бОльшая часть проектов поднимается средствами docker-compose, куберов и прочих прелестей: дико неудобно собирать и поддерживать настройки в виде файлов для каждого запускаемого контейнера (у нас ведь есть переменные окружения). Надеюсь, здесь понятен основной посыл: безопасность и удобство использования.

    (здесь я не сразу понял, что это именно проект, а не приложение; подробности в комментариях)
    Едем дальше - core. Почему именно такое название? Понятное дело, ядро, Django в своих исходниках делает и всё такое... Но зайдя в такой проект, сразу ли будет понятно за что отвечает это приложение? Нет. В общем-то даже в документации к Django в quick start название приложения опирается на её главную бизнес-потребность.

    Переходим к следующему: папка apps с приложениями. Для начала вроде всё удобно и логично: есть ядро проекта, а есть дополнения к нему а значит их нужно как-то отделить от этого ядра. А что делать если ядро будет всегда одно в проекте? А что делать если дополнительных приложений будет всего одно? А зачем тогда ему целая папка (приложению) если само приложение - и есть папка (или модуль в нашем случае)? Так оставлять или менять уровень вложенности? На самом деле что core, что appN - являются такими же Django приложениями (одинаковыми), а значит и уровень абстракции у них - один; один уровень абстракции говорит нам о том, что и appN нужно класть где-то рядом с core (здесь должно быть другое название как и писал). Часто я вижу в проектах, что core так и остаётся одой единственной core папкой без дальнейшей расширяемости. Вывод - преждевременная оптимизация - вещь нелогичная по сути своей.

    Папка template. Здесь я всегда доверяюсь Django и кладу шаблоны в папку приложения (делая ещё две папки - templates, а в ней - папку с названием приложения). Здесь, думаю, подойдёт правило класть то, что используется, ближе к тому месту, где это используется (но с поправкой на рекоммендации оф. документации Django).

    Папка static. В среде отладки её быть в принципе быть не должно; обычно вся статика всегда в первую очередь связана с приложением, куда мы её и стараемся класть (как с папкой templates), что является и советом из Django документации.

    Папка models. Вынося её куда-то в отличное от папки приложения место, мы сразу же забиваем на автономность самого приложения; приложение сразу же становится зависимым от внешнего кода (чего нужно избегать). Обычно каждое приложение имеет свои модели и не зависит от моделей другого приложения.

    venv. Актуально только на компьютере каждого разработчика; по-моему это неудачное решение класть платформо-зависимые файлы под контроль версий.
    Ответ написан
    5 комментариев
  • Как найти отсутствующие элементы между двумя массивами?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ответ написан
    Комментировать
  • Как найти отсутствующие элементы между двумя массивами?

    @alekcena
    Нелинейный наставник
    Да начнётся код варс. (Любая длина, Любое кол-во массивов. Любые элементы?)
    function result(...arg){
        var mapka =  new Map();
        arg.forEach(arr=>{
            arr.forEach(item=>{
                if(mapka.has(item)){
                    let value = mapka.get(item) +1;
                    mapka.set(item,value) ;
                }else{
                    mapka.set(item,1);
                }
            })
        });
        return Array.from(mapka).reduce((acc,item) =>item[1] == 1 ?[...acc,item[0]] : [...acc],[]);
    }
    var a = [1, 2, 3, 4, 5, 6, 7];
    var b = [1, 2, 3, 4, 5, 6];
    result(a,b);// [7];
    Ответ написан
    1 комментарий
  • Парсинг с авторизацией на nodejs?

    @writer_2159
    Жуть... просто жуть...
    реализовывал что-то подобное.

    вкратце:
    делаешь запрос на авторизацию, получаешь куки, запоминаешь их и дальше по страницам с передачей этих кук

    fetchQueryAuth = await fetch(
        _url, 
        {
            "method": "GET",
        });
    
    const cookie = fetchQueryAuth.headers.raw()['set-cookie']
    Ответ написан
    1 комментарий
  • Как реализовать межсайтовую авторизацию (SSO) как у гугла или хабра?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Идём в Гугл и читаем про то как работает OAuth, OpenID Connect, что такое Identity Server, Resource Service, User Pool а вдогонку ещё и Federation. Чтобы проще всего разобраться в теме можно открыть бесплатный как в Auth0 и посмотреть как ребята это делают
    Ответ написан
    Комментировать
  • Как организовать потоковую передачу видео в моем случае?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Flask
    Седой и строгий
    С использованием Flask скорее всего никак, для потоковой передачи нужен асинхронный фреймворк.
    Ответ написан
    1 комментарий
  • Как работает парсинг сторонних ссылок?

    @robprane
    Для общего случая решение - парсить meta property="og:image". Здесь сайты содержат ссылку на изображение, которое должно представлять этот сайт.
    Для частных случаев, когда этого тега нет, как у YouTube, надо искать отдельные решения, одно из них уже написал Zettabyte.
    Ответ написан
    Комментировать
  • Как работает парсинг сторонних ссылок?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Думаю, что на разных сайтах реализация различается, но вероятнее всего, подтягиваются метаданные конкретного ролика - что-то наподобие Open Graph protocol (у Ютьюба наверняка есть что-то подобное, начните с просмотра кода страницы), они парсятся, выбираются нужные. Их отображение - как вам понравится.

    Картинки - по принципу
    https://img.youtube.com/vi/<youtube_video_id>/[0-3].jpg

    ID - понятно, 0-3 - варианты размеров (выберите нужный).
    Вот для вашего ролика: https://img.youtube.com/vi/bhUAIrV-PIc/0.jpg

    Либо
    https://img.youtube.com/vi/<youtube_video_id>/default.jpg

    Вместо default.jpg можно подставлять mqdefault.jpg, sddefault.jpg, hqdefault.jpg и maxresdefault.jpg. Это тоже разное качество, но не у всех роликов есть все варианты.

    Также загляните в API: https://developers.google.com/youtube/v3/
    Но сейчас, по-моему, нужно получать ключ, просто так им не побалуешься.

    Кстати, для 2-й версии API находится вот такой код:
    Get Youtube video details with JavaScript
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.1.min.js"></script>
     <script type="text/javascript">
     var vidid = "bhUAIrV-PIc";
     function getYouTubeInfo() {
     $.ajax({
     url: "http://gdata.youtube.com/feeds/api/videos/"+vidid+"?v=2&alt=json&orderby=published&prettyprint=true",
     dataType: "jsonp",
     success: function (data) {parseresults(data)}
     });
     }
     function parseresults(data) {
     var ytvtit = data.entry.title.$t;
     var ytvcat = data.entry.media$group.media$category[0].label;
     var ytvpub = data.entry.published.$t.substr( 0, 10 );
     var ytvath = data.entry.author[0].name.$t;
     var ytvatl = data.entry.media$group.media$credit[0].$t;
     var ytvdur = data.entry.media$group.yt$duration.seconds;
     var ytvrta = data.entry.gd$rating.average.toFixed(1);
     var ytvrtm = data.entry.gd$rating.max;
     var ytvrtc = data.entry.gd$rating.numRaters;
     var ytvlks = data.entry.yt$rating.numLikes;
     var ytvdlk = data.entry.yt$rating.numDislikes;
     var ytvvwc = data.entry.yt$statistics.viewCount;
     var ytvfav = data.entry.yt$statistics.favoriteCount;
     var ytvcmc = data.entry.gd$comments.gd$feedLink.countHint;
     var ytvdes = data.entry.media$group.media$description.$t;
     var ytvurl = 'https://www.youtube.com/watch?v='+vidid;
     var ytvtmb0 = data.entry.media$group.media$thumbnail[0].url;
     $('#ytvtitle').html(ytvtit);
     $('#ytvcatgry').html(ytvcat);
     $('#ytvpublish').html(ytvpub);
     $('#ytvauthr').html('ytvath');
     $('#ytvduration').html(ytvdur + ' Seconds' );
     $('#ytvrtngavrg').html(ytvrta);
     $('#ytvrtngmax').html(ytvrtm);
     $('#ytvrtngcnt').html(ytvrtc);
     $('#ytvlks').html(ytvlks);
     $('#ytvdislks').html(ytvdlk);
     $('#ytvviewcount').html(ytvvwc);
     $('#ytvfavcount').html(ytvfav);
     $('#ytvthumb').html('
    ');
     $('#ytvcomment').html(ytvcmc);
     $('#ytvdescription').html(ytvdes);
     $('#ytvurl').html('Watch on YouTube');
     $('#ytvply').html('
    
    
    
    ');
     }
     $(document).ready(function () {
     getYouTubeInfo();
     });
     </script>
    Ответ написан
    Комментировать
  • Как работает парсинг сторонних ссылок?

    dima9595
    @dima9595
    Junior PHP
    Чисто моя теория:
    1. При вставке ссылки (http/https) отрабатывает скрипт. Скрипт парсит данную ссылку.
    2. Если ссылка ведёт к какому-нибудь популярному сайту, например, тот же ютуб, то он получает его идентификатор видео.
    3. По API или ещё как-то он получает это видео и вставляет iframe какой-нибудь (у ютуба вроде есть свой iframe, точно не помню).
    4. После этот Iframe вставляется чуть ниже сообщения, как на скриншоте.
    Вроде всё. Есть конечно проблемы - как, например, сохранять такое же форматирование, но это другая уже тема.
    Ответ написан
    Комментировать
  • Как решить данную проблему?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    document.body.style.backgroundColor=theme_config['--back-color']
    Ответ написан
    1 комментарий
  • Как решить эту проблему с реактивностью объекта в vuex?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Не уверен. Но кажется, нужно копировать объект
    post_data: JSON.parse(JSON.stringify(this.$store.getters.full_view_data))
    Ответ написан
    5 комментариев
  • Целесообразно хранить посты пользователей в json?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    учитывая что json легче передавать на фронтэнд

    Json служит как раз для передачи информации, но не для хранения(если это не конфиг какой-то)
    Ответ написан
    8 комментариев
  • Целесообразно хранить посты пользователей в json?

    vabka
    @vabka
    Токсичный шарпист
    В том виде, в котором вы предлагаете - нет. Тк в чём смысл тогда в SQL-базе, если можно всё в файликах?
    Посмотрите на MongoDB - мне кажется, что это то что вам нужно.
    Ещё как вариант - можете создать отдельные таблички для разных аттачей к посту и сохранять там какие-нибудь идентификаторы картинок/видео во внешней системе (файлы тоже внешняя система).
    Но если у вас не планируется какие-то отношений между сущностями, то mongo - хороший выбор, тем более что там уже есть готовое решение для хранения файлов - GridFS
    Ответ написан
    1 комментарий
  • Как решить данную проблему?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Функция require, очевидно, исполняется* во время создания(декларации) экспортируемого объекта, задолго до того как этот объект попадёт в Vue и превратится в Vue-компонент.
    Функция require, очевидно, исполняется в глобальном контексте, в котором недоступен (какой-либо) this.

    Нормальное решение вашей проблемы выглядит примерно так.
    <template>
      <div>
        <component :is="SvgView" class="sp-svg-styles"/>
      </div>
    </template>
    
    <script>
    export default{
      props:['name'],
      computed: {
        SvgView() {
          return require('./../Icons/'+this.name+'.svg');
        }
      }
    }
    </script>


    *require на самом деле работает на этапе компиляции, подготавливая и загружая в бандл все файлы по маске ./../Icons/*.svg, а на этапе исполнения заменяется внутренней функцией, возвращающей значение по имени.
    Ответ написан
    1 комментарий