<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Johan Van</title><author><name>Johan Van</name></author><id>https://teletype.in/atom/johanv</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/johanv?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@johanv?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/johanv?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-17T00:10:20.693Z</updated><entry><id>johanv:st5hyyLj5Wa</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/st5hyyLj5Wa?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Инструмент для определения технологий на сайтах: Python-Wappalyzer</title><published>2023-03-13T09:56:28.809Z</published><updated>2023-03-13T09:56:28.809Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/b1/9f/b19fc710-02f3-4288-b279-047d1b0f8e85.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/1c/bb/1cbbbaaa-6217-46c5-8c09-842bc7dc3361.jpeg&quot;&gt;Библиотека Python-Wappalyzer - это инструмент для определения технологий, используемых на веб-сайтах. Она использует базу данных Wappalyzer для анализа HTML-кода и других атрибутов веб-страниц для идентификации технологий, используемых на сайте.</summary><content type="html">
  &lt;p id=&quot;gKjJ&quot;&gt;Библиотека Python-Wappalyzer - это инструмент для определения технологий, используемых на веб-сайтах. Она использует базу данных Wappalyzer для анализа HTML-кода и других атрибутов веб-страниц для идентификации технологий, используемых на сайте.&lt;/p&gt;
  &lt;figure id=&quot;9JBh&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1c/bb/1cbbbaaa-6217-46c5-8c09-842bc7dc3361.jpeg&quot; width=&quot;850&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6HBJ&quot;&gt;Для установки библиотеки можно использовать pip. Например, &lt;code&gt;pip install python-Wappalyzer&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;Iohs&quot;&gt;Пример использования библиотеки:&lt;/p&gt;
  &lt;pre id=&quot;GpuV&quot; data-lang=&quot;python&quot;&gt;from Wappalyzer import Wappalyzer, WebPage

w = Wappalyzer.latest()
page = WebPage.new_from_url(&amp;#x27;https://www.example.com&amp;#x27;)
technologies = w.analyze(page)
for t in technologies:
    print(t.name, t.version)&lt;/pre&gt;
  &lt;p id=&quot;5xdk&quot;&gt;В этом примере мы создаем экземпляр класса Wappalyzer, загружаем последнюю версию базы данных технологий и анализируем страницу example.com для определения технологий, используемых на сайте. Результаты анализа будут выводиться на экран, показывая название и версию технологий.&lt;/p&gt;
  &lt;p id=&quot;gMJs&quot;&gt;Важно отметить, что библиотека Python-Wappalyzer может не всегда работать корректно из-за изменений в HTML-коде или других атрибутах веб-страниц. Также, база данных технологий не всегда может быть актуальной.&lt;/p&gt;

</content></entry><entry><id>johanv:3q9mjSfeHT7</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/3q9mjSfeHT7?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Горячие клавиши PyCharm</title><published>2023-02-11T22:27:04.961Z</published><updated>2023-02-11T23:11:07.462Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e2/0e/e20ef171-bde5-470e-85ad-f04ebae2c7dd.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://sun9-28.userapi.com/impg/yA1fBVeNde8XO4W6wcXIRRSAxDMrS4Bby1gDtg/0N0HUrAfEI0.jpg?size=1080x1080&amp;quality=95&amp;sign=8bcb0af68f2c2b474d85cb594292739c&amp;type=album&quot;&gt;</summary><content type="html">
  &lt;figure id=&quot;AsPx&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-28.userapi.com/impg/yA1fBVeNde8XO4W6wcXIRRSAxDMrS4Bby1gDtg/0N0HUrAfEI0.jpg?size=1080x1080&amp;quality=95&amp;sign=8bcb0af68f2c2b474d85cb594292739c&amp;type=album&quot; width=&quot;1080&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>johanv:vo8XDgnBeW9</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/vo8XDgnBeW9?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>gif файл с прыгающим шариком</title><published>2023-02-11T22:23:35.202Z</published><updated>2023-02-11T22:23:35.202Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c4/44/c444a258-a76f-43d5-bde2-6f4558fc4cc7.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://sun9-17.userapi.com/impg/CGcxIVfO-S4fZQardteZMcb01aC7qbioiWE5aQ/wZVCrgz4vBk.jpg?size=1280x888&amp;quality=95&amp;sign=bb8275ec36c12cd914923bef92128a9c&amp;type=album&quot;&gt;Незнаем как вы, а нам захотелось немного магии к новому году.</summary><content type="html">
  &lt;p id=&quot;XjAj&quot;&gt;Незнаем как вы, а нам захотелось немного магии к новому году.&lt;/p&gt;
  &lt;p id=&quot;jygj&quot;&gt;Вот маленький кусочек кода, который делает gif файл с прыгающим шариком, идею мы дали а дальше все на вашу фантазию)&lt;/p&gt;
  &lt;p id=&quot;4zpF&quot;&gt;Скидывайте свои доработки в коменты, оценим)&lt;/p&gt;
  &lt;figure id=&quot;DPU8&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://sun9-17.userapi.com/impg/CGcxIVfO-S4fZQardteZMcb01aC7qbioiWE5aQ/wZVCrgz4vBk.jpg?size=1280x888&amp;quality=95&amp;sign=bb8275ec36c12cd914923bef92128a9c&amp;type=album&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>johanv:YVOf3R2ML1Q</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/YVOf3R2ML1Q?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Отправка строки через сокет (python)</title><published>2023-01-31T16:11:58.410Z</published><updated>2023-01-31T16:11:58.410Z</updated><summary type="html">Это очень ОЧЕНЬ простая конструкция для того, как вы могли бы решить эту проблему. Прежде всего, вам нужно либо принять клиента (на стороне сервера) перед тем, как перейти в цикл while 1, потому что в каждом цикле вы принимаете нового клиента, либо вы делаете так, как я описал, вы перебрасываете клиента в отдельный поток, который вы обрабатываете самостоятельно с этого момента.</summary><content type="html">
  &lt;hr /&gt;
  &lt;pre id=&quot;ZNQ8&quot; data-lang=&quot;python&quot;&gt;import socket
from threading import *

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = &amp;quot;192.168.1.3&amp;quot;
port = 8000
print (host)
print (port)
serversocket.bind((host, port))

class client(Thread):
    def __init__(self, socket, address):
        Thread.__init__(self)
        self.sock = socket
        self.addr = address
        self.start()

    def run(self):
        while 1:
            print(&amp;#x27;Client sent:&amp;#x27;, self.sock.recv(1024).decode())
            self.sock.send(b&amp;#x27;Oi you sent something to me&amp;#x27;)

serversocket.listen(5)
print (&amp;#x27;server started and listening&amp;#x27;)
while 1:
    clientsocket, address = serversocket.accept()
    client(clientsocket, address)&lt;/pre&gt;
  &lt;p id=&quot;1m6Z&quot;&gt;Это очень ОЧЕНЬ простая конструкция для того, как вы могли бы решить эту проблему. Прежде всего, вам нужно либо принять клиента (на стороне сервера) перед тем, как перейти в цикл while 1, потому что в каждом цикле вы принимаете нового клиента, либо вы делаете так, как я описал, вы перебрасываете клиента в отдельный поток, который вы обрабатываете самостоятельно с этого момента.&lt;/p&gt;

</content></entry><entry><id>johanv:IR8tz6xo7nq</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/IR8tz6xo7nq?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Как проверить url в Python? (искажен или нет)</title><published>2023-01-31T16:09:36.192Z</published><updated>2023-01-31T16:09:36.192Z</updated><summary type="html">Используйте пакет validators:</summary><content type="html">
  &lt;hr /&gt;
  &lt;p id=&quot;XTFp&quot;&gt;Используйте пакет validators:&lt;/p&gt;
  &lt;pre id=&quot;EviL&quot; data-lang=&quot;python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import validators
&amp;gt;&amp;gt;&amp;gt; validators.url(&amp;quot;http://google.com&amp;quot;)
True
&amp;gt;&amp;gt;&amp;gt; validators.url(&amp;quot;http://google&amp;quot;)
ValidationFailure(func=url, args={&amp;#x27;value&amp;#x27;: &amp;#x27;http://google&amp;#x27;, &amp;#x27;require_tld&amp;#x27;: True})
&amp;gt;&amp;gt;&amp;gt; if not validators.url(&amp;quot;http://google&amp;quot;):
...     print &amp;quot;not valid&amp;quot;
... 
not valid
&amp;gt;&amp;gt;&amp;gt;&lt;/pre&gt;

</content></entry><entry><id>johanv:jApap6VtF7W</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/jApap6VtF7W?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied</title><published>2023-01-31T16:07:49.362Z</published><updated>2023-01-31T16:07:49.362Z</updated><summary type="html">Вам нужно передать последовательность, но вы забыли запятую, чтобы ваши параметры были кортежем:</summary><content type="html">
  &lt;hr /&gt;
  &lt;p id=&quot;65y6&quot;&gt;Вам нужно передать последовательность, но вы забыли запятую, чтобы ваши параметры были кортежем:&lt;/p&gt;
  &lt;pre id=&quot;qJTm&quot; data-lang=&quot;python&quot;&gt;cursor.execute(&amp;#x27;INSERT INTO images VALUES(?)&amp;#x27;, (img,))&lt;/pre&gt;
  &lt;p id=&quot;56xJ&quot;&gt;Без запятой (img) - это просто сгруппированное выражение, а не кортеж, и поэтому строка img рассматривается как входная последовательность. Если длина этой строки составляет 74 символа, то Python воспринимает ее как 74 отдельных значения привязки, каждое длиной в один символ.&lt;/p&gt;
  &lt;pre id=&quot;Uxi9&quot; data-lang=&quot;python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; len(img)
74
&amp;gt;&amp;gt;&amp;gt; len((img,))
1&lt;/pre&gt;
  &lt;p id=&quot;4T4w&quot;&gt;Если вам легче читать, вы также можете использовать литерал списка:&lt;/p&gt;
  &lt;pre id=&quot;ffaf&quot; data-lang=&quot;python&quot;&gt;cursor.execute(&amp;#x27;INSERT INTO images VALUES(?)&amp;#x27;, [img])&lt;/pre&gt;

</content></entry><entry><id>johanv:TxUKjJCcE7K</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/TxUKjJCcE7K?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Как обнаружить двойной щелчок в QTableView</title><published>2023-01-31T16:04:33.631Z</published><updated>2023-01-31T16:04:33.631Z</updated><summary type="html">Больше нет необходимости использовать СИГНАЛЫ:</summary><content type="html">
  &lt;hr /&gt;
  &lt;p id=&quot;lqsm&quot;&gt;Больше нет необходимости использовать СИГНАЛЫ:&lt;/p&gt;
  &lt;pre id=&quot;3pkL&quot; data-lang=&quot;python&quot;&gt;self.your_table.doubleClicked.connect(your_function)&lt;/pre&gt;
  &lt;p id=&quot;Zjtt&quot;&gt;&amp;quot;doubleClicked&amp;quot; наследуется от QAbstractItemView.&lt;/p&gt;

</content></entry><entry><id>johanv:7F9pRR48gTY</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/7F9pRR48gTY?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Как сделать ячейку в QTableWidget только для чтения?</title><published>2023-01-31T16:01:40.438Z</published><updated>2023-01-31T16:01:40.438Z</updated><summary type="html">Для PyQt6 это то же самое, что и у @ozcanyarimdunya, но с перечислением EditTrigger:</summary><content type="html">
  &lt;hr /&gt;
  &lt;p id=&quot;cu0E&quot;&gt;Для PyQt6 это то же самое, что и у @ozcanyarimdunya, но с перечислением EditTrigger:&lt;/p&gt;
  &lt;pre id=&quot;9tTY&quot; data-lang=&quot;python&quot;&gt;self.tableWidget.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)&lt;/pre&gt;

</content></entry><entry><id>johanv:h_Ot82Gks3-</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/h_Ot82Gks3-?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Запуск HTML-кода в браузере (который генерируется BeautifulSoup) прямо из Python</title><published>2023-01-31T15:58:31.259Z</published><updated>2023-01-31T15:58:31.259Z</updated><summary type="html">Альтернатива с использованием NamedTemporaryFile (чтобы файл в конечном итоге был удален ОС):</summary><content type="html">
  &lt;hr /&gt;
  &lt;p id=&quot;TRXT&quot;&gt;Альтернатива с использованием NamedTemporaryFile (чтобы файл в конечном итоге был удален ОС):&lt;/p&gt;
  &lt;pre id=&quot;1djW&quot; data-lang=&quot;python&quot;&gt;import tempfile
import webbrowser

html = &amp;#x27;&amp;lt;html&amp;gt; ...  generated html string ...&amp;lt;/html&amp;gt;&amp;#x27;

with tempfile.NamedTemporaryFile(&amp;#x27;w&amp;#x27;, delete=False, suffix=&amp;#x27;.html&amp;#x27;) as f:
    url = &amp;#x27;file://&amp;#x27; + f.name
    f.write(html)
webbrowser.open(url)&lt;/pre&gt;

</content></entry><entry><id>johanv:SO855bSsdrS</id><link rel="alternate" type="text/html" href="https://teletype.in/@johanv/SO855bSsdrS?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=johanv"></link><title>Как уменьшить базу данных sqlite?</title><published>2023-01-31T15:54:08.865Z</published><updated>2023-01-31T15:56:23.392Z</updated><summary type="html">Команда VACUUM перестраивает всю базу данных. Есть несколько причин, по которым приложение может это сделать:</summary><content type="html">
  &lt;hr /&gt;
  &lt;p id=&quot;POAe&quot;&gt;Команда VACUUM перестраивает всю базу данных. Есть несколько причин, по которым приложение может это сделать:&lt;/p&gt;
  &lt;p id=&quot;GYBR&quot;&gt;- Если только SQLite не работает в режиме &amp;quot;auto_vacuum=FULL&amp;quot;, при удалении большого количества данных из файла базы данных остается пустое пространство, или &amp;quot;свободные&amp;quot; страницы базы данных. Это означает, что файл базы данных может быть больше, чем это необходимо. Выполнение VACUUM для восстановления базы данных позволяет вернуть это пространство и уменьшить размер файла базы данных.&lt;br /&gt;- Частые вставки, обновления и удаления могут привести к фрагментации файла базы данных, когда данные для одной таблицы или индекса разбросаны по всему файлу базы данных. Выполнение VACUUM гарантирует, что каждая таблица и индекс хранятся в файле базы данных в основном смежно. В некоторых случаях VACUUM может также уменьшить количество частично заполненных страниц в базе данных, что еще больше уменьшает размер файла базы данных...&lt;/p&gt;
  &lt;p id=&quot;fbvS&quot;&gt;Команда VACUUM работает путем копирования содержимого базы данных во временный файл базы данных, а затем перезаписывает оригинал содержимым временного файла. При перезаписи оригинала используется журнал отката или WAL-файл журнала записи вперед, как и при любой другой транзакции базы данных. Это означает, что при VACUUMing базы данных требуется вдвое больше свободного места на диске, чем размер исходного файла базы данных...&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;t2at&quot;&gt;Just open a connection and execute the VACUUM command;&lt;/p&gt;
  &lt;pre id=&quot;FGZQ&quot; data-lang=&quot;python&quot;&gt;conn = sqlite3.connect(SQLITE_FILE)
conn.execute(&amp;quot;VACUUM&amp;quot;)
conn.close()&lt;/pre&gt;
  &lt;pre id=&quot;zAMt&quot; data-lang=&quot;python&quot;&gt;import sqlite3
conn = sqlite3.connect(&amp;quot;database.db&amp;quot;,isolation_level=None)
conn.execute(&amp;quot;VACUUM&amp;quot;)
conn.close()&lt;/pre&gt;

</content></entry></feed>