5 заметок с тегом

Лайфхак

Передача большого количества картинок между серверами

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

Кажется, что для этого может подойти создание архива из всех доступных файлов. Однако, для картинок, в отличии от текста, это не будет иметь особого смысла, т. к. сжать их еще сильнее не получится, а времени на попытки уйдет уйма.

Какой есть выход из этой ситуации? Верно, создать архив без сжатия:

Вот так, если предпочитаете tar:

tar -cf ./archive.tar /path/to/folder

И так, если больше нравится zip:

zip -qq -0 -r ./archive.zip /path/to/folder

Но как показывают замеры времени, tar справляется с задачей простой сборки файлов в один в разы быстрее.

После передачи файла по сети распаковать его можно так:

Для tar архива:

tar -xf ./archive.tar

И для zip архива:

unzip -qq ./archive.zip
 Нет комментариев    20   6 мес   Лайфхак

Обрабатываем некорректно сохраненные в лог JSON данные

С месяц назад, при записи JSON данных в лог, забыл отформатировать их json.dumps из питоновского dict’a в нормальный вид, а просто записал его при форматной печатью, преобразовав dict в str. Само собой, получил кучу данных в неудобоваримом виде, эх.

Как исправить? Стандартный json.loads теперь не воспримет такую строку как корректный JSON, т. к. с точки зрения формата она не валидна. Можно решить эту проблему при помощи функции ast.literal_eval.

Она безопасно преобразует строку, содержащую символы или стандартные структуры питона в нужный элемент или объект. В нашем случае, строковое представление словаря в сам словарь. А значит, так можно пробежаться по всем логам и преобразовать их в корректный вид.

Пример работы:


import ast
import json

# Наш преобразованный в строку dict()
s = "{'a': 'Text with \\'quotes\\''}"
j = json.loads(s)
# Получаем ошибку парсинга из-за одинарных кавычек
>> json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

# Парсим строку в dict
j = ast.literal_eval(s)
print(j)
>> {'a': "Text with 'quotes'"}
# Теперь уже дампим данные корректно
print(json.dumps(j))
>>{"a": "Text with 'quotes'"}

 Нет комментариев    23   6 мес   Python   Лайфхак

Keras 2.3 & TensorFlow 2

При обновлении до Keras >= 2.3 и Tensorflow >= 2.0 в старых многопоточных приложениях может начать выскакивать ошибка:

AttributeError: '_thread._local' object has no attribute 'value'

Решить ее можно заменив импорты

from keras import что_нужно

на

from tensorflow.keras import что_нужно

UPD: Если после обновления появилось вот такое:

Error : Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

Весьма вероятно, что cuDNN теперь не подходит по версии для TensorFlow ибо старовата. Найти нужную версию можно тут.

UPD 2: При обновлении cuDNN еще можно заметить, что в официальной инструкции установки на linux из архива не указано, что после копирования нужно сделать симлинки на so’шники. Иначе после sudo ldconfig будет ошибка (далее, вместо библиотеки версии 7, подставьте свою):

/usr/local/cuda/lib64/libcudnn.so.7 is not a symbolic link

Т. е. надо:

$ cd /usr/local/cuda/lib64/

$ ls -lha libcudnn*
-rwxr-xr-x 1 root root 374M июн 13 04:27 libcudnn.so
-rwxr-xr-x 1 root root 374M июн 13 04:27 libcudnn.so.7
-rwxr-xr-x 1 root root 374M июн 13 04:27 libcudnn.so.7.6.5
-rw-r--r-- 1 root root 373M июн 13 04:27 libcudnn_static.a

$ sudo rm libcudnn.so libcudnn.so.7
$ sudo ln libcudnn.so.7.6.5 libcudnn.so.7
$ sudo ln libcudnn.so.7 libcudnn.so
$ sudo ldconfig
 Нет комментариев    8   1 год   Keras   TensorFlow   Лайфхак

Экспресс пиар

Экспресс-дизайн от студии Артемия Лебедева — просто охуенная штука. Всего за 100000 рублей можно хорошо попиариться на всю страну развеселым логотипом, получить гору трафика на сайт и повысить узнаваемость бренда.

Убиваем сразу три зайца одним выстрелом:

  1. Студия экспериментирует, ищет новые подходы в дизайне за деньги заказчика и не сильно беспокоится о его мнении насчет получившегося результата.
  2. Название студии все время на слуху.
  3. Заказчик получает бурление говн в соцсеточках, с упоминанием названия компании и ссылками на его сайт. А значит будет трафик и рост ссылочной массы, что неплохо повлияет на поисковую выдачу в будущем.

А на сам логотип, в целом, всем плевать.

 Нет комментариев    10   2019   PR   Дизайн   Лайфхак

Мы вам обязательно перезвоним

На моем сайте есть форма обратной связи, через которую клиенты могут оставить свой телефон. Однако, возникает интересная ситуация — в половине случаев при звонке на указанный номер трубку никто не берет. Мало того, иногда даже сбрасывают звонок. Согласен, все мы бываем заняты. Перезваниваю через какое-то время — эффект тот же.

Стал думать: что тут может быть не так? Идей особо не было, так что вначале воспринял это как специфику рынка. Но потом как-то в облачной АТС закончились деньги, и я решил набрать такой сбрасывающий номер с  сотового телефона. И... о чудо! Трубку подняли, разговор успешно состоялся.

Провел небольшой эксперимент, и оказалось, что даже на разные коды городов реагируют по-разному. В порядке уменьшения вероятности принятия звонка:

  1. Сотовый номер с кодом региона абонента
  2. Сотовый номер из любого другого региона
  3. 8-800, 495, 812, 499

Если клиент сам решает позвонить вам, то ситуация меняется: люди любят «официальные» городские номера, в особенности, бесплатный для них 8-800. Так распределились номера в порядке убывания вероятности звонка:

  1. 8-800
  2. 495, 812, 499
  3. Сотовый номер с кодом региона абонента
  4. Сотовый номер из любого другого региона

Видимо, людей задолбали телефонные спамеры и холодные звонки, поэтому многие просто не отвечают, когда видят на экране входящий звонок с городского номера. А звонить на сотовые номера боятся из-за ощущения кустарности и ненадежности предприятия. Особенно, если клиенту предлагается купить дорогой товар или услугу.

Таким образом, для обратной связи лучше оставлять номер с кодом 8-800 или 495/812, а самому звонить с сотового телефона.

 Нет комментариев    5   2019   Лайфхак