{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Артёма Агасиева: заметки с тегом Лайфхак",
    "_rss_description": "Telegram: @aagasiev",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/agasiev.com\/tags\/layfhak\/",
    "feed_url": "https:\/\/agasiev.com\/tags\/layfhak\/json\/",
    "icon": "https:\/\/agasiev.com\/user\/userpic@2x.jpg?1529202066",
    "author": {
        "name": "Артём Агасиев",
        "url": "https:\/\/agasiev.com\/",
        "avatar": "https:\/\/agasiev.com\/user\/userpic@2x.jpg?1529202066"
    },
    "items": [
        {
            "id": "10",
            "url": "https:\/\/agasiev.com\/all\/a-nuzhno-li-voobsche-rassmatrivat-vse-zhaloby\/",
            "title": "А нужно ли вообще рассматривать все жалобы в соцсетях?",
            "content_html": "<p>Наступает неприятный момент, когда модерация социальной сети начинает задыхаться от наплыва жалоб пользователей на контент.<\/p>\n<p>Возникает логичный вопрос: <i>Как уменьшить нагрузку на модераторов?<\/i><\/p>\n<p>Да, можно придумать умных AI помощников, классификации жалоб на группы и т. д. Но может, для начала, нужно спросить себя: <i>А важны ли все жалобы от всех пользователей?<\/i><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/agasiev.com\/pictures\/unnamed-(2).jpeg\" width=\"512\" height=\"512\" alt=\"\" \/>\n<\/div>\n<p>Многие жалуются просто из-за плохого настроения или просто потому, что не согласны с мнением оппонента в сетевой диванно-позиционной войне. По сути, это может быть нормальный контент, который просто не нравится <i>конкретному<\/i> человеку.<\/p>\n<p>Какой выход? Для определенных типов жалоб нужно создавать видимость того, что пользователь был услышан: временно скрывать контент от жалобщика, т. е. в рамках одной сессии поставить<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">display:none<\/code><\/pre><p>html блоку или вообще удалить его, а саму жалобу отправить в <i> \/dev\/null<\/i>. Если вариантов жалоб несколько, то можно скрыть этот функционал в «Жалобы — Прочее» или прямо так и назвать «Жалобы — Я не согласен с юзером». Работает, проверено.<\/p>\n<p>В самом крайнем случае, ставить счетчик на количество жалоб на пользователя и его контент и по превышению некоторого порога отправлять на модерацию.<\/p>\n<p>Исключение — время прохождения модерации при публикации в AppStore или Google Play, в этот момент нужно включать модерацию любого контента на максимум, особенно 18+. Ведь хрен знает, на что может пожаловаться модератор маркета, а релиз, обычно, очень не хочется задерживать из-за возни с какой-то мелочью.<\/p>\n",
            "date_published": "2023-03-24T02:17:35+03:00",
            "date_modified": "2023-03-24T02:20:11+03:00",
            "image": "https:\/\/agasiev.com\/pictures\/unnamed-(2).jpeg",
            "_date_published_rfc2822": "Fri, 24 Mar 2023 02:17:35 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "10",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/agasiev.com\/pictures\/unnamed-(2).jpeg"
                ]
            }
        },
        {
            "id": "75",
            "url": "https:\/\/agasiev.com\/all\/peredacha-bolshogo-kolichestva-kartinok-mezhdu-serverami\/",
            "title": "Передача большого количества картинок между серверами",
            "content_html": "<p>Допустим, вам, как и мне сейчас, потребовалось перекинуть пару сотен тысяч картинок с одного сервера на другой. Передача файлов по одному займет неадекватное количество времени. Хочется как-то их все собрать в один файл и передать уже его разом по сети.<\/p>\n<p>Кажется, что для этого может подойти создание архива из всех доступных файлов. Однако, для картинок, в отличии от текста, это не будет иметь особого смысла, т. к. сжать их еще сильнее не получится, а времени на попытки уйдет уйма.<\/p>\n<p>Какой есть выход из этой ситуации? Верно, создать архив без сжатия:<\/p>\n<p>Вот так, если предпочитаете tar:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">tar -cf .\/archive.tar \/path\/to\/folder<\/code>\n<\/pre>\n<p>И так, если больше нравится zip:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">zip -qq -0 -r .\/archive.zip \/path\/to\/folder<\/code>\n<\/pre>\n<p>Но как показывают замеры времени, tar справляется с задачей простой сборки файлов в один в разы быстрее.<\/p>\n<p>После передачи файла по сети распаковать его можно так:<\/p>\n<p>Для tar архива:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">tar -xf .\/archive.tar<\/code>\n<\/pre>\n<p>И для zip архива:<\/p>\n<pre class=\"e2-text-code\"><code class=\"shell\">unzip -qq .\/archive.zip<\/code>\n<\/pre>\n",
            "date_published": "2020-12-13T15:43:53+03:00",
            "date_modified": "2020-12-15T17:23:22+03:00",
            "_date_published_rfc2822": "Sun, 13 Dec 2020 15:43:53 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "75",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "74",
            "url": "https:\/\/agasiev.com\/all\/obrabatyvaem-nekorrektno-sohranennye-v-log-json-dannye\/",
            "title": "Обрабатываем некорректно сохраненные в лог JSON данные",
            "content_html": "<p>С месяц назад, при записи JSON данных в лог, забыл отформатировать их json.dumps из питоновского dict’a в нормальный вид, а просто записал его при форматной печатью, преобразовав dict в str. Само собой, получил кучу данных в неудобоваримом виде,  эх.<\/p>\n<p>Как исправить? Стандартный json.loads теперь не воспримет такую строку как корректный JSON, т. к. с точки зрения формата она не валидна. Можно решить эту проблему при помощи функции <a href=\"https:\/\/docs.python.org\/3\/library\/ast.html#ast.literal_eval\">ast.literal_eval<\/a>.<\/p>\n<p>Она безопасно преобразует строку, содержащую символы или стандартные структуры питона в нужный элемент или объект. В нашем случае, строковое представление словаря в сам словарь. А значит, так можно пробежаться по всем логам и преобразовать их в корректный вид.<\/p>\n<p>Пример работы:<\/p>\n<pre class=\"e2-text-code\"><code class=\"python\">\r\nimport ast\r\nimport json\r\n\r\n# Наш преобразованный в строку dict()\r\ns = \"{'a': 'Text with \\\\'quotes\\\\''}\"\r\nj = json.loads(s)\r\n# Получаем ошибку парсинга из-за одинарных кавычек\r\n>> json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)\r\n\r\n# Парсим строку в dict\r\nj = ast.literal_eval(s)\r\nprint(j)\r\n>> {'a': \"Text with 'quotes'\"}\r\n# Теперь уже дампим данные корректно\r\nprint(json.dumps(j))\r\n>>{\"a\": \"Text with 'quotes'\"}\r\n<\/code>\n<\/pre>\n",
            "date_published": "2020-12-10T18:15:29+03:00",
            "date_modified": "2020-12-13T02:32:46+03:00",
            "_date_published_rfc2822": "Thu, 10 Dec 2020 18:15:29 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "74",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "65",
            "url": "https:\/\/agasiev.com\/all\/keras-2-3-tensorflow-2\/",
            "title": "Keras 2.3 &amp; TensorFlow 2",
            "content_html": "<p>При обновлении до Keras >= 2.3 и Tensorflow >= 2.0 в старых многопоточных приложениях может начать выскакивать ошибка:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">AttributeError: '_thread._local' object has no attribute 'value'<\/code><\/pre><p>Решить ее можно заменив импорты<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">from keras import что_нужно<\/code><\/pre><p>на<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">from tensorflow.keras import что_нужно<\/code><\/pre><p><b>UPD<\/b>: Если после обновления появилось вот такое:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">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.<\/code><\/pre><p>Весьма вероятно, что cuDNN теперь не подходит по версии для TensorFlow ибо старовата. Найти нужную версию можно <a href=\"https:\/\/www.tensorflow.org\/install\/source#linux\">тут<\/a>.<\/p>\n<p><b>UPD 2<\/b>: При обновлении cuDNN еще можно заметить, что в <a href=\"https:\/\/docs.nvidia.com\/deeplearning\/sdk\/cudnn-install\/index.html#installlinux-tar\">официальной инструкции установки на linux из архива<\/a> не указано, что после копирования нужно сделать симлинки на so’шники. Иначе после sudo ldconfig будет ошибка (далее, вместо библиотеки версии 7, подставьте свою):<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/usr\/local\/cuda\/lib64\/libcudnn.so.7 is not a symbolic link<\/code><\/pre><p>Т. е. надо:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">$ cd \/usr\/local\/cuda\/lib64\/\r\n\r\n$ ls -lha libcudnn*\r\n-rwxr-xr-x 1 root root 374M июн 13 04:27 libcudnn.so\r\n-rwxr-xr-x 1 root root 374M июн 13 04:27 libcudnn.so.7\r\n-rwxr-xr-x 1 root root 374M июн 13 04:27 libcudnn.so.7.6.5\r\n-rw-r--r-- 1 root root 373M июн 13 04:27 libcudnn_static.a\r\n\r\n$ sudo rm libcudnn.so libcudnn.so.7\r\n$ sudo ln libcudnn.so.7.6.5 libcudnn.so.7\r\n$ sudo ln libcudnn.so.7 libcudnn.so\r\n$ sudo ldconfig<\/code><\/pre>",
            "date_published": "2020-06-13T03:31:30+03:00",
            "date_modified": "2020-06-13T05:53:46+03:00",
            "_date_published_rfc2822": "Sat, 13 Jun 2020 03:31:30 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "65",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "58",
            "url": "https:\/\/agasiev.com\/all\/ekspress-piar\/",
            "title": "Экспресс пиар",
            "content_html": "<p><a href=\"https:\/\/www.artlebedev.ru\/express-design\/\">Экспресс-дизайн<\/a> от студии Артемия Лебедева — просто охуенная штука. Всего за 100000 рублей можно хорошо попиариться на всю страну развеселым логотипом, получить гору трафика на сайт и повысить узнаваемость бренда.<\/p>\n<p>Убиваем сразу три зайца одним выстрелом:<\/p>\n<ol start=\"1\">\n<li>Студия экспериментирует, ищет новые подходы в дизайне <i>за деньги заказчика<\/i> и не сильно беспокоится о его мнении насчет получившегося результата.<\/li>\n<li>Название студии все время на слуху.<\/li>\n<li>Заказчик получает бурление говн в соцсеточках, с упоминанием названия компании и ссылками на его сайт. А значит будет трафик и рост ссылочной массы, что неплохо повлияет на поисковую выдачу в будущем.<\/li>\n<\/ol>\n<p>А на сам логотип, в целом, всем плевать.<\/p>\n",
            "date_published": "2019-08-10T02:24:24+03:00",
            "date_modified": "2019-08-10T02:24:16+03:00",
            "_date_published_rfc2822": "Sat, 10 Aug 2019 02:24:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "58",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "50",
            "url": "https:\/\/agasiev.com\/all\/mi-vam-obyazatelno-perezvonim\/",
            "title": "Мы вам обязательно перезвоним",
            "content_html": "<p>На моем сайте есть форма обратной связи, через которую клиенты могут оставить свой телефон. Однако, возникает интересная ситуация — в половине случаев при звонке на указанный номер трубку никто не берет. Мало того, иногда даже сбрасывают звонок. Согласен, все мы бываем заняты. Перезваниваю через какое-то время — эффект тот же.<\/p>\n<p>Стал думать: что тут может быть не так? Идей особо не было, так что вначале воспринял это как специфику рынка. Но потом как-то в облачной АТС закончились деньги, и я решил набрать такой сбрасывающий номер с  сотового телефона. И... о чудо! Трубку подняли, разговор успешно состоялся.<\/p>\n<p>Провел небольшой эксперимент, и оказалось, что даже на разные коды городов реагируют по-разному. В порядке уменьшения вероятности принятия звонка:<br><br><\/p>\n<ol start=\"1\">\n<li>Сотовый номер с кодом региона абонента<\/li>\n<li>Сотовый номер из любого другого региона<\/li>\n<li>8-800, 495, 812, 499<\/li>\n<\/ol>\n<p>Если клиент сам решает позвонить вам, то ситуация меняется: люди любят «официальные» городские номера, в особенности, бесплатный для них 8-800. Так распределились номера в порядке убывания вероятности звонка:<br><br><\/p>\n<ol start=\"1\">\n<li>8-800<\/li>\n<li>495, 812, 499<\/li>\n<li>Сотовый номер с кодом региона абонента<\/li>\n<li>Сотовый номер из любого другого региона<\/li>\n<\/ol>\n<p>Видимо, людей задолбали телефонные спамеры и холодные звонки, поэтому многие просто не отвечают, когда видят на экране входящий звонок с городского номера. А звонить на сотовые номера боятся из-за ощущения кустарности и ненадежности предприятия. Особенно, если клиенту предлагается купить дорогой товар или услугу.<\/p>\n<p>Таким образом, для обратной связи лучше оставлять номер с кодом 8-800 или 495\/812, а самому звонить с сотового телефона.<\/p>\n",
            "date_published": "2019-06-13T13:05:26+03:00",
            "date_modified": "2019-06-13T13:05:21+03:00",
            "_date_published_rfc2822": "Thu, 13 Jun 2019 13:05:26 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "50",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3576,
    "_e2_ua_string": "E2 (v3576; Aegea)"
}