• Как получить из pdf файла информацию о character spacing и word spacing?

    Adamos
    @Adamos
    Задумался, есть ли в языке Postscript, лежащем в основе PDF, вообще команды разбивки букв и слов.
    Проверил, таки есть: ashow и widthshow соответственно.
    Так что теоретически можно конвертировать PDF обратно в PS и просто прочитать значения перед нужной командой.
    Но не факт, что та программа, которая создавала PDF, использовала эти команды, а не просто раскидала глифы / слова по отдельным выводам с точными координатами.
    Ответ написан
    Комментировать
  • Является ли сообщение, отправленное по Viber, SMS-сообщением?

    @rPman
    определения нужно искать не на вики а в rfc5724
    гугл показывает это, как я понял тут обсуждение ведется и трекается история

    Там в т.ч. четко определен и формат и способ передачи и прочее прочее

    Viber сообщение под это не поподают
    Ответ написан
    Комментировать
  • Как вычислить виновника из-за которого отваливается интернет с какой-то периодичностью в маленькой сети?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Такого рода проблемы все и всегда решаются однотипно.
    1. Необходимо сформулировать критерии наличия проблемы.
    Как именно пропадает интернет, насколько часто, как надолго. Это нужно для диагностики. поиска причины и определения ушла ли проблема после принятия каких либо мер.
    2. Делить проблему на части и проверять части по отдельности.
    Самый эффективный способ делить - это пополам. Отсекаем часть сети и проверяем наличие проблемы в обеих частях (если есть возможность) или в одной из частей.
    3. Когда найден минимальный проблемный участок, который уже нельзя или бессмысленно делить - заменяем его.
    4. Помним, что чаще всего сложные проблемы - это композиция нескольких более простых. которые по отдельности могут не проявляться. В вашем случае может быть проблема, связанная с нагрузкой на роутер, например, которую создает один из услов из-за плохого контакта обжима и большого объёма биттых пакетов. Устранив одну из причин, вы, может быть, сделаете проявления проблемы реже, но не устраните её полностью. К примеру, если замените ротуер, битые пакеты будут всё равно будут нагружать вашу сеть и портить ее производительность, но это будет не так очевидно. Переобжав коннектор вы избавитесь от части нагрузки, но еслив ваш ротуер работал на переделе, то лишний вафай-клиент или тяжелый видос в сети сможет его снова нагрузить до критического снижения производительности.

    Итак, пробежимся по перечисленным пунктам сначала.
    1. Критерии. Поиск критериев - это часть решения. Обычно в этом случае нуно сорать необходимую статистику. Есть куча софта, который это умеет делать, но пинг есть всегда под рукой.
    Для этой тулзы есть две полезных опции: ключ для бесконечного пинга и размер пакета.
    В разных ОС эти ключи немного разные, поэтому ищите их отдельно, у меня нет винды под рукой, поэтому не стану на этом заострять.
    Скаж лишь, что пинговать лучше большими пакетами, жалетально превышающими размер TTL, прописанный в роутере. Тогда такой пинг будет реже проскакивать в периоды хорошей связи, то есть выловит больше пролблем.
    Пинговать нужно в отдельных окнах сразу несколько хостов:
    - ya.ru - этот хост всегда отвечает на пинги и выявит проблемы с DNS
    - 8.8.8.8 - это гугловый DNS-сервер, тоже всегда отвечает на пинги, покажет, что связь с инетом есть даже если DNS, прописанныйна компе не правильно работает.
    - 192.168.0.1 - или какой там IP у вашего роутера. Нужно. чтбы отделить проблемы с инетом от проблем с внутренней связностью до роутера
    - 192.168.0.x - ip одного из компов в сети. Я обычно пингую несколько компов, доступных через баксимальное число потенциально проблемных узлов - ethernet-розеток, свичей, вайфай-соединений... Этот пинг поможет понять где проблема, во внутрисетевой связности или в последней миле.

    Учтите, что проблемы часто бывают комбинированные и каждое сочетание симптомов будет свидетельствовать о раных проблемах.
    Да, тревожным принаком может служить не только пропадание пакетов, но и скачки в длительности их возврата, особенно если такие длительности достигают 500мс и выше. Но и скачки от 3мс до 250мс тоже будут свидетельствовать о каких-то проблемах.

    Запускать пинг на всех компах лучше одновременно и на некоторое время. Например минут на 20. Потом по статистике будет видно сколько где пакетов пропало.

    2. Если критерии наличия проблемы позволяют, то можно попробовать отрубать части сети и смотреть наличие проблемы. Это я в том смысле, что если проблема происходит в среднем раз в пару-тройку часов, то отрубать на многие часы части сети при диагностикем ожет быть неприемлемым.
    Редкеи пробемы дольше отлавливать. Но напоминаю, что критерии можно детализировать, ведь если пакеты у вас пропадат относительно редко, то скачки времени их возврата могут случаться чаще и подсвечивать проблему. Также можно сделать рамер пакета близким к максимальному, это должно тоже в некоторых случаях участить проявление проблемы.
    Иногда не мешает нагрузить сеть комированием по локалке большого файла. В линуксе можнно с помощью утилиты tc послать большой поток рандомных байт на любой сокет..
    3. Плавающие проблемы случаются из-за плохого обжима, перебитого жверью кабеля, перегрызенного UTP в плинтусе, из-за умиращих конденсаторов в блоке питания роутера (БП может не выдавать необходимого при нагрузках тока, но вольтметром такая неисправность не будет различима без нагрузки). Вообще старые (да и не только) роутеры могут страдать поплывшими электролитическими конденсаторами не только в блоках питания.
    Хорошо, когда можно подменить роутер.
    4. ну с четвертым пунктом ничего не пососветуешь, только разделать и тестировать все по отедльности и в разных сочетания и да поможет нам ктулху.

    А для тех, кто дочитал этот опус до конйа - интересная задачка. Что пингуют эти команды, как и почему?
    ping 1.1
    ping 2130706433

    Тех, кто знает, попрошу не спойлерить=)
    Пусть для кого-то будет сюрпризом этот дивный мир=)

    UPD. Простите за адское количество опечаток в тексте. Писал в спешке и с непривычной клавиатуры. Исправлю всё попозже. Не ожидал, что многим ответ придётся по душе. Вроде ж накапитанил как мог.
    Ответ написан
    5 комментариев
  • Можно ли сжать файлы игры оставив игру работспособной?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В 2000-е на прилавках рынков мне как-то попался в руки CD диск (700Мб) где пираты вкатали аж 4 игры
    (кажется был Quake Ground Zero, KingPin, Blood ,,, и еще какаято).
    Веселое время было. И студии были такие как "Фаргус" и 1С и прочее. Переозвучкой игр занимались.
    Позже другие странные личности (паблишеры) делали такие вот релизы. Но интересно другое.
    В оригинале каждая игра занимала по сидюку. Вопрос- Как? Ответ простой - сжали аудио.
    Тогда игра занимала 100-150 Мб. А остальное - аудиотрек. Вот они взяли аудио (wav обычно или чистый трек)
    сжали в mp3. А при инсталляции - тупо запукалась утилита наподобие bladeencoder и прямо распаковывала
    музло на диск. Прям в логах было видно чем она занята. Вот такой трюк.

    С игрой в 13Гигов надо просто понять из чего эти гигабайты складываются. Если cinematics или музло - то
    иногда его можно удалить и игра себе идет нормально. А иногда и падает с ошибкой. В общем успех зависит
    на 99% как разработчик защитил игру. Бесплатные и indy-games обычно никак не защищаются. А дорогие
    имеют по 5 степеней защит.
    Ответ написан
    3 комментария
  • Как мне загрузить больше 24000 документов?

    @rPman
    И где код?

    Смотреть ошибки импорта, проверять сообщения об ошибках.

    В 99% случаев работы с csv у новичков и не только в самостоятельном парсинге csv файла и не знании что в его стандарте есть возможность размещения символа \n внутри строк, т.е. одна запись может быть размазана на несколько строк файла.
    Ответ написан
    Комментировать
  • Как одновременно прочитать построчно два файла?

    @Wirusnyy-chel
    Из комментариев под вопросом:
    нужно из файла взять подстроку после : и проверить существует ли подстрока из 1 файла в подстроке файла 2(до :) и если она есть, то записать строку в виде: подстрока из 1 файла: подстрока из 2 файла

    размеры файлов до 1гб


    Быстрым будет вариант с мапой из ответа выше, но он будет потреблять достаточно много памяти и ищет только прямые вхождения подстроки 1 в подстроке 2.

    Предлагаю вариант с меньшим потреблением памяти
    file1, err := os.Open(config.First_file)
    if err != nil {
      log.Fatalln("error")
    }
    defer file1.Close()
    file1Scanner := bufio.NewScanner(file1)
    
    file2, err := os.Open(config.Second_file)
    if err != nil {
      log.Fatalln("error")
    }
    defer file2.Close()
    file2Scanner := bufio.NewScanner(file2)
    
    // находим все доступные подстроки из файла 2
    file2SubSrings := make([]string,0)
    for file2Scanner.Scan(){
      file2SubSrings = append(file2SubSrings, strings.Split(file2Scanner.Text(), ":")[0])
    }
    
    for file1Scanner.Scan() {
      file1SubString := strings.Split(file1Scanner.Text(), ":")[1]
      for _, val := range file2SubStrings{
        if strings.Contains(val, file1SubString) {
          log.Println(file1SubString, ":", val)
          break
        }
    }
    
    if err := file1Scanner.Err(); err != nil {
      log.Fatalln(err)
    }
    
    if err := file2Scanner.Err(); err != nil {
      log.Fatalln(err)
    }


    UPD Вариант с параллельностью
    func scanFiles(file1, file2 *bufio.Scanner) {
    	// находим все доступные подстроки из файла 2
    	file2SubStrings := make([]string, 0)
    	for file2.Scan() {
    		file2SubStrings = append(file2SubStrings, strings.Split(file2.Text(), ":")[0])
    	}
    
    	wg := new(sync.WaitGroup)
    	valChan := make(chan string)
    	for i := 0; i < 5; i++ {
    		wg.Add(1)
    		go findIntersections(valChan, file2SubStrings, wg)
    	}
    
    	for file1.Scan() {
    		valChan <- strings.Split(file1.Text(), ":")[1]
    	}
    
    	wg.Wait()
    }
    
    func findIntersections(values chan string, file2SubStrings []string, wg *sync.WaitGroup) {
    	for {
    		file1SubString, ok := <-values
    
    		if !ok {
    			wg.Done()
    			return
    		}
    
    		for _, val := range file2SubStrings {
    			if strings.Contains(val, file1SubString) {
    				log.Println(file1SubString, ":", val)
    				break
    			}
    		}
    	}
    }


    UPD2
    строка из файла 2 - 663624e4aae0164132f10f09fdd9fcd2:liberty_
    строка из файла 1 - scherbakovatd@example.com:663624e4aae0164132f10f09fdd9fcd2
    на выходе должно выйти scherbakovatd@example.com:liberty_

    func scanFiles(file1, file2 *bufio.Scanner) {
    	scanWg := new(sync.WaitGroup)
    	scanWg.Add(2)
    
    	file1SubStrings := make(map[string]string)
    	file2SubStrings := make(map[string]string)
    
    
    	go func() {
    		var substr []string
    		for file1.Scan() {
    			substr = strings.Split(file1.Text(), ":")
    			file1SubStrings[substr[1]] = substr[0]
    		}
    		scanWg.Done()
    	}()
    	
    	go func() {
    		var substr []string 
    		for file2.Scan() {
    			substr = strings.Split(file2.Text(), ":")
    			file2SubStrings[substr[0]] = substr[1]
    		}	
    		scanWg.Done()
    	}()
    	
    	scanWg.Wait()
    	
    	
    	wg := new(sync.WaitGroup)
    	valChan := make(chan struct{k,v string})
    	for i := 0; i < 5; i++ {
    		wg.Add(1)
    		go findIntersections(valChan, file2SubStrings, wg)
    	}
    
    	for k, v := range file1SubStrings {
    		valChan <- struct{ k, v string }{k: k, v: v}
    	}
    
    	wg.Wait()
    }
    
    func findIntersections(file1Values chan struct{ k,v string}, file2 map[string]string, wg *sync.WaitGroup) {
    	for {
    		file1, ok := <-file1Values
    
    		if !ok {
    			wg.Done()
    			return
    		}
    		
    		if file2Value, ok := file2[file1.k];ok {
    			log.Println(file1.k, ":", file2Value)
    		}
    	}
    }
    Ответ написан
  • Как сжать файл?

    xez
    @xez
    TL Junior Roo
    Никак. Архив - это не исполняемый файл.
    Ответ написан
    1 комментарий
  • Как сжать файл?

    @Wirusnyy-chel
    Если нужно уменьшить размер бинарника который собирается гошкой https://habr.com/ru/company/plesk/blog/532402/

    Если хотите сжимать файлы для пересылки/хранения то перед использованием их нужно распаковать.
    Ответ написан
    Комментировать
  • Как сжать файл?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для exe-шников еще в 90-е создавались не архиваторы а всякие "упаковщики". Из таковых я помню UPX https://upx.github.io/
    Ответ написан
    Комментировать
  • Болят глаза через 5-10 минут, что можно сделать?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сходи к врачу. Боль в глазах может быть связана с внутричерепным давлением. У меня после Covid было такое что я видел вспышки в левом глазу. Все это - последствия чего-то там.

    Вобщем глаза - твоё здоровье и не слушай советы дилетантов по поводу монториов или шрифтов. У тебя - медицинская проблема и ее надо решать с медициной.
    Ответ написан
  • Как узнать причину падения monit?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Скорее всего не падает, а его убивает система, потому что кончается свободная память. В директории /etc/systemd/ найдите и отредактируйте файл monit.service, после [Unit] добавьте строчку Restart=Always. После этого команду выполните: systemctl daemon-reload.
    Ответ написан
    7 комментариев
  • Как стать независимым разработчиком в сфере роботов, электроники, IoT и зарабатывать на этом?

    krdpsr
    @krdpsr
    loading...
    смотри в торону медицинской робототехники или айти
    и получи образование в этом направлении
    Ответ написан
  • Как стать независимым разработчиком в сфере роботов, электроники, IoT и зарабатывать на этом?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Ну тут либо учёба, либо программирование.

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

    Насчёт IoT вам нужно учить схемотехнику и низкоуровневое программирование, типа C/C++, а только изучения этих языков уже чего стоит (Особенно C++, который считается, наверное, если не самым сложным и объёмным языком, то одним из таких).
    Далее схемо- или радиотехника. Передача информации на расстояние, протоколы и т.д. И последнее, на чём вы просто обязаны уже на все 100% поседеть или облысеть, это Linux и ему подобные операционки, хотя не всегда обязательно, но оооочень вряд ли что вы сможете без него)

    Далее выбираете микроконтроллер, закупаете на $100500 радиотехнического оборудования, изучаете различные компоненты и как они работают (Элементы схемотехники) и делаете что-то своё как первый полноценный проект в портфолио.

    Суть такова, что, во-первых, вы должно показать заказчику, что вы реально можете сделать всё, что от вас потребую, и что вы не будете зря тратить его [заказчика] время и деньги. Второе, это то, что без нормальных проектов на эту тему у вас ничего не получится. Данное ответвление рынка пока ещё толком не сформировалось, но уже есть крупные компании, который инвестирую деньги в это направление на тот случай, если оно "выстрелит" то занять первенство и лидерство на рынке. По этому, даже при не большой составляющей рынка, относительная конкуренция и так большая.

    Скажем так, вам, как врачу, проще будет пойти где-то на веб-дизайн и не париться, а то тут вы угробите кучу времени и своё здоровье (Физическое и моральное)
    Ответ написан
  • Mastodon сервер по минимуму как поднять?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Без Redis нельзя, в 1ГБ не впишитесь.
    Ответ написан
    2 комментария
  • Как запустить js код на сервере?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Установить на сервере Node.js и запустить как на локальном компьютере. В чём конкретный вопрос?
    Ответ написан
    4 комментария
  • Как сделать свой собственный интернет для дома?

    локальная сеть + мобильный интернет в связке со спутниковым
    Ответ написан
    1 комментарий
  • Можно ли роутер заразить вирусом?

    Adamos
    @Adamos
    Роутер имеет не только файловую систему, но и операционную. Обычно, если это роутер для домашнего сегмента - жестко кастрированный производителем и сто лет не обновлявшийся Линукс на древнем ядре, эксплойты для которого в даркнете есть у каждого пекинеса. Роутер может быть как заражен вирусом, который вмешивается в ваш трафик, так и быть включен в ботнет и атаковать сервера в интернете - а вы об этом даже не будете знать, если ваш провайдер не отловит эту активность и не заблокирует ваш канал.

    Лечатся такие проблемы (по крайней мере, временно) скачиванием с сайта производителя свежей прошивки для этого роутера и принудительной ее установкой. А еще лучше - подбором какой-нибудь OpenWRT и сменой хомячковой прошивки на открытую, более современную и лучше защищенную от заразы.
    Ответ написан
    4 комментария
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В реальности фриланса, вы являетесь и бизнес аналитиком и проджект менеджером и тимлидом и девопсом и бухгалтером и много много других вещей.
    Клиенту же нужен "продукт". То есть в большинстве случаев клиент подразумевает что вы настроите и запустите все.

    Так что настройте и на будущее при переговорах это обсуждайте, и вопросы примерно следующие:

    * Формат поставки
    * Операционная система
    * Доступы
    * Права на исходный код
    * Порядок приемки кода
    * Прочее

    То есть чем более точно вы все опишите в ТЗ и договоре, тем меньше у вас будет проблем
    Ответ написан
    3 комментария
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    @vitaly_il1
    DevOps Consulting
    По-моему, ответ простой - что было записано в договоре, то и обязан.
    Т.е. если речь шла о коде - то только код. Если договаривались о "запустить на сервере" - то надо ставить на сервер. Но вот о том, что для вебсервера используют Мак, я еще не слышал :-)
    Ответ написан
    11 комментариев