{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "timsa.ru: заметки с тегом программирование",
    "_rss_description": "Моя записная книжка. Комментарии отключены из-за спама. Для вопросов используйте эту страничку",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/timsa.ru\/tags\/programmirovanie\/",
    "feed_url": "https:\/\/timsa.ru\/tags\/programmirovanie\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "timsa",
            "url": "https:\/\/timsa.ru\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "107",
            "url": "https:\/\/timsa.ru\/all\/wow\/",
            "title": "Отгадыватель кроссвордов",
            "content_html": "<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/env python3\r\n\r\nimport sys\r\nfrom itertools import permutations\r\nimport re\r\nimport requests\r\nfrom bs4 import BeautifulSoup\r\nfrom fake_useragent import UserAgent\r\nimport os.path\r\n\r\nif len(sys.argv) &lt; 4:\r\n  print(&quot;Usage: \\nwords.py yandex|google|filename|none алфавит маска\\n&quot;)\r\n  sys.exit()\r\n\r\nsearch  = sys.argv[1]\r\nalphabet = sys.argv[2]\r\npattern = sys.argv[3]\r\n\r\nyandex = 'https:\/\/yandex.ru\/search\/?noreask=1&amp;text='\r\ngoogle = 'https:\/\/www.google.ru\/search?ie=UTF-8&amp;hl=ru&amp;spell=0&amp;nfpr=1&amp;q='\r\n\r\nua = UserAgent()\r\nmyheaders = {'User-Agent': str(ua.random), 'referer': 'https:\/\/www.google.ru'}\r\n\r\n# все варианты перестановок\r\nallwords = permutations(alphabet, len(pattern))\r\n\r\n# выкидываем дубликаты\r\nwords = list(set(allwords))\r\n\r\n# склеиваем 2-мерный список в одномерный\r\nwords2 = []\r\nfor word in words:\r\n  str = ''.join(word)\r\n  words2.append(str)\r\n\r\n# проходим регекспом\r\nobj = re.compile(pattern)\r\nwords = list(filter(lambda str: obj.search(str), words2))\r\n\r\nprint('Всего вариантов %d' % len(words))\r\n\r\noutput = []\r\nwordlist = []\r\n\r\nif os.path.exists(search):\r\n  f = open(search, 'r', encoding = 'utf-8')\r\n  wordlist = [line.strip() for line in f]\r\n  f.close()\r\n  print('Размер словаря %d' % len(wordlist))\r\n\r\nfor word in words:\r\n  if search == 'google':\r\n    r = requests.get(google + word, headers=myheaders)\r\n    r.encoding = 'utf-8'\r\n    soup = BeautifulSoup(r.text, 'html5lib')\r\n    stat = soup.find('div', id='resultStats')\r\n    if stat is not None:\r\n      qty = re.search('Результатов:\\sпримерно\\s(.*)\\s\\(\\d+,\\d+\\sсек.\\)', stat.text)\r\n      x = qty.group(1)\r\n      x = x.split()\r\n      x = ''.join(x)\r\n      output.append([word, int(x)])\r\n      print(&quot;%s - %s&quot; % (word, x))\r\n    else:\r\n      output.append([word, 0])\r\n\r\n  elif search == 'yandex':\r\n    r = requests.get(yandex + word, headers=myheaders)\r\n    r.encoding = 'utf-8'\r\n    soup = BeautifulSoup(r.text, 'html5lib')\r\n    stat = soup.find('div', {'class': 'serp-adv__found'})\r\n    if stat is not None:\r\n      qty = re.search('Нашлось\\s(.*)\\sрезультатов', stat.text)\r\n      x = qty.group(1)\r\n      output.append([word, x])\r\n      print(&quot;%s - %s&quot; % (word, x))\r\n    else:\r\n      output.append([word, 0])\r\n      \r\n  elif os.path.exists(search):\r\n    if word in wordlist:\r\n      output.append([word, 0])\r\n    \r\n  else:\r\n    output.append([word, 0])\r\n\r\nprint('Отфильтрованно с помощью %s' % search)\r\n\r\noutput.sort(key=lambda x: x[1], reverse=True)\r\n\r\nfor str in output:\r\n  print(str[0])<\/code><\/pre>",
            "date_published": "2020-07-21T13:44:14+05:00",
            "date_modified": "2020-07-21T13:44:07+05:00",
            "tags": [
                "python",
                "программирование"
            ],
            "_date_published_rfc2822": "Tue, 21 Jul 2020 13:44:14 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "107",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "116",
            "url": "https:\/\/timsa.ru\/all\/podklyuchaem-dadget-co2-k-servaku\/",
            "title": "Подключаем Dadget CO2 к серваку",
            "content_html": "<ol start=\"1\">\n<li>Сначала сделаем чтобы любой пользователь мог обращаться к устройству<br \/>\nсоздаем \/etc\/udev\/rules.d\/10-co2mon.rules<br \/>\nс содержимым<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">ACTION==&quot;add|change&quot;, SUBSYSTEMS==&quot;usb&quot;, ATTRS{idVendor}==&quot;04d9&quot;, ATTRS{idProduct}==&quot;a052&quot;, MODE:=&quot;0666&quot;<\/code><\/pre><p>щелкаем<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">udevadm control --reload\r\nudevadm trigger<\/code><\/pre><p>проверяем что \/dev\/usb\/hiddev0 теперь crw-rw-rw-<\/p>\n<ol start=\"2\">\n<li>Подключаем библиотечку <s>PyUSB<\/s> hid. PyUSB глючное говно вызывающее странные эффекты, например пропадение устройства hiddev0.<br \/>\npip3 install hid (или hidapi уже не помню, это гуглится)<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Читаем (алгоритм расшифровки передрал с сишного проекта co2mod)<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/env python3\r\n\r\nimport hid\r\nimport time\r\n\r\ndef decode_co(data):\r\n    # кручу-верчу\r\n    data[0], data[2] = data[2], data[0]\r\n    data[1], data[4] = data[4], data[1]\r\n    data[3], data[7] = data[7], data[3]\r\n    data[5], data[6] = data[6], data[5]\r\n    \r\n    result = bytearray(8)\r\n\r\n    # всех обмануть хочу\r\n    result[7] = ((data[6] &lt;&lt; 5) &amp; 0xFF) | ((data[7] &gt;&gt; 3) &amp; 0xFF)\r\n    result[6] = ((data[5] &lt;&lt; 5) &amp; 0xFF) | ((data[6] &gt;&gt; 3) &amp; 0xFF)\r\n    result[5] = ((data[4] &lt;&lt; 5) &amp; 0xFF) | ((data[5] &gt;&gt; 3) &amp; 0xFF)\r\n    result[4] = ((data[3] &lt;&lt; 5) &amp; 0xFF) | ((data[4] &gt;&gt; 3) &amp; 0xFF)\r\n    result[3] = ((data[2] &lt;&lt; 5) &amp; 0xFF) | ((data[3] &gt;&gt; 3) &amp; 0xFF)\r\n    result[2] = ((data[1] &lt;&lt; 5) &amp; 0xFF) | ((data[2] &gt;&gt; 3) &amp; 0xFF)\r\n    result[1] = ((data[0] &lt;&lt; 5) &amp; 0xFF) | ((data[1] &gt;&gt; 3) &amp; 0xFF)\r\n    result[0] = ((data[7] &lt;&lt; 5) &amp; 0xFF) | ((data[0] &gt;&gt; 3) &amp; 0xFF)\r\n    \r\n    magic_word = b'Htemp99e'\r\n    for i in range(8):\r\n        r = ((magic_word[i] &lt;&lt; 4) &amp; 0xFF) | ((magic_word[i] &gt;&gt; 4) &amp; 0xFF)\r\n        if result[i] &lt; r:\r\n            result[i] = 0xFF - r + result[i]\r\n        else:\r\n            result[i] = result[i] - r\r\n\r\n    # не знаю почему, но у меня проверка чек-суммы никогда не сходилась    \r\n    #if result[0]+result[1]+result[2] != result[3]:\r\n    #    return 0\r\n\r\n    res = (result[1] &lt;&lt; 8) + result[2]\r\n\r\n    if result[0] == 0x42:\r\n        print(&quot;T={0}&quot;.format(res * 0.0625 - 273.15))\r\n        return 1\r\n    elif result[0] == 0x50:\r\n        print(&quot;CO={0}&quot;.format(res))\r\n        return 2\r\n    return 0\r\n    \r\ntry:\r\n    h = hid.device()\r\n    h.open(0x04d9, 0xa052)\r\n\r\n    # хз, не вникал\r\n    h.set_nonblocking(1)\r\n\r\n    # по идее это отправка некой magic_table которой шифруется ответ, но и без любой из этих строк работает\r\n    #h.write(b'8\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00')\r\n    h.send_feature_report([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])\r\n    time.sleep(0.05)\r\n\r\n    co = 1\r\n    t = 1\r\n    while co | t:\r\n        d = h.read(8)\r\n        if d:\r\n            n = decode_co(d)\r\n            if n == 1:\r\n                t = 0\r\n            elif n == 2:\r\n                co = 0\r\n\r\n    h.close()\r\n\r\nexcept IOError as ex:\r\n    print(ex)<\/code><\/pre>",
            "date_published": "2020-07-20T22:38:42+05:00",
            "date_modified": "2020-07-20T22:41:17+05:00",
            "tags": [
                "co2",
                "dadget",
                "driver",
                "linux",
                "python",
                "программирование"
            ],
            "_date_published_rfc2822": "Mon, 20 Jul 2020 22:38:42 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "116",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "61",
            "url": "https:\/\/timsa.ru\/all\/gps-tracker-deest-d69-pet-locator\/",
            "title": "GPS tracker (Deest D69 Pet locator)",
            "content_html": "<p>Покупал когда то такую вот шнягу<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/timsa.ru\/pictures\/2017-09-18-10.01.16.jpg\" width=\"1625\" height=\"1617\" alt=\"\" \/>\n<\/div>\n<p>Хотел кошку на даче отпустить гулять. А она весом с кирпич оказалась.<\/p>\n<p>Тем не менее раз купил надо извлечь пользу. Поделие китайское, инфы почти никакой нет, на трекинг сайтах over9000 моделей трекеров поддерживается, а этого нет ни у кого. Родной сайт 102.gpsjm.com говно полное, приложение аналогично. Но, можно смской передать трекеру свой адрес и порт для логирования.<br \/>\nПротокол неизвестен, поэтому пока что написал на питоне прокси и смотрю что эта голова шлет на свой сайт.<\/p>\n<p>update:<br \/>\nДолбанные китайцы сделали keep-alive соединение, которое шняга поднимает и держит открытым.<br \/>\nЕсли оно открыто сервак без предупреждения шлет команды, а шняга по расписанию кидает координаты. Если в помещении и координат нет то только заряд аккума.<\/p>\n",
            "date_published": "2017-09-18T10:11:59+05:00",
            "date_modified": "2017-11-23T21:13:47+05:00",
            "tags": [
                "купил",
                "программирование"
            ],
            "image": "https:\/\/timsa.ru\/pictures\/2017-09-18-10.01.16.jpg",
            "_date_published_rfc2822": "Mon, 18 Sep 2017 10:11:59 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "61",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/timsa.ru\/pictures\/2017-09-18-10.01.16.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079)"
}