Чтиво за последнее время

Тяжело идёт чтение в последнее время. Тупо времени нет..да и книг интересных что-то не попадается особо. Однако!

  • Таран Харт. Похититель бессмертия. Сюжет: поиск «филосовского камня» на космической станции около того и гляди взорвущейся звезды. Читабельность: 3 из 5
  • Евгений Панов. Последний Русский. Сюжет: муть, муть, остался последний русский на земле, русские наследники какойто космической рассы, муть, муть. Не дочитал. Читабельность 1 из 5
  • Алексей Имп. Пусть орла — 1, Ассимиляция. Очередной попаданец в космос. Перечитка, читал уже лет 5 назад. В принципе норм, но повторно не зашло. Оценка 3 из 5
  • Сергей Ткачев. Эра подземелий. Сюжет: пришествие системы, но основное действо по добыче сокровищ в подземельях с кучей монстров. Может и зашло бы если бы сюжет не был такой избитый. Читабельность 3 из 5
  • Игорь Евдокимов. Попал так попал 1-4. Сюжет: попаданец школьника в космос, миры EVE. Читабельность 4 из 5

Детское:

Гарии Поттер и филосовский камень

1с: Еще раз о сортировке массива структур

Уже не однократно поднимал в своём блоге вопрос о методе сортировки массива структур по какому то ключу. В конце концов остановился на самом медленном, но зато самом менее трудоёмком методе. Для нескольких тысяч записей пойдет. Для нескольких десятков тысяч записей уже нет, ибо памяти не хватит. Общая методика такова:

  1. Преобразуем массив структур в таблицу значений
  2. Отсортируем штатными средствами таблицу значений по ключевому полю
  3. Далее используем еже не массив структур, а именно таблицу значений, чтобы уменьшить накладные расходы на обратные преобразования
Функция ПреобразованиеМассивВТаблицуЗначений(Массив) экспорт
   ТЗ = Новый ТаблицаЗначений;
   Для Каждого СтрокаМассива Из Массив Цикл
       Если ТЗ.Колонки.Количество() = 0 Тогда
           Для Каждого ЭлементМассива Из СтрокаМассива Цикл
               ТЗ.Колонки.Добавить(ЭлементМассива.Ключ);
           КонецЦикла;
       КонецЕсли;

       НоваяСтрока = ТЗ.Добавить();
       Для Каждого ЭлементМассива Из СтрокаМассива Цикл
           НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
       КонецЦикла;
   КонецЦикла;
   Возврат ТЗ;
КонецФункции

Использование:

ТЗ_ЛС=ПреобразованиеМассивВТаблицуЗначений(список_лс.result.responseObject);
ТЗ_ЛС.Сортировать("room Возр");
...
для каждого стр из ТЗ_ЛС цикл
....
конеццикла

Автоматизация пережатия pdf файлов

Задача: есть некоя файловая помойка, размер которой вырос до неприличных размеров. Необходимо pdf файлы пережать до «еле читабельного» состояния.

Решение: напишем соответствующий скрипт на Bash

#! /bin/bash
from='2025-01-15'
to='2025-01-17'

find ~/wedwewe -type f -newermt "$from" ! -newermt "$to" -name "*.pdf" | while read fname; do
  echo "-compress: $fname"
  gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=res.pdf "$fname"
  if [ $? -eq 0 ]; then
    echo OK
    mv res.pdf "$fname"
  else
    echo FAIL
  fi
done

Что делает этот скрипт? А просто ищет все файлы созданные в указанном диапазоне дат. Далее последовательно пытается пережать каждый файл, и если это происходит успешно, то заменяет оригинал на получившийся пережатый файл. Опции dPDFSETTINGS:

/screen Более низкое качество и меньший размер. (72 т/д)
/ebook Лучшее качество, но чуть больший размер (150 dpi)
/prepress Вывод имеет более высокий размер и качество (300 dpi)
/printer Качество вывода подходит для принтерной печати (300 dpi)
/default Выбирает вывод, который подходит для нескольких целей, однако может создавать большие PDF-файлы.

Update: со временем скрипт чуть изменился. А именно добавил проверку «а помогло ли сжатие». Если эффекта нет, то и не заменяем пережатый файл

#! /bin/bash
from='2025-01-13'
to='2025-01-17'

find ~/shwedwed -type f -newermt "$from" ! -newermt "$to" -name "*.pdf" | while read fname; do
  echo "-compress: $fname"
  gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dNOPAUSE -dQUIET -dBATCH -sOutputFile=res.pdf "$fname"
  if [ $? -eq 0 ]; then
    echo OK
    size_before=$(wc -c <"$fname")
    size_after=$(wc -c <"res.pdf")
    if [[ $size_before -gt $size_after ]]
	then 
	    echo "-результат сжатия хороший. Заменяем файл..."
	    mv res.pdf "$fname"
	else 
	    echo "-сжатие не удачное, пропускаем.."
    fi
  else
    echo FAIL
  fi
done

WordPress: просмотр pdf с параметром FitH

В WordPress есть возможность разместить на странице pdf файл в контейнере object, при помощи стандартного блока «Файл». Но есть нюанс — из настраиваемых параметров размера — только высота в пикселях. Ширина автоматически при просмотре подразумевается 100%.. Соответственно файл встраивается в страницу с автоматическим параметром отображения (т.е. не на всю ширину страницы). Для того чтобы страница растянулась на всю ширину экрана, нужно добавить параметр view, например чтобы было примерно так:

<object data-wp-bind--hidden="!state.hasPdfPreview" class="wp-block-file__embed" data="Полезные_советы.pdf#view=FitH" type="application/pdf" style="width:100%;height:800px"></object>

Но, к сожалению после редактирования html кода блока, он ломается. Поэтому одним из решений является написание плагина, который ищет на страницах размещенный pdf файл, и добавляет ему соответствующий параметр. Вот как это реализовано у меня:

Добавляем веб хук:

add_filter( 'gettext', 'PDFFix', 20 );

Функция:

function PDFFix($text){
    $text= str_replace(".pdf>", ".pdf#view=Fit&toolbar=0>", $text);    
    return $text;
};

Arduino: подключение дисплея ST7735s

Данный дисплей как оказалось с некими особенностями. У части страждущих, после подключения по стандартной схеме с 5в, экран рябит, и покрывается полосами, поэтому приходится подключать его через резисторы в 1кОм, по схеме:

Однако у меня, прокатило и без этого, хотя тоже помучался немножко, но как оказалось просто не пропаял нормально контактную площадку на дисплее. Кроме того, в моём случае необходимо было оставить свободными часть пинов, в том числе 13 и 11, для других устройств, поэтому пришлось переключатся на «софтварную» реализацию функционала MISO/MOSI/SCK. В моём случае схема подключения следующая:

  • vcc — 5v
  • gnd — gnd
  • scl — 8
  • sda — 7
  • res — 5
  • dc — 4
  • cs — 6
  • blk — не используется

Ну и инициализация дисплея следующая соответственно:

#define TFT_SCLK 8
#define TFT_MOSI 7
#define TFT_CS        6
#define TFT_RST       5
#define TFT_DC        4
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

Из минусов — медленная отрисовка на экране. Однако в моём случае это не критично.

Стандартная же схема подключения следующая:

Дисплей на ST7735SArduino
GNDGND
VCC5V
SCL13 (sck)
SDA11 (mosi)
RES9
DC8
CS10 (ss)
BL3.3V

1 13 14 15 16 17 310