Профиль пользователя заблокирован сроком с 16 октября 2023 г. и навсегда по причине: систематические нарушения правил сервиса
  • С чего начинать?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    кафедра радиофизики. ну извиняйте нагрузят вас там достойно, но жаловаться не будете
    Ответ написан
    Комментировать
  • Как защитить видео на сайте?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Был такой проект. По факту сделали так. Купили топовый комп. И через ffmpeg накладывали ватермарк. То есть если появляется в сети то баним пользователя. Рассматривали аренду серваков что бы в онлайне делать но оказалось дорого.
    Фулл hd рендерилось со скоростью 600 фпс. То есть группа из 20 человек получала 10 минутный ролик через 10 минут. Минус манипуляции секретарши. В принципе если интересно могу повторить. Реализация будет следующая: в админку заливаете ролик, в интерфейсе заливаете файл, по мере готовности людям рассылается ссылки на их персональные ролики. Что важно цифромолотилка стоит у вас дома. И вы не платите кучу денег за аренду. Как только файл готов он заливается на хостинг
    Ответ написан
    1 комментарий
  • Как отслеживать включение и выключение компьютеров в сети?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Я бы это написал на powershell
    Перебор в цикле списка компов и запись результата пингов в бд. Второй вариант написать на C# и писать в туже бд. Запуск по планировщику допустим раз в 5 минут.
    Ну или хардкорный вариант накатить политику рабочих часов когда можно логинится через ад
    Ответ написан
    Комментировать
  • Как передать координаты GPS через ссылку?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    POST https://site.com/api/geolog/

    payload

    {
    "longitude": 57,55
    "latitude": 32,765
    }


    либо https://site.com/api/geolog/?lon=57,55&lat=32,765
    Ответ написан
    Комментировать
  • Почему не меняется класс при скролле?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    а вы не чего не присваиваете посмотрите код
    window.addEventListener("scroll", (function(t) {
                    var e = document.documentElement.scrollTop
                      , r = (e / 3).toFixed(2)
                      , a = document.querySelector(".splash");
                    null !== a && (a.style.backgroundPosition = "0px -" + r + "px");
                    var n = document.querySelector("#home > .navbar");
                    e > 50 ? n.classList.remove("is-transparent") : n.classList.add("is-transparent")
                }
                ));
    Ответ написан
    Комментировать
  • Как организовать сервис управления картинками?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Есть опыт по приземлению облачного сервиса на физические сервера.
    Общий смысл покупка физического сервера с гигабитными портами и анлим трафиком.
    Сервер самый дешевый, много мощи не нужно, плюс обработчик который генерирует превьюшки и чистит мусор по расписанию, как сами понимаете это все конфигурируется. И еще распределение по географии с миграцией картинок по категориям
    Ответ написан
  • Нужно ли бекендеру знания основ JS и Фронт фрейм?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    CORS
    куки и их типы
    версии браузеров и их особенности, то есть в какой то момент браузер может изменить поведение и вы получите сложно уловимую ошибку
    REST
    разные RPC протоколы
    некоторые гадские баги браузеров, привет сафари
    дурацкие ошибки вашего сервера вот такие например https://qna.habr.com/q/1187844
    Ответ написан
    Комментировать
  • React/vue и cms?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Вот пример роутера для vue
    // Imports
    import Vue from 'vue'
    import Router from 'vue-router'
    import { authGuard, logoutHabdler } from '@/helpers'
    
    Vue.use(Router)
    
    const router = new Router({
      mode: 'history',
      base: process.env.BASE_URL,
      scrollBehavior: (to, from, savedPosition) => {
        if (to.hash) return { selector: to.hash }
        if (savedPosition) return savedPosition
    
        return { x: 0, y: 0 }
      },
      routes: [
        {
          path: '/logout',
          beforeEnter: logoutHabdler,
        },
        {
          path: '/',
          component: () => import('@/layouts/home/Index.vue'),
          children: [
            {
              path: '',
              name: 'Home',
              component: () => import('@/views/home/Index.vue'),
            },
    
            {
              path: 'about',
              name: 'About',
              component: () => import('@/views/about/Index.vue'),
            },
            {
              path: 'description',
              name: 'Description',
              component: () => import('@/views/description/Index.vue'),
            },
            {
              path: 'price',
              name: 'Price',
              component: () => import('@/views/price/Index.vue'),
            },
            {
              path: 'login',
              name: 'Login',
              component: () => import('@/views/login/Index.vue'),
            },
            {
              path: 'legal',
              name: 'Legal',
              component: () => import('@/views/home/Legal.vue'),
            },
            {
              path: 'eula',
              name: 'Eula',
              component: () => import('@/views/home/Eula.vue'),
            },
            {
              path: 'condition',
              name: 'Condition',
              component: () => import('@/views/home/Condition.vue'),
            },
            {
              path: 'disclosure/:id?',
              name: 'Disclosure',
              component: () => import('@/views/home/Disclosure.vue'),
            },
            {
              path: 'userlist/:id?',
              name: 'UserList',
              component: () => import('@/views/home/UserList.vue'),
            },
            {
              path: 'open/:id?',
              name: 'SuccessorList',
              component: () => import('@/views/home/SuccessorList.vue'),
            },
          ],
        },
        {
          path: '/user',
          component: () => import('@/layouts/user/Index.vue'),
          beforeEnter: authGuard,
          children: [
            {
              path: '',
              name: 'UserHome',
              component: () => import('@/views/user/Index.vue'),
            },
            {
              path: 'store/:id?',
              name: 'UserStore',
              component: () => import('@/views/user/Store.vue'),
            },
            {
              path: 'faq',
              name: 'UserFaq',
              component: () => import('@/views/user/Faq.vue'),
            },
            {
              path: 'messages',
              name: 'UserMessages',
              component: () => import('@/views/user/Messages.vue'),
            },
            {
              path: 'contacts',
              name: 'UserContacts',
              component: () => import('@/views/user/Contacts.vue'),
            },
            {
              path: 'profile',
              name: 'UserProfile',
              component: () => import('@/views/user/Profile.vue'),
            },
            {
              path: 'payment/:id',
              name: 'Payment',
              component: () => import('@/views/user/Payment.vue'),
            },
          ],
        },
        {
          path: '*',
          component: () => import('@/layouts/user/Page404.vue'),
          children: [
            {
              path: '*',
              name: 'Page404',
              component: () => import('@/views/user/Page404.vue'),
            },
           ],
      },
      ],
    })
    
    export default router


    Вот конкретно этот кусок обрабатывает пути /user/store/какойто_идентификатор
    {
              path: 'store/:id?',
              name: 'UserStore',
              component: () => import('@/views/user/Store.vue'),
            },


    Соответственно вы можете создать путь для ваших страниц

    далее
    vue.config.js

    const path = require('path')
    const PrerenderSPAPlugin = require('@dreysolano/prerender-spa-plugin')
    const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
    const isDev = process.env.NODE_ENV !== 'production'
    const plugins = isDev
      ? []
      : [
          new PrerenderSPAPlugin({
            // Required - The path to the webpack-outputted app to prerender.
            staticDir: path.join(__dirname, 'dist'),
    
            // Optional - The path your rendered app should be output to.
            // (Defaults to staticDir.)
            // outputDir: path.join(__dirname, 'prerendered'),
    
            // Optional - The location of index.html
            indexPath: path.join(__dirname, 'dist', 'index.html'),
    
            // Required - Routes to render.
            // Генерируйте пути из бд и билдите приложение какким нибудь скриптом на основе базы данных
            routes: ['/', '/about', '/description', '/price', '/about'],
    
            // Optional - Allows you to customize the HTML and output path before
            // writing the rendered contents to a file.
            // renderedRoute can be modified and it or an equivelant should be returned.
            // renderedRoute format:
            // {
            //   route: String, // Where the output file will end up (relative to outputDir)
            //   originalRoute: String, // The route that was passed into the renderer, before redirects.
            //   html: String, // The rendered HTML for this route.
            //   outputPath: String // The path the rendered HTML will be written to.
            // }
            postProcess (renderedRoute) {
              // Ignore any redirects.
              renderedRoute.route = renderedRoute.originalRoute
              // Basic whitespace removal. (Don't use this in production.)
              // renderedRoute.html = renderedRoute.html.split(/>[\s]+</gim).join('><');
              // Remove /index.html from the output path if the dir name ends with a .html file extension.
              // For example: /dist/dir/special.html/index.html -> /dist/dir/special.html
              if (renderedRoute.route.endsWith('.html')) {
                renderedRoute.outputPath = path.join(
                  __dirname,
                  'dist',
                  renderedRoute.route,
                )
              }
    
              return renderedRoute
            },
    
            // Optional - Uses html-minifier (https://github.com/kangax/html-minifier)
            // To minify the resulting HTML.
            // Option reference: https://github.com/kangax/html-minifier#options-quick-reference
            minify: {
              collapseBooleanAttributes: true,
              collapseWhitespace: true,
              decodeEntities: true,
              keepClosingSlash: true,
              sortAttributes: true,
            },
    
            // Server configuration options.
            server: {
              // Normally a free port is autodetected, but feel free to set this if needed.
              port: 8001,
            },
    
            // The actual renderer to use. (Feel free to write your own)
            // Available renderers: https://github.com/Tribex/prerenderer/tree/master/renderers
            renderer: new Renderer({
              // Optional - The name of the property to add to the window object with the contents of `inject`.
              injectProperty: '__PRERENDER_INJECTED',
              // Optional - Any values you'd like your app to have access to via `window.injectProperty`.
              inject: {
                foo: 'bar',
                prerender: false,
              },
    
              // Optional - defaults to 0, no limit.
              // Routes are rendered asynchronously.
              // Use this to limit the number of routes rendered in parallel.
              maxConcurrentRoutes: 4,
    
              // Optional - Wait to render until the specified event is dispatched on the document.
              // eg, with `document.dispatchEvent(new Event('custom-render-trigger'))`
              // renderAfterDocumentEvent: 'custom-render-trigger',
    
              // Optional - Wait to render until the specified element is detected using `document.querySelector`
              renderAfterElementExists: '#app',
    
              // Optional - Wait to render until a certain amount of time has passed.
              // NOT RECOMMENDED
              renderAfterTime: 5000, // Wait 5 seconds.
    
              // Other puppeteer options.
              // (See here: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions)
              headless: true, // Display the browser window when rendering. Useful for debugging.
            }),
          }),
        ]
    
    module.exports = {
    
      devServer: {
        disableHostCheck: true,
        progress: false,
        before () { // Output the same message as the react dev server to get the Spa middleware working with vue.
          console.info('Starting the development server...')
        },
      },
      transpileDependencies: ['vuetify'],
    
      configureWebpack: {
        plugins: [...plugins],
      },
    }


    В итоге получите SPA приложение с поисковой оптимизацией
    Ответ написан
    Комментировать
  • Как происходит деплой небольших веб-сервисов на ASP.NET Core на Linux VPS?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Разбирайтесь
    тут net6 + vue

    pipeline {
    	agent any
    	environment {
    		projectKeyFront = 'kvn-yanotes-front'
    		projectKeyBack = 'kvn-yanotes-back'
    		VUE_APP_STS_SERVER= 'https://auth.yanotes-dev.loc'
    		VUE_APP_REDIRECT_BASE = 'https://yanotes-dev.loc'
    		VUE_APP_CLIENT_NAME = 'yanotes_dev'
    	}
    
        stages {
    
    		stage('build client app') {
    			agent { 
    				dockerfile { 
    					filename 'Dockerfile-node'
    					
    				}
    			}
                steps {
                    sh 'cd ./YANotesServer/App/ && npm install --verbose'
    				sh 'cd ./YANotesServer/App/ && npm run build'
    				stash includes: 'YANotesServer/App/**/*', name: 'client-app'
    				sh 'rm -rf ./YANotesServer/App'
                }
    			
            }
    		
    		stage('build server app') {
    			agent { 
    				dockerfile { 
    					filename 'Dockerfile-dotnet-microsoft6'
    				}
    			}
                steps {
    				unstash 'client-app'
    				
    				
    					sh '''
    						
    						dotnet publish --framework net6.0 --configuration Release --runtime centos-x64 ./YANotes.sln
    						
    					'''
    				
    				
    				stash includes: 'StsServer/bin/Release/net6.0/centos-x64/publish/**/*', name: 'auth'
    				stash includes: 'YANotesServer/bin/Release/net6.0/centos-x64/publish/**/*', name: 'app'
                }
            }
    
    		stage('install systemd unit file') {
    			agent any
    			steps {
    				sshagent(['jenkins-ci-yanotes-dev']) {
    				
    					sh 'scp SystemdUnitFiles/yanotes.service-Dev root@yanotes-dev.loc:/etc/systemd/system/yanotes.dev.service'
    					sh 'scp SystemdUnitFiles/yanotes.auth.service-Dev root@yanotes-dev.loc:/etc/systemd/system/yanotes.auth.dev.service'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl daemon-reload'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl enable yanotes.dev'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl enable yanotes.auth.dev'
    					
    				}
    			}
    		}
    
    		stage('deployment web application') {
    			agent any
    			steps {
    				sshagent(['jenkins-ci-yanotes-dev']) {
    					unstash 'app'
    					
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl stop yanotes.dev'
    					// sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc rm -rf /var/yanotes'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc  mkdir -p /var/yanotes'
    					
    					sh 'scp -r ./YANotesServer/bin/Release/net6.0/centos-x64/publish/* root@yanotes-dev.loc:/var/yanotes'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl start yanotes.dev'
    				}
    			}
    		}
    
    		stage('deployment auth application') {
    			agent any
    			steps {
    				sshagent(['jenkins-ci-yanotes-dev']) {
    					unstash 'auth'
    
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc  systemctl stop yanotes.auth.dev'
    					// sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc  rm -rf /var/yanotesauth'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc mkdir -p /var/yanotesauth'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc mkdir -p /var/yanotesauth/logs'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc chmod 777 /var/yanotesauth/logs'
    					
    					sh 'scp -r ./StsServer/bin/Release/net6.0/centos-x64/publish/* root@yanotes-dev.loc:/var/yanotesauth'
    					sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc  systemctl start yanotes.auth.dev'
    									
    				}
    			}
    		}
    
        }
    }
    Ответ написан
  • Как изменить Content-Type внутри директории?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Ответ написан
    Комментировать
  • Меню бургер всегда должно быть fixed?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Просто логично мыслите. Бургер это кнопка вызова меню общих переходов, нужна она всегда, поэтому позиция должна быть зафиксирована
    Ответ написан
    Комментировать
  • Как вернуть ошибку?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Есть 2 подхода
    Все ошибки кэтчить и отдавать 200 статус
    И обрабатывать модель в которой есть сообщение об ошибке и статус
    Второй смотреть статус ошибки и выводить ответ уже на клиенте
    Ответ написан
    Комментировать
  • Возможно ли получить данные со второй html странички с помощью одного js скрипта?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Смотрите определение адреса
    Window.location.href
    Дальше дополняете логику
    Используя localStorage
    Если нужно догрузить данные используйте fetch и json Файлы что бы грузить только данные. Общий алгоритм такой при загрузке страница из стораджа считывает состояние, при необходимости загружает какие то данные из json и выводит их если что то изменилось то все пишется в сторадж
    Ответ написан
    Комментировать
  • Чем разбить большой txt файл на части?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В unix утилитах есть куча вариантов. Sed top и ещё много. При желании можно написать и свою примерный алгоритм
    Прочитать имя файла и количество строк для обрезки
    Открыть файл и читать до \r\n потом записывать это все в новый файл. Для оптимизации читать кусками по 10 мегабайт
    Ответ написан
    2 комментария
  • VPN server FreeBSD с логином и паролем?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    что пароль и имя?

    openvpn name password freebsd setup
    этой строки в гугле будет достаточно
    Ответ написан
    Комментировать
  • Где можно раздобыть образы коммутаторов/маршрутизаторов Huawei?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    лол а что с циской
    Ответ написан
  • Подводные камни удаленной работы на организацию в другом регионе РФ (с оформлением в штат)?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    сейчас есть электронная трудовая, вам достаточно подать заявление на ее оформление.
    Дальше будет без проблем.
    И исходя из моего опыта никаких проблем при отправке пониэкспрессом или деловыми линиями.
    Ответ написан
    2 комментария
  • Зачем верстать, если есть Wordpress, Joomla и т.п.?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Любой визуальный редактор даёт мусор. Причём этот мусор разного качества. Поисковые боты не совершенны, поэтому и востребованы Seo специалисты и рендеринг на сервере
    Ответ написан
    Комментировать
  • Чем различается старое и новое сетевое оборудование?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Если что то не понятно запускай профайлер. Если без шуток то сетевое оборудование различается своей производительностью и характеристиками. У кошек это кстати сильно зависит от прошивки.
    Ответ написан
    Комментировать
  • Какой есть инструмент для генерация pdf из html на стороне сервера?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Генерация пдф на основе страницы так себе идея. Но если нужно ставьте headless браузер и вызывайте его для рендеринга.
    Ответ написан
    Комментировать