• Как сделать команду для шифрования сообщения?

    igorzakhar
    @igorzakhar
    ...
    s64 = base64.b64encode(b64)
    ...

    Аргумент b64 должен быть "bytes-like object". У тебя b64 это строка.
    b64 = text.split(' ')[-1]
    b64_to_bytes = str.encode(b64)
    s64 = base64.b64encode(b64_to_bytes)
    Ответ написан
    Комментировать
  • Стоит ли читать все разделы у Лутца?

    igorzakhar
    @igorzakhar
    Нет. Можно использовать как справочник по языку.
    Ответ написан
    Комментировать
  • Можно ли эти строки привести в читабельный вид?

    igorzakhar
    @igorzakhar
    Запускаешь, вводишь строку "CC{Maybe_long_but_not_so_wise_snek}", результат "Good", при любом другом вводе "Bad".
    Зашифрованный код:
    print(["Bad","Good"][int(input() == "CC{Maybe_long_but_not_so_wise_snek}")])


    >>> s = """))'''ALkFbIzIDWE}vJ=`}vJ?ehgP>fRpMXe4yS(`@HO|F;5SGcG)GsLhMM;cf-OzbU4S<EwNMdXzMMTSMgG<ev4SKoG)G)KN-O|ukDG@nm4SH(^nMkEE-OO#kDG1uv4SfPM*GdFYMMgEE-O+MU4S@=J;OZ}zfGSvD-Ouc@ePWS`fGVQW-O%8E-Oyl1fPpA`fGtWj^M1*kDGwoAfPpT0pMjLhMMMr=eGqs3NMqJM*GrKR^MO7`EGfVm4SXbM*Gp2{+Oz{D-OsoAfPbg_nMnEI^MBiqEGYoAfPo1rEGu134S8f_fG;of-O-8wNMh{-+OkilDGvNN-OkilDGXKR^M7WqEG;u@ePeQlDG{h&4SM}_fG?bv4SxRqMM!)bfPRMMgGqUqMM@=J;Oy!SfPO7`EG)KN-OUoG)Gz7C4S|ukDG!TW-OyOP`Lqo)-O|ukDG;tv4S$m_nMjLhMMAH=eG)u@ePjKE-OiLhMMzQJ;O*JU4SvS`fGNd+MMaQJ;O1uv4SvS`fGNd+MMhQf-O*JU4SvS`fGNd+MMkuJ;O{h&4S|}@iOvd+MMSG`fG!of-OkilDGkXzMMiKE-OjRqMM|}@iO$KN-OET=eG$)AfPqg~oMq#LNMkuJ;ObRqMMFQlDGrEE-OM}_fG)oAfP)50pMzcs^MET=eGuWf-OWoC*G}yoySB2k;O%7+3Se`k;O&V-xSZ=q)G0c%;Ojnn*G;G{?Cn+VjYebR&a*?ejfYz*%aL(}ZAC+IAa<{scG7CIoWCuw6c|#ByaFD8aAB+f7b*c+nC6J*Sbn4|?C1b9)Z1U*YbP9r1b-a9)Z~B(nWt{03b-a9)ZLb#&aC+D>X'''(cеxe(cexe;cеxe sa edoced58b tropmi 46esab morf"""
    >>> s[::-1]
    "from base64 import b85decode as exеc;exec(exеc('''X>D+Ca&#bLZ)9a-b30{tWn(B~Z)9a-b1r9PbY*U1Z)9b1C?|4nbS*J6Cn+c*b7f+BAa8DFayB#|c6wuCWoIC7Gcs{<aAI+CAZ}(La%*zYfje?*a&RbeYjV+nC?{G;G*nnjO;%c0G)q=ZSx-V&O;k`eS3+7%O;k2BSyoy}G*CoWO-fWuGe=TEM^sczMp05)PfAo)Gf_}MO-EErGDlQFMMqRbO;JukMNL#qMo~gqPfA)$Ge=TEO-NK$Oi@}|MMqRjO-EKiMMzXkGDlikO-fo!Gf`GSMM+dvOi@}|S4&h{O;JukMM+dNGf`SvS4UJ*O-fQhMM+dNGf`SvS4vu1O;JQaMM+dNGf`SvS4UJ*O;JQzMMhLiO-EKjPe@u)Ge=HAMMhLjMn_m$S4vt;GDku|O-)oqL`POyO-WT!GDku|S4C7zG)GoUO-NK)GE`7OPfS!yO;J=@MMqUqGgMMRPfb)!MMqRxS4vb?Gf_}MS4&h{GDlQePe@u;GEqW7M^RKXGDlikO-NNvGDlikO+-{hMNw8-O-fo;Gf_f8S431uGEr1oPfAoYGEqiBM^IEnMn_gbPfAosO-D{zO+{2pG*MbXS4mVfGE`7OM^RKrG*MJqMN3sqGe=rMMMhLjMp0TpPfAowGDk*1M^jWtGf`ApPf1lyO-E8%O-WQVGf`SWPe@cuO-DvSGfz}ZO;J=@S4UM+O-EEgMMYFdG*MPfS4vu1GDk#OO-EEkMn^(HS4mn@GDku|O-NK)G)GoKS4ve<GgMSTMMzXdMNwE<S4UbzO-fc;MMhLsG)GcGS5;F|OH@`(Sy4eXMpRf>Pghe?Jv}`=Jv}EWDIzIbFkLA'''))"
    >>> from base64 import b85decode as exеc
    >>> exеc('''X>D+Ca&#bLZ)9a-b30{tWn(B~Z)9a-b1r9PbY*U1Z)9b1C?|4nbS*J6Cn+c*b7f+BAa8DFayB#|c6wuCWoIC7Gcs{<aAI+CAZ}(La%*zYfje?*a&RbeYjV+nC?{G;G*nnjO;%c0G)q=ZSx-V&O;k`eS3+7%O;k2BSyoy}G*CoWO-fWuGe=TEM^sczMp05)PfAo)Gf_}MO-EErGDlQFMMqRbO;JukMNL#qMo~gqPfA)$Ge=TEO-NK$Oi@}|MMqRjO-EKiMMzXkGDlikO-fo!Gf`GSMM+dvOi@}|S4&h{O;JukMM+dNGf`SvS4UJ*O-fQhMM+dNGf`SvS4vu1O;JQaMM+dNGf`SvS4UJ*O;JQzMMhLiO-EKjPe@u)Ge=HAMMhLjMn_m$S4vt;GDku|O-)oqL`POyO-WT!GDku|S4C7zG)GoUO-NK)GE`7OPfS!yO;J=@MMqUqGgMMRPfb)!MMqRxS4vb?Gf_}MS4&h{GDlQePe@u;GEqW7M^RKXGDlikO-NNvGDlikO+-{hMNw8-O-fo;Gf_f8S431uGEr1oPfAoYGEqiBM^IEnMn_gbPfAosO-D{zO+{2pG*MbXS4mVfGE`7OM^RKrG*MJqMN3sqGe=rMMMhLjMp0TpPfAowGDk*1M^jWtGf`ApPf1lyO-E8%O-WQVGf`SWPe@cuO-DvSGfz}ZO;J=@S4UM+O-EEgMMYFdG*MPfS4vu1GDk#OO-EEkMn^(HS4mn@GDku|O-NK)G)GoKS4ve<GgMSTMMzXdMNwE<S4UbzO-fc;MMhLsG)GcGS5;F|OH@`(Sy4eXMpRf>Pghe?Jv}`=Jv}EWDIzIbFkLA''')
    b'import codecs;exec(codecs.getencoder(\'rot-13\')("sebz onfr64 vzcbeg o32qrpbqr nf rkr\xd1\x81;rkrp(rkr\xd1\x81(\'ZI4TXLMVZW4KVMYOBWMTP6WBZMMT63YVZI4PDWMJTL3GRAGTTMFQRZOJTV3QPAMGTL2GTAEGTDMQNAEMTMFQBZOJZL3GRAMHTVLQZZEGTLMGVAEHTL2GZZMJZL3QVAEITVLQZZWKTZMQNAEIT43QZZWGTRMJRAEIT43QZZWJZZMQDAEIT43QZZWGTRMQDZEFTLMGVBOHZR3GNAEFTMFGXZWJZL2GBAMMTEDGVZMIUR2GBAWETL4GVLMHTZ2TPAOLTLMQTZEGUR3TRAOMTMEGTZWJTV3QPAWKTZ2GTZOHZV2QBAGQT42GZZMHUN2GZZMDTEEQVZMJZV3QBAWDTH2QTZOJT42QFAGPTEFGVAOJTHMGNZMETL4QZAWIT42TPAGQTH4QTZEKUN3GZAEFTMFQZAOJTL2GFAGSTH3QTZOIUNMGRZMIT43QZAOHTLMGFA3OTLMQTZWGURMGTAEETH4QVMWJZZ2GDZMGTEFGBAWIZR2GBAMHTZ4GVBWJUR3TTAEHTEEQXZWGZDMJVZEFTV4GRBWUSRKTVMYQA5FTXXOWSR======\'))")[0])'
    >>> import codecs
    >>> codecs.getencoder('rot-13')("sebz onfr64 vzcbeg o32qrpbqr nf rkr\xd1\x81;rkrp(rkr\xd1\x81(\'ZI4TXLMVZW4KVMYOBWMTP6WBZMMT63YVZI4PDWMJTL3GRAGTTMFQRZOJTV3QPAMGTL2GTAEGTDMQNAEMTMFQBZOJZL3GRAMHTVLQZZEGTLMGVAEHTL2GZZMJZL3QVAEITVLQZZWKTZMQNAEIT43QZZWGTRMJRAEIT43QZZWJZZMQDAEIT43QZZWGTRMQDZEFTLMGVBOHZR3GNAEFTMFGXZWJZL2GBAMMTEDGVZMIUR2GBAWETL4GVLMHTZ2TPAOLTLMQTZEGUR3TRAOMTMEGTZWJTV3QPAWKTZ2GTZOHZV2QBAGQT42GZZMHUN2GZZMDTEEQVZMJZV3QBAWDTH2QTZOJT42QFAGPTEFGVAOJTHMGNZMETL4QZAWIT42TPAGQTH4QTZEKUN3GZAEFTMFQZAOJTL2GFAGSTH3QTZOIUNMGRZMIT43QZAOHTLMGFA3OTLMQTZWGURMGTAEETH4QVMWJZZ2GDZMGTEFGBAWIZR2GBAMHTZ4GVBWJUR3TTAEHTEEQXZWGZDMJVZEFTV4GRBWUSRKTVMYQA5FTXXOWSR======\'))")
    ...
    ...

    И так далее по цепочке.
    Ответ написан
    3 комментария
  • В чем различие между > и >> в linux системах?

    igorzakhar
    @igorzakhar
    Это называется перенаправление ввода/вывода.
    • > file - Направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существовал, то будет перезаписан;
    • >> file - Направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
    Ответ написан
    Комментировать
  • Литература для понимания программирования?

    igorzakhar
    @igorzakhar
    Для меня, самыми полезными, в этом плане, оказались:
    1. "Код. Тайный язык информатики" (Чарльз Петцольд). Можно начать с главы 9 "За битом бит";
    2. Программирование: введение в профессию. Том 1: аз...(в электронном варианте распространяется бесплатно. www.stolyarov.info/books/pdf/progintro_vol1.pdf).

    UPD.
    + Было не лишним, лично для меня, чтение некоторых глав из книг «Архитектура компьютера» (Э. Таненбаум, Т. Остин) и "Современные операционные системы" (Э.Таненбаум, Х. Бос).
    Ответ написан
    4 комментария
  • Почему не работает import в Python?

    igorzakhar
    @igorzakhar
    import test_function
    
    test_function.abc()
    Ответ написан
    Комментировать
  • Как поднять сервер в облаке на Python?

    igorzakhar
    @igorzakhar
    5b8aff214494c839016206.png
    Создаем проект:

    5b8b07ea063a0909800095.png
    Создаем "Connection" (есть разные варианты, для демонстрации выбрал "Container"):

    5b8b0859863f2023745808.png
    После создания появится информация по контейнеру, где указаны ссылки по которым будет доступно ваше приложение:

    5b8b0a661c451431277275.png
    Создаем файл "File" -> "New File" (есть вариант "перетащить" файл со своего ПК). Вставляем ваш код:

    5b8b0ae6b9c74190622126.png
    Корректируем (вместо "localhost" прописываем "0.0.0.0" и выбираем порт из диапазона 1024-9999):

    from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
    
    class HttpProcessor(BaseHTTPRequestHandler):
        def do_GET(self):
            self.send_response(200)
            self.send_header('content-type','text/html')
            self.end_headers()
            self.wfile.write("hello!")
    serv = HTTPServer(("0.0.0.0",8080),HttpProcessor)
    serv.serve_forever()

    Запускаем скрипт:

    5b8b0cad545b2969483508.png
    Переходим по ссылке которая указана в "Info" (протокол "http"), не забываем указать порт (в нашем случае 8080):

    5b8b01977adb3008278544.png
    Ответ написан
    3 комментария
  • Почему команда pybabel выдает ошибку?

    igorzakhar
    @igorzakhar
    Попробуй обновить "pip":
    pip install -U pip --force-reinstall

    В оригинальной версии этого туториала можно найти комментарий самого Мигеля Гринберга по этой ошибке (комментарий #71):
    I believe the error that you have was a bug in pip. You may want to try upgrading the pip that you have in your virtual environment.

    https://blog.miguelgrinberg.com/post/the-flask-me...
    Ответ написан
    Комментировать
  • Python Decimal и хранение денег в базе?

    igorzakhar
    @igorzakhar
    Ответ написан
    Комментировать
  • Htmlspecialchars в golang?

    igorzakhar
    @igorzakhar
    Пример из документации к пакету "html" (https://golang.org/pkg/html/):
    package main
    
    import (
    	"fmt"
    	"html"
    )
    
    func main() {
    	const s = `"Fran & Freddie's Diner" <tasty@example.com>`
    	fmt.Println(html.EscapeString(s))
    }

    Вывод:
    &#34;Fran &amp; Freddie&#39;s Diner&#34; &lt;tasty@example.com&gt;
    Ответ написан
    1 комментарий
  • Как увеличить производительность скрипта?

    igorzakhar
    @igorzakhar
    Разбор задачи на Reddit https://www.reddit.com/comments/zaa0v.
    Адаптировал под случай который указан в условии:
    прямоугольник определяется значениями (x1, y1, x2, y2), где (x1, y1) - верхний левый угол, (x2, y2) - правый нижний угол.
    x1,y1───────────┐
        │           │
        │           │
        │           │
        │           │
        └───────────x2,y2

    Алгоритм слудующий: находим сумму площадей всех прямоугольников и эту сумму вычитаем из площади полотна.
    Площадь прямоугольника, в нашем случае, равна (x2 - x1) * (y1 - y2).

    Случай 1. Прямоугольники не пересекаются.
    Прямоугольники (0,3,4,0), (4,7,7,3) и (7,3,10,0) будут выглядеть примерно так:
            * * * 
            * * * 
            * * *
            * * *
    * * * *       * * *
    * * * *       * * *
    * * * *       * * *

    Общая площадь этих трех прямоугольников проста для вычисления, это всего лишь сумма площадей каждого отдельного прямоугольника: (4 * 3) + (3 * 4) + (3 * 3)

    Случай 2. Прямоугольники пересекаются, общее пересечение имеют 2 прямоугольника.
    Рассмотрим три прямоугольника (0,3,4,0), (2,5,5,1) и (4,7,7,4):
            * * * 
            * * * 
        * * + * * 
        * * *     
    * * + + *      
    * * + + *      
    * * * *

    Вы видите, что прямоугольники пересекаются (области, где они пересекаются, отмечены символом "+" вместо "*"). Поэтому, если мы просто вычислим сумму площадей, как мы делали раньше, 12 + 12 + 9, мы получим слишком большое значение (33 вместо 28), потому что мы рассчитываем области с пересечением дважды.
    Чтобы получить правильный ответ, мы должны вычесть области, в которых пересекаются два прямоугольника: (12 + 12 + 9) - (4 + 1) = 28.

    Случай 3. Общее пересечение имеют сразу несколько прямоугольников.
    Рассмотрим прямоугольники (0,3,4,0), (2,5,5,1) и (3,3,0,6)
        * * *
        * * *     
    * * + x + *      
    * * + x + *   
    * * * + * *

    Теперь три прямоугольника перекрываются в точках, отмеченных символом "x" (как и раньше, знак "+", где перекрываются только два прямоугольника). Сумма площадей всех трех треугольников: 12 + 12 + 9. Затем мы должны вычесть сумму всех площадей, где пересекаются два прямоугольника 4 + 3 + 4 (прямоугольники 1 и 2 пересекаются в области с площадью 4, прямоугольники 1 и 3 пересекаются в области с площадью 3, и прямоугольники 2 и 3 пересекаются в области с площадью 4). Мы получили (12 + 12 + 9) - (4 + 3 + 4).
    Однако, вычитая все области пересечения двух прямоугольников, мы вычитаем область, в которой три прямоугольника пересекаются (обозначено "x"), три раза. Поэтому мы должны добавить площадь пересечения трех прямоугольников, чтобы получить правильный результат. Таким образом, общая площадь, покрытая прямоугольниками:
    A = (12 + 12 + 9) - (4 + 3 + 4) + (2) = 33 - 11 + 2 = 24

    Общее правило, на самом деле, довольно простое. Если S1 - сумма площадей всех прямоугольников, S2 - сумма всех областей, где пересекаются два прямоугольника, S3 - сумма всех областей, где пересекаются три прямоугольника, S4 - сумма всех областей, где пересекаются четыре прямоугольника и т.д., значение общей площади равно:
    A = S1 - S2 + S3 - S4 + S5 - S6 + S7 - S8 + ...
    Это известно в математике как принцип включений-исключений, потому что вы чередуете включение и исключение областей.
    Значения в нашем примере соответствуют:
    S1 = 12 + 12 + 9 
    S2 = 4 + 3 + 4  
    S3 = 2

    Пример вычисления с использованием рекурсии

    def bounding_box(rects):
        return (min(r[0] for r in rects),
                max(r[1] for r in rects),
                max(r[2] for r in rects),
                min(r[3] for r in rects))
    
    
    def area(rect):
        a, b, c, d = rect
        return (c - a) * (b - d)
    
    
    def clip(bb, rects):
        if not rects:
            return []
    
        (x1, y1, x2, y2) = rects[0]
        rs = rects[1:]
        (a1, b1, a2, b2) = bb
    
        if a1 == a2 or b1 == b2:
            return []
    
        if a1 >= x2 or a2 <= x1 or y1 <= b2 or y2 >= b1:
            return clip(bb, rs)
    
        result = [(max(a1, x1), min(b1, y1), min(a2, x2), max(b2, y2))]
        return result + clip(bb, rs)
    
    
    def cover(bb, rects):
    
        if not rects:
            return 0
        rc = rects[0]
        rs = rects[1:]
    
        (a1, b1, a2, b2) = bb
        (x1, y1, x2, y2) = rc
    
        top = (a1, b1, a2, y1)
        bottom = (a1, y2, a2, b2)
        left = (a1, y1, x1, y2)
        right = (x2, y1, a2, y2)
    
        sum_area = sum(cover(x, clip(x, rs)) for x in [top, bottom, left, right])
        return area(rc) + sum_area
    
    
    def main():
        width_canvas = 10
        height_canvas = 10
    
        rect1 = (0, 3, 4, 0)
        rect2 = (2, 5, 5, 1)
        rect3 = (3, 3, 6, 0)
        rs = [rect1, rect2, rect3]
    
        painted_area = cover(bounding_box(rs), rs)
        canvas_area = width_canvas * height_canvas
        unpainted_area = canvas_area - painted_area
    
        print("Canvas area:", canvas_area)
        print("Painted area:", painted_area)
        print("Unpainted area:", unpainted_area)
    
    
    if __name__ == '__main__':
        main()



    Код на GitHub Gist
    Код на GitHub с тестами
    Ответ написан
    Комментировать
  • Насколько актуальны данные книги (JavaScript, ООП, Python)?

    igorzakhar
    @igorzakhar
    5. Python [азы]. Если совсем азы, то есть что-то вроде методички "Федоров, Д. Ю. Основы программирования на примере языка Python"(распространяется бесплатно: https://dfedorov.spb.ru/python3/book.pdf). В электроном варианте всего 155 страниц. Ссылка на сайт
    Вариант 6. "Код. Тайный язык информатики"(Чарльз Петцольд), я думаю, ещё долго будет актуальна. Сюда бы ещё добавил Программирование: введение в профессию. Том 1: аз...(в электронном варианте распространяется бесплатно. www.stolyarov.info/books/pdf/progintro_vol1.pdf)
    Ответ написан
    Комментировать
  • Как в Flask-Admin реализовать права для добавления пользователей с определенной ролью?

    igorzakhar
    @igorzakhar
    Может быть тебе поможет книга "Разработка веб-приложений с использованием Flask на языке Python" (Мигель Гринберг). Глава 9 - "Роли пользователей". Книга в pdf есть в сети.
    Ответ написан
    1 комментарий
  • Как понять рекурсию в Python?

    igorzakhar
    @igorzakhar
    def listsum(numList):
       if len(numList) == 1:
            return numList[0]
       else:
            return numList[0] + listsum(numList[1:])
    
    print(listsum([1,3,5,7,9]))

    sumlistIn.pngsumlistOut.png
    aliev.me/runestone/Recursion/CalculatingtheSumofaL...
    Там, где примеры кода, нажмите кнопку "Show in Codelens" и можно пошагово посмотреть выполнение кода на python.
    Ответ написан
    Комментировать
  • Как открыть изображение из таблицы Postgresql?

    igorzakhar
    @igorzakhar
    Библиотека Pillow тебе в помощь:
    $ pip install Pillow

    from PIL import Image
    import io
    
    image_data = ... # байты картинки
    image = Image.open(io.BytesIO(image_data))
    image.show()
    Ответ написан
    Комментировать
  • Как сохранять списки в файл и доставать их из файла?

    igorzakhar
    @igorzakhar
    >>> data = [('config.h', '.\\mb_config.h', '83A7A716'), ('mainCpp.cpp', '.\\mainCpp.cpp', '30FCD925')]
    >>> import pickle
    >>> with open('data.pickle', 'wb') as fp:
    ...     pickle.dump(data, fp)
    ... 
    >>> with open('data.pickle', 'rb') as fp:
    ...     data_new = pickle.load(fp)
    ... 
    >>> data_new
    [('config.h', '.\\mb_config.h', '83A7A716'), ('mainCpp.cpp', '.\\mainCpp.cpp', '30FCD925')]
    Ответ написан
    1 комментарий
  • Объясните новичку про модули и библиотеки?

    igorzakhar
    @igorzakhar
    Мне понравилось как здесь изложено:
    Питон: импорт и модули - часть 1.
    Питон: импорт и модули - часть 2.

    + Никто не отменял классику "Изучаем Python" Марк Лутц.
    Ответ написан
    Комментировать
  • Как правильно выставить прокси вида user:pass@host:port?

    igorzakhar
    @igorzakhar
    Опущена обработка ошибок.
    import (
    	"net/http"
    	"net/url"
    )
    
    func main() {
    
    	urlStr := "http://..."
    
    	request, err := http.NewRequest("GET", urlStr, nil)
    	proxyURL, err := url.Parse("http://username:password@host:port")
    
    	transport := &http.Transport{
    		Proxy: http.ProxyURL(proxyURL),
    	}
    
    	client := &http.Client{
    		Transport: transport,
    	}
    
    	response, err := client.Do(request)
    
    }
    Ответ написан
    Комментировать
  • Как бы вы начали обучение go?

    igorzakhar
    @igorzakhar
    Я начал с книг:
    1. "Язык программирования Go" Алан А. А. Донован, Брайан У. Керниган.
    2. «Go на практике» Мэтт Батчер, Мэтт Фарина


    Плюс статьи с habr:


    Так же на coursera есть курсы:
    Ответ написан
    Комментировать