<?xml version="1.0" encoding="UTF-8"?>
	<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:media="http://search.yahoo.com/mrss/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:georss="http://www.georss.org/georss">
	<channel>
	<title>fox :: echo/PRqZYTvMkxscUHYrmYSQ</title>
	<link>https://idec.foxears.su/echo/PRqZYTvMkxscUHYrmYSQ</link>
	<description>
	fox :: echo/PRqZYTvMkxscUHYrmYSQ
	</description>
	<language>ru</language>
<item><title>Re: webbrowser</title><guid>WMJaWs1uKJZXkGTXL8Qp</guid><pubDate>2016-08-10 18:14:20</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/WMJaWs1uKJZXkGTXL8Qp#WMJaWs1uKJZXkGTXL8Qp</link>
		<description>
		Можно ещё избежать всех этих проблем, добавив в конфиг параметр для браузера.

Например, если человек хочет использовать тот, который по умолчанию, то не указывает ничего.

Иначе пишет в конфиг

browser termux-open-url
или
browser iceweasel

GenericBrowser в сабже устроен так, чт...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> vit01<br><br>
Можно ещё избежать всех этих проблем, добавив в конфиг параметр для браузера.<br>
<br>
Например, если человек хочет использовать тот, который по умолчанию, то не указывает ничего.<br>
<br>
Иначе пишет в конфиг<br>
<br>
browser termux-open-url<br>
или<br>
browser iceweasel<br>
<br>
GenericBrowser в сабже устроен так, что просто вызывает команду с аргументом. Так что опция в конфиге может стать полезной не только андроидоводам + позволит избежать костылей в коде.<br>

]]>
</content:encoded></item>
<item><title>Re: Списки в функциях питона</title><guid>p86iHsGU2A2HXYQzcjSv</guid><pubDate>2017-08-14 20:29:15</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/p86iHsGU2A2HXYQzcjSv#p86iHsGU2A2HXYQzcjSv</link>
		<description>
		Нихрена се. Интересное наблюдение.

Получается, после анализа кода интерпретатор создаёт пустой список [] и запоминает, где он лежит.

При вызове функции без параметров в дефолт-значения подставляется лишь указатель на этот самый список. И в последующие разы - тоже.

count всегда...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Difrex<br><br>
Нихрена се. Интересное наблюдение.<br>
<br>
Получается, после анализа кода интерпретатор создаёт пустой список [] и запоминает, где он лежит.<br>
<br>
При вызове функции без параметров в дефолт-значения подставляется лишь указатель на этот самый список. И в последующие разы - тоже.<br>
<br>
count всегда будет 0, потому что он примитив, а не полноценный объект, значит передаётся значением, а не по указателю<br>
<br>
<span class="comment">// В джаве у меня иногда встречались подобные путаницы. Там поведение такое же</span><br>

]]>
</content:encoded></item>
<item><title>Книги</title><guid>l2dwnaJVhSHfu9btNMkz</guid><pubDate>2017-04-06 20:53:22</pubDate><author>btimofeev</author><link>https://idec.foxears.su/blog/l2dwnaJVhSHfu9btNMkz#l2dwnaJVhSHfu9btNMkz</link>
		<description>
		ХамблБандл распродают книги по python: https://www.humblebundle.com/books/python-book-bundle...
		</description>
		<content:encoded>
<![CDATA[
btimofeev -> All<br><br>
ХамблБандл распродают книги по python: <a href="https://www.humblebundle.com/books/python-book-bundle" class="url">https://www.humblebundle.com/books/python-book-bundle</a><br>

]]>
</content:encoded></item>
<item><title>Списки в функциях питона</title><guid>2wOAgh97j7RzkAn6DBHv</guid><pubDate>2017-08-14 18:28:39</pubDate><author>Difrex</author><link>https://idec.foxears.su/blog/2wOAgh97j7RzkAn6DBHv#2wOAgh97j7RzkAn6DBHv</link>
		<description>
		Зацените

====
import random


def get_port():
    port = random.randrange(33000, 37000, 1)
    return port


def check_list(port_list=[], count=0):
    if count == 0:
        print(port_list)

    port = get_port()

    if port in port_list:
        return "%s: %s in %s" % (coun...
		</description>
		<content:encoded>
<![CDATA[
Difrex -> All<br><br>
Зацените<br>
<br>
<pre class="code">
import random


def get_port():
    port = random.randrange(33000, 37000, 1)
    return port


def check_list(port_list=[], count=0):
    if count == 0:
        print(port_list)

    port = get_port()

    if port in port_list:
        return "%s: %s in %s" % (count, port, len(port_list))
    else:
        count += 1
        port_list.append(port)
        return check_list(port_list, count)


print(check_list())
print(check_list())
print(check_list())
</pre>
<br>
Наверное, для гуру питона поведение будет знакомо, но для меня такое поведение было полной неожиданностью :(<br>

]]>
</content:encoded></item>
<item><title>Re: webbrowser</title><guid>VasOHGax1pnpDVuSHV7l</guid><pubDate>2016-08-10 13:43:24</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/VasOHGax1pnpDVuSHV7l#VasOHGax1pnpDVuSHV7l</link>
		<description>
		vit01&gt; // Это был толстый намёк на будущий парсер ссылок в Цезии. Кусок кода рабочий, конечно же.

Спасибо. Осталось разобраться как обнаруживать Termux, бо в linux и windows можно делать просто

====
webbrowser.open("url")
====

и что-то мне подсказывает, что

====
browser=webbr...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> vit01<br><br>
<span class="quote">vit01&gt; // Это был толстый намёк на будущий парсер ссылок в Цезии. Кусок кода рабочий, конечно же.</span><br>
<br>
Спасибо. Осталось разобраться как обнаруживать Termux, бо в linux и windows можно делать просто<br>
<br>
<pre class="code">
webbrowser.open("url")
</pre>
<br>
и что-то мне подсказывает, что<br>
<br>
<pre class="code">
browser=webbrowser.GenericBrowser("termux-open-url")
</pre>
<br>
будет излишним =)<br>
<br>
Почитаю в ближайшее время что-нить на тему.<br>

]]>
</content:encoded></item>
<item><title>Re: И снова по импорту</title><guid>PTAz6o1AFVoxbN3uexQU</guid><pubDate>2016-01-22 09:54:16</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/PTAz6o1AFVoxbN3uexQU#PTAz6o1AFVoxbN3uexQU</link>
		<description>
		Вопрос: как сделать декоратор для подобной функции при поведении from module import * ?...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> vit01<br><br>
Вопрос: как сделать декоратор для подобной функции при поведении from module import * ?<br>

]]>
</content:encoded></item>
<item><title>Пишем хандлер для Sensu</title><guid>PRqZYTvMkxscUHYrmYSQ</guid><pubDate>2016-01-28 16:53:28</pubDate><author>Difrex</author><link>https://idec.foxears.su/blog/PRqZYTvMkxscUHYrmYSQ#PRqZYTvMkxscUHYrmYSQ</link>
		<description>
		Как и обещал, будем разбирать процесс создания хандлера.

В терминологии Sensu хандлер – это тот же плагин, только вызывающийся по определенным событиям.

Рассмотрим ситуацию, когда нам надо запускать хандлер на события OK и CRITICAL. Пример конфигурации:
====
{
  "checks": {
   ...
		</description>
		<content:encoded>
<![CDATA[
Difrex -> All<br><br>
Как и обещал, будем разбирать процесс создания хандлера.<br>
<br>
В терминологии Sensu хандлер – это тот же плагин, только вызывающийся по определенным событиям.<br>
<br>
Рассмотрим ситуацию, когда нам надо запускать хандлер на события OK и CRITICAL. Пример конфигурации:<br>
<pre class="code">
{
  "checks": {
    "cpu": {
      "handlers": ["email"],
      "command": "/etc/sensu/plugins/system/check-cpu.rb",
      "interval": 60,
      "subscribers": [
        "base"
      ]
    }
  }
}
</pre>
<br>
Проверка запускается раз в 60 секунд.<br>
<pre class="code">
{
    "handlers": {
        "email": {
            "type": "pipe",
            "command": "/etc/sensu/handlers/notification/mailer.pl",
                "severities": ["critical", "ok"]
        }
    }
}
</pre>
При наступлении события смены состояния чека ok&lt;-&gt;critical выхлоп проверки в формате JSON отправится на STDIN программе mailer.pl.<br>
<br>
Как же выглядит выхлоп? А вот так:<br>
<pre class="code">
$VAR1 = {
          'check' =&gt; {
                       'status' =&gt; 2,
                       'handlers' =&gt; [
                                       'test'
                                     ],
                       'subscribers' =&gt; [
                                          'test'
                                        ],
                       'interval' =&gt; 60,
                       'history' =&gt; [
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '2',
                                      '2',
                                      '2',
                                      '2'
                                    ],
                       'issued' =&gt; 1442576325,
                       'executed' =&gt; 1442576325,
                       'total_state_change' =&gt; 5,
                       'duration' =&gt; '0.086',
                       'name' =&gt; 'test_check',
                       'command' =&gt; '/etc/sensu/plugins/files/check-checksums.rb -f /tmp/testfile -h e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
                       'output' =&gt; 'Checksum CRITICAL: /tmp/testfile does not match
'
                     },
          'action' =&gt; 'create',
          'client' =&gt; {
                        'timestamp' =&gt; 1442576321,
                        'address' =&gt; 'graphite.bingo-boom.ru',
                        'name' =&gt; 'graphite.bingo-boom.ru',
                        'version' =&gt; '0.20.0',
                        'subscriptions' =&gt; [
                                             'hp',
                                             'base',
                                             'uchiwa',
                                             'test',
                                             'dizard_snmp'
                                           ]
                      },
          'id' =&gt; '0139b1f9-db4c-4a2b-8124-a2c9b076e40d',
          'occurrences' =&gt; 4
        };
</pre>
Теперь мы можем взять этот JSON и преобразовать его в объект. В python это будет выглядеть примерно так:<br>
<pre class="code">
import ast
import fileinput

json = ''

for line in fileinput.input():
    json  += line

# Get dictionary from string
def get_dict(json):
        out_dict = ast.literal_eval(json)
    
        return out_dict


check_message_dict = get_dict(json)
</pre>
<br>
<br>
Теперь, когда у нас есть с структурированной информацией о проверке, я думаю, понятно, что делать дальше.<br>
<br>
Код из нашего продакшена – мылохандлера(немного устаревший код) <a href="https://github.com/Difrex/sensu/blob/master/handlers/mailer.pl" class="url">https://github.com/Difrex/sensu/blob/master/handlers/mailer.pl</a><br>

]]>
</content:encoded></item>
<item><title>Код, возвращаемый приложением</title><guid>pprfzJ5NlQSHvmIm7oUO</guid><pubDate>2016-03-21 15:49:25</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/pprfzJ5NlQSHvmIm7oUO#pprfzJ5NlQSHvmIm7oUO</link>
		<description>
		Как в питоне ловить сабж? Например, приложение возвращает 0 как сигнал о штатном завершении работы и мне надо его отловить....
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> All<br><br>
Как в питоне ловить сабж? Например, приложение возвращает 0 как сигнал о штатном завершении работы и мне надо его отловить.<br>

]]>
</content:encoded></item>
<item><title>Re: webbrowser</title><guid>myg5ahuijFn8JoVosXLz</guid><pubDate>2016-08-10 14:09:19</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/myg5ahuijFn8JoVosXLz#myg5ahuijFn8JoVosXLz</link>
		<description>
		AL&gt; и что-то мне подсказывает, что

====
browser=webbrowser.GenericBrowser("termux-open-url")
====

AL&gt; будет излишним =)


Уже пробовал без него запускать. И ссылка начинает открываться ... в Elinks. Если этот самый elinks удалить, то вообще открывать не будет.

Отличить Termux ...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Andrew Lobanov<br><br>
<span class="quote">AL&gt; и что-то мне подсказывает, что</span><br>
<br>
<pre class="code">
browser=webbrowser.GenericBrowser("termux-open-url")
</pre>
<br>
<span class="quote">AL&gt; будет излишним =)</span><br>
<br>
<br>
Уже пробовал без него запускать. И ссылка начинает открываться ... в Elinks. Если этот самый elinks удалить, то вообще открывать не будет.<br>
<br>
Отличить Termux можно очень легко по переменным окружения. Например, есть специфичные переменные $ANDROID_DATA и $ANDROID_ROOT. Также в PATH и PREFIX интересные штуки есть. Дальше, думаю, ты разберёшься сам.<br>

]]>
</content:encoded></item>
<item><title>Re: Вопрос знатокам эхотага</title><guid>MoE9oAm4wJTmhORxVUEw</guid><pubDate>2016-01-21 09:31:57</pubDate><author>Рома</author><link>https://idec.foxears.su/blog/MoE9oAm4wJTmhORxVUEw#MoE9oAm4wJTmhORxVUEw</link>
		<description>
		&gt; Они подгружаются каждый раз отдельно?

нет...
		</description>
		<content:encoded>
<![CDATA[
Рома -> Andrew Lobanov<br><br>
<span class="quote">&gt; Они подгружаются каждый раз отдельно?</span><br>
<br>
нет<br>

]]>
</content:encoded></item>
<item><title>Re: регекспы</title><guid>LETkFqEj4gaLvS2rYhnw</guid><pubDate>2016-01-22 08:56:15</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/LETkFqEj4gaLvS2rYhnw#LETkFqEj4gaLvS2rYhnw</link>
		<description>
		AL&gt; ====
AL&gt; ([A-Z]{20}|[A-Z]{8})
AL&gt; ====

Более красивое решение, но требующее питоновой обвязки:

====
s = " " + msgid + " "
r = re.compile("( [a-zA-Z1-9]{8} | [a-zA-Z1-9]{20} )")
====

Включение пробелов избавит от включения больших по количеству символов строк.

// Спасибо f...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> Рома<br><br>
<span class="quote">AL&gt; ====</span><br>
<span class="quote">AL&gt; ([A-Z]{20}|[A-Z]{8})</span><br>
<span class="quote">AL&gt; ====</span><br>
<br>
Более красивое решение, но требующее питоновой обвязки:<br>
<br>
<pre class="code">
s = " " + msgid + " "
r = re.compile("( [a-zA-Z1-9]{8} | [a-zA-Z1-9]{20} )")
</pre>
<br>
Включение пробелов избавит от включения больших по количеству символов строк.<br>
<br>
<span class="comment">// Спасибо flame из инстедоконфы.</span><br>

]]>
</content:encoded></item>
<item><title>Re: sqlite3</title><guid>L8n7jDcdtKgAcPQFmsEy</guid><pubDate>2016-06-12 16:39:52</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/L8n7jDcdtKgAcPQFmsEy#L8n7jDcdtKgAcPQFmsEy</link>
		<description>
		Ты делаешь просто SELECT COUNT(*) from ... ? Можно попробовать создать индекс в БД и проделывать хаки с ним.

Может быть, здесь что-то полезное тебе есть: http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Andrew Lobanov<br><br>
Ты делаешь просто SELECT COUNT(*) from ... ? Можно попробовать создать индекс в БД и проделывать хаки с ним.<br>
<br>
Может быть, здесь что-то полезное тебе есть: <a href="http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning" class="url">http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning</a><br>

]]>
</content:encoded></item>
<item><title>Re: Вопрос знатокам эхотага</title><guid>kMZA4mJGS51pjw4gFIhr</guid><pubDate>2016-01-21 09:32:46</pubDate><author>Рома</author><link>https://idec.foxears.su/blog/kMZA4mJGS51pjw4gFIhr#kMZA4mJGS51pjw4gFIhr</link>
		<description>
		они подгружаются при первом вызове

можешь в модуле написать print 123
и импортировать его несколько раз

выполнится это только один раз...
		</description>
		<content:encoded>
<![CDATA[
Рома -> Andrew Lobanov<br><br>
они подгружаются при первом вызове<br>
<br>
можешь в модуле написать print 123<br>
и импортировать его несколько раз<br>
<br>
выполнится это только один раз<br>

]]>
</content:encoded></item>
<item><title>Re: Код, возвращаемый приложением</title><guid>Hdt8lUnJPtnIqNp2zEqN</guid><pubDate>2016-03-21 16:36:48</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/Hdt8lUnJPtnIqNp2zEqN#Hdt8lUnJPtnIqNp2zEqN</link>
		<description>
		&gt; Но вот зачем...

Во-первых, это может быть полезно для моих других проектов. Во-вторых, я уверен, что скрестив два подхода я получу более полезное поведение цезия (психологически получается так, что если я не сохранял сообщение, то оно и не уйдёт). При этом старое поведение (со...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> vit01<br><br>
<span class="quote">&gt; Но вот зачем...</span><br>
<br>
Во-первых, это может быть полезно для моих других проектов. Во-вторых, я уверен, что скрестив два подхода я получу более полезное поведение цезия (психологически получается так, что если я не сохранял сообщение, то оно и не уйдёт). При этом старое поведение (сохранение пустого сообщения) я убирать не собираюсь пока. Если ничего путного не выйдет, то в апстрим всё равно эти изменения не пущу.<br>

]]>
</content:encoded></item>
<item><title>Re: регекспы</title><guid>ej5zk2kbhbYV3Tf4QHWT</guid><pubDate>2016-01-22 08:44:14</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/ej5zk2kbhbYV3Tf4QHWT#ej5zk2kbhbYV3Tf4QHWT</link>
		<description>
		RY&gt;&gt; а как сделать "или 8, или 20"?
vit01&gt; Вроде бы, надо отдельные группы городить, но точно не уверен.

vit01&gt; ([A-Z]{8})|([A-Z]{20})

Только в порядке уменьшения диапазонов:

====
([A-Z]{20}|[A-Z]{8})
====

Вот такой вариант точно рабочий и подходит для этой конкретной ситуаци...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> vit01<br><br>
<span class="quote">RY&gt;&gt; а как сделать "или 8, или 20"?</span><br>
<span class="quote">vit01&gt; Вроде бы, надо отдельные группы городить, но точно не уверен.</span><br>
<br>
<span class="quote">vit01&gt; ([A-Z]{8})|([A-Z]{20})</span><br>
<br>
Только в порядке уменьшения диапазонов:<br>
<br>
<pre class="code">
([A-Z]{20}|[A-Z]{8})
</pre>
<br>
Вот такой вариант точно рабочий и подходит для этой конкретной ситуации.<br>

]]>
</content:encoded></item>
<item><title>webbrowser</title><guid>AXToh5C3a3W8EW0nuJe6</guid><pubDate>2016-07-30 23:04:53</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/AXToh5C3a3W8EW0nuJe6#AXToh5C3a3W8EW0nuJe6</link>
		<description>
		====
import webbrowser

browser=webbrowser.GenericBrowser("termux-open-url")
browser.open("https://antizapret.info/")
====

// Это был толстый намёк на будущий парсер ссылок в Цезии. Кусок кода рабочий, конечно же....
		</description>
		<content:encoded>
<![CDATA[
vit01 -> All<br><br>
<pre class="code">
import webbrowser

browser=webbrowser.GenericBrowser("termux-open-url")
browser.open("https://antizapret.info/")
</pre>
<br>
<span class="comment">// Это был толстый намёк на будущий парсер ссылок в Цезии. Кусок кода рабочий, конечно же.</span><br>

]]>
</content:encoded></item>
<item><title>Re: sqlite3</title><guid>a5ZHvgt3GWMzXiu6QWzT</guid><pubDate>2016-06-13 11:38:08</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/a5ZHvgt3GWMzXiu6QWzT#a5ZHvgt3GWMzXiu6QWzT</link>
		<description>
		AL&gt;&gt; У тебя есть какие-нибудь наработки по формату базы? Может, есть смысл посмотреть в сторону твоей реализации ноды?

vit01&gt; Вот так создаётся база в ii-php:

Примерно так ж поступил и я. Всё отлично работает, кроме подсчёта количества сообщений. Ладно. Буду дальше думать....
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> vit01<br><br>
<span class="quote">AL&gt;&gt; У тебя есть какие-нибудь наработки по формату базы? Может, есть смысл посмотреть в сторону твоей реализации ноды?</span><br>
<br>
<span class="quote">vit01&gt; Вот так создаётся база в ii-php:</span><br>
<br>
Примерно так ж поступил и я. Всё отлично работает, кроме подсчёта количества сообщений. Ладно. Буду дальше думать.<br>

]]>
</content:encoded></item>
<item><title>Re: Вопрос знатокам эхотага</title><guid>a0529eLwc0CtMWSsWUUr</guid><pubDate>2016-01-21 10:31:05</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/a0529eLwc0CtMWSsWUUr#a0529eLwc0CtMWSsWUUr</link>
		<description>
		Рома&gt; они подгружаются при первом вызове

Спасибо за ответ....
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> Рома<br><br>
<span class="quote">Рома&gt; они подгружаются при первом вызове</span><br>
<br>
Спасибо за ответ.<br>

]]>
</content:encoded></item>
<item><title>И снова по импорту</title><guid>9kHCjIPsOU7V9crtHFFu</guid><pubDate>2016-01-22 09:52:21</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/9kHCjIPsOU7V9crtHFFu#9kHCjIPsOU7V9crtHFFu</link>
		<description>
		Есть файл first.py, там

====
def sample():
    print("123")
====

Есть файл second.py, там

====
from first.py import *

def wrapper(func):
    def wrapped(arg):
        open("file", "w").write(arg)
    return(wrapped)

print=wrapped(print)
sample()
print(" 22")
====

// мог оши...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> All<br><br>
Есть файл first.py, там<br>
<br>
<pre class="code">
def sample():
    print("123")
</pre>
<br>
Есть файл second.py, там<br>
<br>
<pre class="code">
from first.py import *

def wrapper(func):
    def wrapped(arg):
        open("file", "w").write(arg)
    return(wrapped)

print=wrapped(print)
sample()
print(" 22")
</pre>
<br>
<span class="comment">// мог ошибиться, пишу с телефона</span><br>
<br>
Когда вызывается second.py, функция print внутри sample() сохраняет своё прежнее поведение. А внешний принт меняет.<br>
<br>
Если заменить from blabla import * на import blabla; blabla.print=wrapped(print), то всё работает.<br>

]]>
</content:encoded></item>
<item><title>Re: sqlite3</title><guid>6tfR3eFSeqgoaiUqb42P</guid><pubDate>2016-06-13 11:21:24</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/6tfR3eFSeqgoaiUqb42P#6tfR3eFSeqgoaiUqb42P</link>
		<description>
		AL&gt; У тебя есть какие-нибудь наработки по формату базы? Может, есть смысл посмотреть в сторону твоей реализации ноды?

Вот так создаётся база в ii-php:

====
CREATE TABLE IF NOT EXISTS `$db-&gt;tablename` (
       `number` bigint NOT NULL auto_increment,
       `id` varchar(20) NOT ...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Andrew Lobanov<br><br>
<span class="quote">AL&gt; У тебя есть какие-нибудь наработки по формату базы? Может, есть смысл посмотреть в сторону твоей реализации ноды?</span><br>
<br>
Вот так создаётся база в ii-php:<br>
<br>
<pre class="code">
CREATE TABLE IF NOT EXISTS `$db-&gt;tablename` (
       `number` bigint NOT NULL auto_increment,
       `id` varchar(20) NOT NULL,
       `tags` text,
       `echoarea` text NOT NULL,
       `date` varchar(30) NOT NULL default '0',
       `msgfrom` text,
       `addr` text,
       `msgto` text,
       `subj` text not NULL,
       `msg` text not NULL,
        primary key(number, id)
	) ENGINE InnoDB default charset='utf8';
");
</pre>
<br>
Для sqlite, конечно же, следует изменить типы данных (в том числе из-за производительности). Насчёт поля date я подставил varchar(30), чтобы избежать проблемы 2038, но это может быть неудобно для поиска, так что здесь надо бы что-нибудь другое. И с primary key тоже свои особенности должны быть.<br>

]]>
</content:encoded></item>
<item><title>filler у операции %</title><guid>6iPS08C5bfiHAAPgfskq</guid><pubDate>2016-04-26 11:10:27</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/6iPS08C5bfiHAAPgfskq#6iPS08C5bfiHAAPgfskq</link>
		<description>
		Если я хочу сделать отступ при выводе информации, то я использую нечто вроде

====
"%-20s%s" % (1, 2)
====

Но при этом между символами 1 и 2 будут пробелы. Как заполнить пространство между ними произвольным символом без написания своей функции форматирования и возможно ли это в ...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> All<br><br>
Если я хочу сделать отступ при выводе информации, то я использую нечто вроде<br>
<br>
<pre class="code">
"%-20s%s" % (1, 2)
</pre>
<br>
Но при этом между символами 1 и 2 будут пробелы. Как заполнить пространство между ними произвольным символом без написания своей функции форматирования и возможно ли это в принципе?<br>

]]>
</content:encoded></item>
<item><title>Re: sqlite3</title><guid>5kLVxqefkfCyqRpdqQIt</guid><pubDate>2016-06-13 10:58:29</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/5kLVxqefkfCyqRpdqQIt#5kLVxqefkfCyqRpdqQIt</link>
		<description>
		vit01&gt; Ты делаешь просто SELECT COUNT(*) from ... ? Можно попробовать создать индекс в БД и проделывать хаки с ним.

Печальней даже стало. Подсчёт длины выборки стал быстрее раза в два (всё равно около 2-3 секунд), но существенно просела скорость добавления записей.

vit01&gt; Может...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> vit01<br><br>
<span class="quote">vit01&gt; Ты делаешь просто SELECT COUNT(*) from ... ? Можно попробовать создать индекс в БД и проделывать хаки с ним.</span><br>
<br>
Печальней даже стало. Подсчёт длины выборки стал быстрее раза в два (всё равно около 2-3 секунд), но существенно просела скорость добавления записей.<br>
<br>
<span class="quote">vit01&gt; Может быть, здесь что-то полезное тебе есть: http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning</span><br>
<br>
Спасибо. Почитаю как посвободней станет.<br>
<br>
<br>
Как вы уже наверняка догадались, я пытаюсь прикрутить sqlite к цезию. В целом доработки минимальные требуются, и всё работает просто отлично, кроме подсчёта длины индекса. Надо думать как обойти сие досадное недоразумение, так как в целом мне такое положение дел понравилось.<br>
<br>
2vit01: У тебя есть какие-нибудь наработки по формату базы? Может, есть смысл посмотреть в сторону твоей реализации ноды?<br>

]]>
</content:encoded></item>
<item><title>sqlite3</title><guid>1wqo9rEZb40lsqdiPJVm</guid><pubDate>2016-06-12 16:19:28</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/1wqo9rEZb40lsqdiPJVm#1wqo9rEZb40lsqdiPJVm</link>
		<description>
		Что-то в сабже очень грустно работает подсчёт строк в таблице. Каких-то 42+к записей на нетбуке считает около пяти секунд. Есть спобос быстрого подсчёта строк в связке python3 и sqlite3?...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> All<br><br>
Что-то в сабже очень грустно работает подсчёт строк в таблице. Каких-то 42+к записей на нетбуке считает около пяти секунд. Есть спобос быстрого подсчёта строк в связке python3 и sqlite3?<br>

]]>
</content:encoded></item>
<item><title>Re: Код, возвращаемый приложением</title><guid>0XRz7HAPfC6vc1PdYmHZ</guid><pubDate>2016-03-21 16:15:49</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/0XRz7HAPfC6vc1PdYmHZ#0XRz7HAPfC6vc1PdYmHZ</link>
		<description>
		====
p=subprocess.Popen(блаблабла)
p.wait()
print(p.returncode)
====

Но вот зачем...
...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Andrew Lobanov<br><br>
<pre class="code">
p=subprocess.Popen(блаблабла)
p.wait()
print(p.returncode)
</pre>
<br>
Но вот зачем...<br>

]]>
</content:encoded></item>
<item><title>эха про python</title><guid>yhsJ041qtO53C6xL3Xhc</guid><pubDate>2015-09-10 21:46:23</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/yhsJ041qtO53C6xL3Xhc#yhsJ041qtO53C6xL3Xhc</link>
		<description>
		всем привет!...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> All<br><br>
всем привет!<br>

]]>
</content:encoded></item>
<item><title>Qt и QProgressDialog</title><guid>XH6aJijQIVEQzIWvsbJu</guid><pubDate>2015-09-18 15:53:43</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/XH6aJijQIVEQzIWvsbJu#XH6aJijQIVEQzIWvsbJu</link>
		<description>
		Решил добавить в свой питоновский клиент диалог с прогрессбаром, чтобы он показывался во время загрузки больших эх.
Так вот, после этого эхи стали открываться раз в 5 дольше, чем без него.

=)
...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> All<br><br>
Решил добавить в свой питоновский клиент диалог с прогрессбаром, чтобы он показывался во время загрузки больших эх.<br>
Так вот, после этого эхи стали открываться раз в 5 дольше, чем без него.<br>
<br>
=)<br>

]]>
</content:encoded></item>
<item><title>Ликвидируем дубли в эхах по сабжу и тексту сообщения</title><guid>w60laaEqGOyr4UKeVecJ</guid><pubDate>2015-12-05 19:00:54</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/w60laaEqGOyr4UKeVecJ#w60laaEqGOyr4UKeVecJ</link>
		<description>
		====
#!/usr/bin/python2
# -*- coding:utf8 -*-
from ii_functions import *
import os

echolist=os.listdir(indexdir)

for echo in echolist:
		print("doing "+echo)
		msgids=getMsgList(echo)
		arr=[]
		doubles=0

		for msgid in msgids:
				msg=getMsg(msgid)

				if [msg["msg"], msg["s...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> All<br><br>
<pre class="code">
#!/usr/bin/python2
# -*- coding:utf8 -*-
from ii_functions import *
import os

echolist=os.listdir(indexdir)

for echo in echolist:
		print("doing "+echo)
		msgids=getMsgList(echo)
		arr=[]
		doubles=0

		for msgid in msgids:
				msg=getMsg(msgid)

				if [msg["msg"], msg["subj"]] in arr:
						doubles+=1
						msgids.remove(msgid)
						print msgid
				else:
						arr.append([msg["msg"], msg["subj"]])

		if doubles&gt;0:
				print("doubles: "+str(doubles))
				open("echo_new/"+echo, "w").write("\n".join(msgids)+"\n")
</pre>

]]>
</content:encoded></item>
<item><title>Re: rsa и все все все</title><guid>T9bBtiAJLfuCAZAPMyI5</guid><pubDate>2015-09-14 16:33:31</pubDate><author>Difrex</author><link>https://idec.foxears.su/blog/T9bBtiAJLfuCAZAPMyI5#T9bBtiAJLfuCAZAPMyI5</link>
		<description>
		Дергай gpg. У GPG стандартизированный API и он есть везде. ...
		</description>
		<content:encoded>
<![CDATA[
Difrex -> Roman Yakovlev<br><br>
Дергай gpg. У GPG стандартизированный API и он есть везде. <br>

]]>
</content:encoded></item>
<item><title>Re: Qt и QProgressDialog</title><guid>S2lSQXbU9wszHvwrLDyF</guid><pubDate>2016-01-08 14:19:13</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/S2lSQXbU9wszHvwrLDyF#S2lSQXbU9wszHvwrLDyF</link>
		<description>
		vit01&gt; после этого эхи стали открываться раз в 5 дольше, чем без него.

Понял, в чём была проблема.
Когда решил вынести это дело в отдельный поток и попробовать снова, результат оказался точно таким же. Как оказалось, тормоза вызывало не обновление прогрессбара, а прорисовка QLis...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> vit01<br><br>
<span class="quote">vit01&gt; после этого эхи стали открываться раз в 5 дольше, чем без него.</span><br>
<br>
Понял, в чём была проблема.<br>
Когда решил вынести это дело в отдельный поток и попробовать снова, результат оказался точно таким же. Как оказалось, тормоза вызывало не обновление прогрессбара, а прорисовка QListWidget. Да, да, который был во время этого процесса бесполезен. Так что я теперь просто скрываю MainWindow во время подгрузки данных, а после этого опять делаю видимым, и всё работает нормально.<br>

]]>
</content:encoded></item>
<item><title>Re: rsa и все все все</title><guid>qWQA5hNs4CVnJwTue0MG</guid><pubDate>2015-09-11 07:24:49</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/qWQA5hNs4CVnJwTue0MG#qWQA5hNs4CVnJwTue0MG</link>
		<description>
		Попробуй PyCrypto. Я, правда, не использовал RSA через него, но с AES он отлично справляется.
...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Roman Yakovlev<br><br>
Попробуй PyCrypto. Я, правда, не использовал RSA через него, но с AES он отлично справляется.<br>

]]>
</content:encoded></item>
<item><title>Re: rsa и все все все</title><guid>QAxwmO5W1hTTVgv9vuwA</guid><pubDate>2015-09-10 21:50:48</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/QAxwmO5W1hTTVgv9vuwA#QAxwmO5W1hTTVgv9vuwA</link>
		<description>
		&gt;подскажите какой-нибудь алгоритм шифрование и лёёёгонькую библиотечку python для него, чтобы был небольшой паблик-кей, какой-нибудь привейт-кей и можно было слать шифровки на паблик-кей
&gt;ща я пробую с python-rsa, в debian она есть, а вот в openbsd её нет :) но может есть способы...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> Roman Yakovlev<br><br>
<span class="quote">&gt;подскажите какой-нибудь алгоритм шифрование и лёёёгонькую библиотечку python для него, чтобы был небольшой паблик-кей, какой-нибудь привейт-кей и можно было слать шифровки на паблик-кей</span><br>
<span class="quote">&gt;ща я пробую с python-rsa, в debian она есть, а вот в openbsd её нет :) но может есть способы проще</span><br>
Немного неэхотаг, на у меня мелькали мысли прикрутить просто PGP для этих целей. Да-да. Прямо к ii-софту =)<br>

]]>
</content:encoded></item>
<item><title>регекспы</title><guid>pXDp3tuoQOAeY9lVbAxQ</guid><pubDate>2015-11-16 04:38:22</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/pXDp3tuoQOAeY9lVbAxQ#pXDp3tuoQOAeY9lVbAxQ</link>
		<description>
		Вот {8} - это 8 символов
{8,20} - это от 8 до 20
а как сделать "или 8, или 20"?...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> All<br><br>
Вот {8} - это 8 символов<br>
{8,20} - это от 8 до 20<br>
а как сделать "или 8, или 20"?<br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>orldItWCch2kV6oteDre</guid><pubDate>2015-09-10 21:53:35</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/orldItWCch2kV6oteDre#orldItWCch2kV6oteDre</link>
		<description>
		&gt;Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низкоуровневых реализаций...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> Andrew Lobanov<br><br>
<span class="quote">&gt;Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низкоуровневых реализаций, а значит моя высокоуровневая реализация таких штук "по-старинке" будет медленнее.</span><br>
<br>
<span class="quote">&gt;Питон всё таки язык транслируемый и достаточно неторопливый.</span><br>
<br>
это идеология. :) всё, что укладывается в pep8 и pep20 - питоноугодно. всё, что нет - нет<br>
<br>
ps. ты, кстати, пишешь, на python2 а не python3 :) в python3 нет всех этих .decode, поэтому я даже не понимаю, почему оно работает (но в python3 я не вникал и не интересуюсь особо). по идее, это можно портировать на python2, надо будет попробовать<br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>MNPlwCZiqd2UvelIPeYq</guid><pubDate>2015-09-10 21:57:11</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/MNPlwCZiqd2UvelIPeYq#MNPlwCZiqd2UvelIPeYq</link>
		<description>
		&gt;ps. ты, кстати, пишешь, на python2 а не python3 :) в python3 нет всех этих .decode, поэтому я даже не понимаю, почему оно работает (но в python3 я не вникал и не интересуюсь особо). по идее, это можно портировать на python2, надо будет попробовать
Ну фиг знает. Это кушает python...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> Roman Yakovlev<br><br>
<span class="quote">&gt;ps. ты, кстати, пишешь, на python2 а не python3 :) в python3 нет всех этих .decode, поэтому я даже не понимаю, почему оно работает (но в python3 я не вникал и не интересуюсь особо). по идее, это можно портировать на python2, надо будет попробовать</span><br>
Ну фиг знает. Это кушает python3. И это я очень долго и упорно всё гуглил и обкатывал. И они таки есть. Потому как байт-массив из юникода не получается и потому приходится промежуточно транслировать всё в ascii. Уж не знаю тонкостей, но работает.<br>

]]>
</content:encoded></item>
<item><title>Пишем плагин для Sensu</title><guid>M2odea0DyTf0w0lTTWaG</guid><pubDate>2015-10-13 13:47:54</pubDate><author>Difrex</author><link>https://idec.foxears.su/blog/M2odea0DyTf0w0lTTWaG#M2odea0DyTf0w0lTTWaG</link>
		<description>
		Думал, куда бы перетащить эту статью -- в linux.14 или в python.15. Решил остановиться на питоне.

Итак:

Будем писать на питоне.

Нам потребуется пакет sensu-plugin-python. Ставим его. У меня он опакечен, вам же предстоит это делать самому. Взять его можно на гитхабе: https://gi...
		</description>
		<content:encoded>
<![CDATA[
Difrex -> All<br><br>
Думал, куда бы перетащить эту статью -- в linux.14 или в python.15. Решил остановиться на питоне.<br>
<br>
Итак:<br>
<br>
Будем писать на питоне.<br>
<br>
Нам потребуется пакет sensu-plugin-python. Ставим его. У меня он опакечен, вам же предстоит это делать самому. Взять его можно на гитхабе: <a href="https://github.com/sensu/sensu-plugin-python.git." class="url">https://github.com/sensu/sensu-plugin-python.git.</a><br>
<br>
*Пишем проверку*<br>
<br>
<pre class="code">
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from sensu_plugin import SensuPluginCheck
from os import listdir
from os.path import isfile,join
 
class CoolCheck(SensuPluginCheck):
  def setup(self):
    self.parser.add_argument(
      '-w',
      '--warning',
      required=True,
      type=int,
      help='Integer warning level to output'
    )
    self.parser.add_argument(
      '-c',
      '--critical',
      required=True,
      type=int,
      help='Integer critical level to output'
    )
    self.parser.add_argument(
      '-d',
      '--directory',
      required=True,
      type=str,
      help='Path to directory'
    )
 
 
  def run(self):
    self.check_name('my_cool_check')
 
    dir = self.options.directory
 
    onlyfiles = [ f for f in listdir(dir) if isfile( join(dir, f) ) ]
    size = len(onlyfiles)
 
    if size &lt; self.options.warning:
      self.ok() # Exit code 0
    elif size &gt;= self.options.warning and size &lt; self.options.critical:
      self.warning('Files count ' + str(size)) # Exit code 1
    elif size &gt;= self.options.critical:
      self.critical('Files count ' + str(size)) # Exit code 2
    else:
      self.unknown('Unknown error')
 
if __name__ == "__main__":
  f = CoolCheck()
</pre>
<br>
SensuPluginCheck уже предоставляет нам парсер командной строки по-этому нет необходимости использовать python-argparse или что-то еще подобное.<br>
<br>
Функция *setup()* из класса *CoolCheck()* выполняется первой при запуске программы. В ней мы как раз задаем аргументы, какие будет принимать наша проверка.<br>
<br>
В Функции *run()* уже выполняется сама проверка. Мы проверяем количество файлов в указанной директории, сравниваем с пороговыми значениями и выходим с соответствующим кодом выхода и сообщением.<br>
<br>
*Метрики*<br>
<br>
Адаптируем код проверки под метрику и вынесем код подсчета количества файлов в отдельную функцию.<br>
cool.py:<br>
<pre class="code">
from os import listdir
from os.path import isfile,join
def files_count(dir):
    onlyfiles = [ f for f in listdir(dir) if isfile( join(dir, f) ) ]
    size = len(onlyfiles)
     
    return size
</pre>
<br>
И сам плагин метрики. <br>
cool_metric.py:<br>
<pre class="code">
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from sensu_plugin import SensuPluginMetricGraphite
from cool import files_count
 
class CoolMetricGraphite(SensuPluginMetricGraphite):
    def setup(self):
      self.parser.add_argument(
        '-s',
        '--schema',
        required=True,
        type=str,
        help='Graphite schema'
      )
       
      self.parser.add_argument(
        '-d',
        '--directory',
        required=True,
        type=str,
        help='Path to directory'
      )
  
 
    def run(self):     
        size = files_count(self.options.directory)
        self.output(self.options.schema, size)
        self.ok()
 
 
if __name__ == "__main__":
     f = CoolMetricGraphite()
</pre>
<br>
Попробуем запустить:<br>
<pre class="code">
chmod +x cool_metric.py
./cool_metric.py -s `hostname -f`.tmp.files -d /tmp
example.com.tmp.files    2    1442480739
</pre>
<br>
Все отлично! Осталось только опакетить(не забывай только добавлять в зависимость sensu-plugin-python), привезти пакет на нужные хосты и  написать конфиг Sensu и повесить графитовый хандлер<br>
<pre class="code">
{
  "checks": {
    "cool_metrics": {
      "type": "metric",
      "handler": "graphite",
      "command": "/etc/sensu/plugins/other/cool.py -s \"`hostname -f`.tmp.files\" -d /tmp",
      "interval": 60,
      "subscribers": [
        "cool_hosts"
      ]
    }
  }
}
</pre>
<br>
Аналогично делаем для проверки.<br>
<br>
 <br>
<br>
Как видно – все очень просто. Если использовать код ниже по тексту, как шаблон, то при написании плагина можно сосредоточиться только на том, что нужно проверять и не думать о том, как распарсить командную строку, какой код выхода использовать, и.т.д.<br>
<br>
sensu-plugin-python реально упрощает жизнь.<br>
<br>
В следующий раз будем писать хандлер.<br>

]]>
</content:encoded></item>
<item><title>rsa и все все все</title><guid>kJqznr0VkD9FS32S2uhe</guid><pubDate>2015-09-10 21:48:40</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/kJqznr0VkD9FS32S2uhe#kJqznr0VkD9FS32S2uhe</link>
		<description>
		всем привет в новой эхе

подскажите какой-нибудь алгоритм шифрование и лёёёгонькую библиотечку python для него, чтобы был небольшой паблик-кей, какой-нибудь привейт-кей и можно было слать шифровки на паблик-кей

ща я пробую с python-rsa, в debian она есть, а вот в openbsd её нет ...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> All<br><br>
всем привет в новой эхе<br>
<br>
подскажите какой-нибудь алгоритм шифрование и лёёёгонькую библиотечку python для него, чтобы был небольшой паблик-кей, какой-нибудь привейт-кей и можно было слать шифровки на паблик-кей<br>
<br>
ща я пробую с python-rsa, в debian она есть, а вот в openbsd её нет :) но может есть способы проще<br>

]]>
</content:encoded></item>
<item><title>Re: регекспы</title><guid>J40zvJRhRgCygCVspYKB</guid><pubDate>2015-11-16 16:49:34</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/J40zvJRhRgCygCVspYKB#J40zvJRhRgCygCVspYKB</link>
		<description>
		RY&gt; а как сделать "или 8, или 20"?
Вроде бы, надо отдельные группы городить, но точно не уверен.

([A-Z]{8})|([A-Z]{20})
...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> Roman Yakovlev<br><br>
<span class="quote">RY&gt; а как сделать "или 8, или 20"?</span><br>
Вроде бы, надо отдельные группы городить, но точно не уверен.<br>
<br>
([A-Z]{8})|([A-Z]{20})<br>

]]>
</content:encoded></item>
<item><title>Вопрос знатокам эхотага</title><guid>I62wVg9amp1cUaT7A7uh</guid><pubDate>2016-01-21 09:10:13</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/I62wVg9amp1cUaT7A7uh#I62wVg9amp1cUaT7A7uh</link>
		<description>
		Сабж: если я разбиваю программу на несколько логически раздельных файлов, но хочу использовать одни и те же библиотеки в них, я должен импортировать их повторно в каждом файле. Насколько это экономично? Они подгружаются каждый раз отдельно?...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> All<br><br>
Сабж: если я разбиваю программу на несколько логически раздельных файлов, но хочу использовать одни и те же библиотеки в них, я должен импортировать их повторно в каждом файле. Насколько это экономично? Они подгружаются каждый раз отдельно?<br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>e0wiqgmJldq9mFGQvOHK</guid><pubDate>2015-09-10 22:01:52</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/e0wiqgmJldq9mFGQvOHK#e0wiqgmJldq9mFGQvOHK</link>
		<description>
		&gt;&gt;ps. ты, кстати, пишешь, на python2 а не python3 :) в python3 нет всех этих .decode, поэтому я даже не понимаю, почему оно работает (но в python3 я не вникал и не интересуюсь особо). по идее, это можно портировать на python2, надо будет попробовать
&gt;Ну фиг знает. Это кушает pyth...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> Andrew Lobanov<br><br>
<span class="quote">&gt;&gt;ps. ты, кстати, пишешь, на python2 а не python3 :) в python3 нет всех этих .decode, поэтому я даже не понимаю, почему оно работает (но в python3 я не вникал и не интересуюсь особо). по идее, это можно портировать на python2, надо будет попробовать</span><br>
<span class="quote">&gt;Ну фиг знает. Это кушает python3. И это я очень долго и упорно всё гуглил и обкатывал. И они таки есть. Потому как байт-массив из юникода не получается и потому приходится промежуточно транслировать всё в ascii. Уж не знаю тонкостей, но работает.</span><br>
<br>
именно поэтому я выбираю python2. там всё просто - str это байт-строка, unicode это unicode-строка. в python3 столько заморочек по этому поводу, что проще повеситься. поэтому, когда стоят такие задачи, python2 - то, что доктор прописал. а сейчас это в python2 не запускается :(<br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>9qWoOJIEI0BMCoRG0ZK2</guid><pubDate>2015-09-10 21:49:14</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/9qWoOJIEI0BMCoRG0ZK2#9qWoOJIEI0BMCoRG0ZK2</link>
		<description>
		&gt;всем привет!
Привет.

Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низ...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> Roman Yakovlev<br><br>
<span class="quote">&gt;всем привет!</span><br>
Привет.<br>
<br>
Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низкоуровневых реализаций, а значит моя высокоуровневая реализация таких штук "по-старинке" будет медленнее.<br>
<br>
Питон всё таки язык транслируемый и достаточно неторопливый.<br>

]]>
</content:encoded></item>
<item><title>Расстановка сообщений в эхе в правильном порядке</title><guid>9HiBigdFxArfwojJF2pf</guid><pubDate>2015-12-04 14:13:07</pubDate><author>vit01</author><link>https://idec.foxears.su/blog/9HiBigdFxArfwojJF2pf#9HiBigdFxArfwojJF2pf</link>
		<description>
		$ mkdir echo_new # и дальше

====
#!/usr/bin/python2
# -*- coding:utf8 -*-
from ii_functions import *
import os

echolist=os.listdir(indexdir)

for echo in echolist:
	print("doing "+echo)
	msgids=getMsgList(echo)
	msgs={}
	
	for msgid in msgids:
		msg=getMsg(msgid)
		msg["time"]=...
		</description>
		<content:encoded>
<![CDATA[
vit01 -> All<br><br>
$ mkdir echo_new # и дальше<br>
<br>
<pre class="code">
#!/usr/bin/python2
# -*- coding:utf8 -*-
from ii_functions import *
import os

echolist=os.listdir(indexdir)

for echo in echolist:
	print("doing "+echo)
	msgids=getMsgList(echo)
	msgs={}
	
	for msgid in msgids:
		msg=getMsg(msgid)
		msg["time"]=int(msg["time"])
		msgs[msgid]=msg
	
	def sortTime(msgid):
		return msgs[msgid].get("time")
	
	msgids.sort(key=sortTime)
	
	open("echo_new/"+echo, "w").write("\n".join(msgids)+"\n")
</pre>
<br>
ii_functions.py подойдёт отсюда <a href="https://github.com/vit1-irk/ii-db-utils" class="url">https://github.com/vit1-irk/ii-db-utils</a> или из Qt-клиента.<br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>74JRxeMXDJuKKSHlmPZR</guid><pubDate>2015-09-10 21:53:34</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/74JRxeMXDJuKKSHlmPZR#74JRxeMXDJuKKSHlmPZR</link>
		<description>
		&gt;&gt;всем привет!
&gt;Привет.

&gt;Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных ...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> Andrew Lobanov<br><br>
<span class="quote">&gt;&gt;всем привет!</span><br>
<span class="quote">&gt;Привет.</span><br>
<br>
<span class="quote">&gt;Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низкоуровневых реализаций, а значит моя высокоуровневая реализация таких штук "по-старинке" будет медленнее.</span><br>
<br>
<span class="quote">&gt;Питон всё таки язык транслируемый и достаточно неторопливый.</span><br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>2zWdbpVDvB9A8AOhEnVv</guid><pubDate>2015-09-11 09:49:56</pubDate><author>Roman Yakovlev</author><link>https://idec.foxears.su/blog/2zWdbpVDvB9A8AOhEnVv#2zWdbpVDvB9A8AOhEnVv</link>
		<description>
		&gt;Я привык считать приведение типов, работу с нетипизированными массивами (читай списками) медленными операциями. Определение длинны строки -- медленная операция. Но вот, например, классическая задачка по программированию: определить разряд числа. Классическим питон-решением являе...
		</description>
		<content:encoded>
<![CDATA[
Roman Yakovlev -> Andrew Lobanov<br><br>
<span class="quote">&gt;Я привык считать приведение типов, работу с нетипизированными массивами (читай списками) медленными операциями. Определение длинны строки -- медленная операция. Но вот, например, классическая задачка по программированию: определить разряд числа. Классическим питон-решением является:</span><br>
<br>
какое очевидное - такое и правильное :) дзен python :)<br>
<br>
со списками... поэтому у тебя в python аж три списка - list, tuple и set :) посмотри, с какой скоростью сравниваются два set-а по 200000 значений в них ;)<br>
<br>
<br>
не, я теорией не интересуюсь, мне важнее практика. какой вариант читабельнее - тот и лучше, pep8 и pep20 не зря являются основой основ :)<br>
<br>
<span class="quote">&gt;Вот и вопрос отсюда: как оптимальнее с точки зрения питона? Конечно, я бы мог написать несколько тестов для проверки этого факта, но всегда было интересно мнение непосредственно питонщиков по этому вопросу.</span><br>
<br>
мнение тех, кто постиг дао, дзен, pep8 и pep20, думаю, будет однозначным - какое читабельнее, то и лучше. для скорости - расширения C и разные numpy, а в обычных вещах никто на спичках экономить не будет (разумеется, если это не сверхнеоптимальное решение)<br>

]]>
</content:encoded></item>
<item><title>Re: эха про python</title><guid>0EdDbMIzkAAWRUfeq67n</guid><pubDate>2015-09-11 08:26:56</pubDate><author>Andrew Lobanov</author><link>https://idec.foxears.su/blog/0EdDbMIzkAAWRUfeq67n#0EdDbMIzkAAWRUfeq67n</link>
		<description>
		&gt;&gt;Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низкоуровневых реализаци...
		</description>
		<content:encoded>
<![CDATA[
Andrew Lobanov -> Roman Yakovlev<br><br>
<span class="quote">&gt;&gt;Сразу же вопрос: насколько оптимизированы всякие штуки, как то приведение типов или методы .split/.join? Просто порой мне начинает казаться, что я увязаю в болоте синтаксического сахара, но при этом не уверен, что внутри этого всего нет оптимизированных низкоуровневых реализаций, а значит моя высокоуровневая реализация таких штук "по-старинке" будет медленнее.</span><br>
<span class="quote">&gt;это идеология. :) всё, что укладывается в pep8 и pep20 - питоноугодно. всё, что нет - нет</span><br>
Поутру перечитал и решил добавить. Вопрос сугубо технический =) Если его перефразировать, то звучит примерно так:<br>
<br>
Я привык считать приведение типов, работу с нетипизированными массивами (читай списками) медленными операциями. Определение длинны строки -- медленная операция. Но вот, например, классическая задачка по программированию: определить разряд числа. Классическим питон-решением является:<br>
<br>
<pre class="code">
number_length(num):
    return len(str(num))
</pre>
<br>
если не вспоминать про проверку типа получаемых данных и прочие защиты от дурака.<br>
<br>
С точки зрения "классического" программирования это решение неэлегантно и неторопливо. Гораздо быстрее будет работать такой вариант:<br>
<br>
<pre class="code">
number_length(num):
    n = 0
    while num &gt; 0:
        n = n + 1
	num = num // 10
    return n
</pre>
<br>
Вот и вопрос отсюда: как оптимальнее с точки зрения питона? Конечно, я бы мог написать несколько тестов для проверки этого факта, но всегда было интересно мнение непосредственно питонщиков по этому вопросу.<br>
<br>
<span class="comment">P.S.: Кто-то классическое решение такой задачки мне даже лайкнул на checkio.org.</span><br>

]]>
</content:encoded></item>
</channel></rss>
