Echo :: Forum :: Blog :: RSS
webbrowser [3]
Re: webbrowser
vit01(mira, 1) — vit01
2016-08-10 18:14:20


Можно ещё избежать всех этих проблем, добавив в конфиг параметр для браузера.

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

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

browser termux-open-url
или
browser iceweasel

GenericBrowser в сабже устроен так, что просто вызывает команду с аргументом. Так что опция в конфиге может стать полезной не только андроидоводам + позволит избежать костылей в коде.

Списки в функциях питона [1]
Re: Списки в функциях питона
vit01(mira, 1) — Difrex
2017-08-14 20:29:15


Нихрена се. Интересное наблюдение.

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

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

count всегда будет 0, потому что он примитив, а не полноценный объект, значит передаётся значением, а не по указателю

// В джаве у меня иногда встречались подобные путаницы. Там поведение такое же

Книги [0]
Книги
btimofeev(tavern,13) — All
2017-04-06 20:53:22


ХамблБандл распродают книги по python: https://www.humblebundle.com/books/python-book-bundle

И снова по импорту [1]
Re: И снова по импорту
vit01(mira, 1) — vit01
2016-01-22 09:54:16


Вопрос: как сделать декоратор для подобной функции при поведении from module import * ?

Пишем хандлер для Sensu [0]
Пишем хандлер для Sensu
Difrex(mira, 14) — All
2016-01-28 16:53:28


Как и обещал, будем разбирать процесс создания хандлера.

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

Рассмотрим ситуацию, когда нам надо запускать хандлер на события OK и CRITICAL. Пример конфигурации:
{
  "checks": {
    "cpu": {
      "handlers": ["email"],
      "command": "/etc/sensu/plugins/system/check-cpu.rb",
      "interval": 60,
      "subscribers": [
        "base"
      ]
    }
  }
}

Проверка запускается раз в 60 секунд.
{
    "handlers": {
        "email": {
            "type": "pipe",
            "command": "/etc/sensu/handlers/notification/mailer.pl",
                "severities": ["critical", "ok"]
        }
    }
}
При наступлении события смены состояния чека ok<->critical выхлоп проверки в формате JSON отправится на STDIN программе mailer.pl.

Как же выглядит выхлоп? А вот так:
$VAR1 = {
          'check' => {
                       'status' => 2,
                       'handlers' => [
                                       'test'
                                     ],
                       'subscribers' => [
                                          'test'
                                        ],
                       'interval' => 60,
                       'history' => [
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
... [>>>]

Вопрос знатокам эхотага [3]
Re: Вопрос знатокам эхотага
Рома(lenina,148) — Andrew Lobanov
2016-01-21 09:31:57


> Они подгружаются каждый раз отдельно?

нет

регекспы [3]
Re: регекспы
Andrew Lobanov(station13, 1) — Рома
2016-01-22 08:56:15


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

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

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

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

// Спасибо flame из инстедоконфы.

Код, возвращаемый приложением [2]
Re: Код, возвращаемый приложением
Andrew Lobanov(station13, 1) — vit01
2016-03-21 16:36:48


> Но вот зачем...

Во-первых, это может быть полезно для моих других проектов. Во-вторых, я уверен, что скрестив два подхода я получу более полезное поведение цезия (психологически получается так, что если я не сохранял сообщение, то оно и не уйдёт). При этом старое поведение (сохранение пустого сообщения) я убирать не собираюсь пока. Если ничего путного не выйдет, то в апстрим всё равно эти изменения не пущу.

sqlite3 [4]
Re: sqlite3
Andrew Lobanov(tavern,1) — vit01
2016-06-13 11:38:08


AL>> У тебя есть какие-нибудь наработки по формату базы? Может, есть смысл посмотреть в сторону твоей реализации ноды?

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

Примерно так ж поступил и я. Всё отлично работает, кроме подсчёта количества сообщений. Ладно. Буду дальше думать.

filler у операции % [0]
filler у операции %
Andrew Lobanov(tavern,1) — All
2016-04-26 11:10:27


Если я хочу сделать отступ при выводе информации, то я использую нечто вроде

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

Но при этом между символами 1 и 2 будут пробелы. Как заполнить пространство между ними произвольным символом без написания своей функции форматирования и возможно ли это в принципе?

Ликвидируем дубли в эхах по сабжу и тексту сообщения [0]
Ликвидируем дубли в эхах по сабжу и тексту сообщения
vit01(mira, 1) — All
2015-12-05 19:00:54


#!/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>0:
				print("doubles: "+str(doubles))
				open("echo_new/"+echo, "w").write("\n".join(msgids)+"\n")

rsa и все все все [3]
Re: rsa и все все все
Difrex(mira, 14) — Roman Yakovlev
2015-09-14 16:33:31


Дергай gpg. У GPG стандартизированный API и он есть везде.

Qt и QProgressDialog [1]
Re: Qt и QProgressDialog
vit01(mira, 1) — vit01
2016-01-08 14:19:13


vit01> после этого эхи стали открываться раз в 5 дольше, чем без него.

Понял, в чём была проблема.
Когда решил вынести это дело в отдельный поток и попробовать снова, результат оказался точно таким же. Как оказалось, тормоза вызывало не обновление прогрессбара, а прорисовка QListWidget. Да, да, который был во время этого процесса бесполезен. Так что я теперь просто скрываю MainWindow во время подгрузки данных, а после этого опять делаю видимым, и всё работает нормально.

эха про python [7]
Re: эха про python
Andrew Lobanov(station13, 1) — Roman Yakovlev
2015-09-10 21:57:11


>ps. ты, кстати, пишешь, на python2 а не python3 :) в python3 нет всех этих .decode, поэтому я даже не понимаю, почему оно работает (но в python3 я не вникал и не интересуюсь особо). по идее, это можно портировать на python2, надо будет попробовать
Ну фиг знает. Это кушает python3. И это я очень долго и упорно всё гуглил и обкатывал. И они таки есть. Потому как байт-массив из юникода не получается и потому приходится промежуточно транслировать всё в ascii. Уж не знаю тонкостей, но работает.

Пишем плагин для Sensu [0]
Пишем плагин для Sensu
Difrex(mira, 14) — All
2015-10-13 13:47:54


Думал, куда бы перетащить эту статью -- в linux.14 или в python.15. Решил остановиться на питоне.

Итак:

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

Нам потребуется пакет sensu-plugin-python. Ставим его. У меня он опакечен, вам же предстоит это делать самому. Взять его можно на гитхабе: https://github.com/sensu/sensu-plugin-python.git.

*Пишем проверку*

#!/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 < self.options.warning:
      self.ok() # Exit code 0
    elif size >= self.options.warning and size < self.options.critical:
      self.warning('Files count ' + str(size)) # Exit code 1
    elif size >= self.options.critical:
      self.critical('Files count ' + str(size)) # Exit code 2
    else:
      self.unknown('Unknown error')
 
if __name__ == "__main__":
  f = CoolCheck()

SensuPluginCheck уже предоставляет нам парсер командной строки по-этому нет необходимости использовать python-argparse или что-то еще подобное. ... [>>>]

Расстановка сообщений в эхе в правильном порядке [0]
Расстановка сообщений в эхе в правильном порядке
vit01(mira, 1) — All
2015-12-04 14:13:07


$ 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"]=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")

ii_functions.py подойдёт отсюда https://github.com/vit1-irk/ii-db-utils или из Qt-клиента.