• На какой cms делать статический сайт-блог с html-результатом?

    sumej
    @sumej
    DevOps
    Я бы посмотрел на Hugo:
    Hugo is a general-purpose website framework. Technically speaking, Hugo is a static site generator. This means that, unlike systems like WordPress, Ghost and Drupal, which run on your web server expensively building a page every time a visitor requests one, Hugo does the building when you create your content. Since websites are viewed far more often than they are edited, Hugo is optimized for website viewing while providing a great writing experience.
    Hugo - документация.

    Я начал делать CMS для него но руки не доходят: https://github.com/weldpua2008/hugo-cms
    Ответ написан
    Комментировать
  • Unittest в корне python проекта?

    sumej
    @sumej Автор вопроса
    DevOps
    new_project
    ├── init__.py
    ├── antigravity/
    │ ├── __init__.py # make it a package
    │ └── antigravity.py
    └── test/
    ├── __init__.py # also make test a package
    └── test_antigravity.py

    test_antigravity.py:
    # import the package
    import antigravity

    python test_antigravity.py
    python test/test_antigravity.py
    И тут он падает и не может найти antigravity.
    А вот как это работает:
    $ cd new_project
    $ python -m unittest test.test_antigravity
    Ответ написан
    Комментировать
  • Как передать из python скрипта json для ajax запроса?

    sumej
    @sumej
    DevOps
    >сделать сайт учета студентов
    учёт оценок? посещаемости?
    >И какую бд лучше использовать если условия задания такого
    >Предполагаются частые выборки по фильтрам (включая комбинации): фамилия, группа, семестр, средний балл
    Поиск можно и через сфинкс можно и через майскуэль Полнотекстовый поиск и его возможности


    >Студенты могут часто переходить из одной группы в другую
    Не нагрузка.
    >Предполагаются частые выборки по фильтрам (включая комбинации): фамилия, группа, семестр, средний балл
    >Студентов будет много (порядка 1-2 млн)
    Если sql не справляется на SELECT. Тогда нужно будет думать =)

    >И как правильно вообще начинать писать без фреймворка?
    from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
    from os import curdir, sep
    
    PORT_NUMBER = 8080
    
    #This class will handles any incoming request from
    #the browser 
    class myHandler(BaseHTTPRequestHandler):
    	
    	#Handler for the GET requests
    	def do_GET(self):
    		if self.path=="/":
    			self.path="/index_example2.html"
    
    		try:
    			#Check the file extension required and
    			#set the right mime type
    
    			sendReply = False
    			if self.path.endswith(".html"):
    				mimetype='text/html'
    				sendReply = True
    			if self.path.endswith(".jpg"):
    				mimetype='image/jpg'
    				sendReply = True
    			if self.path.endswith(".gif"):
    				mimetype='image/gif'
    				sendReply = True
    			if self.path.endswith(".js"):
    				mimetype='application/javascript'
    				sendReply = True
    			if self.path.endswith(".css"):
    				mimetype='text/css'
    				sendReply = True
    
    			if sendReply == True:
    				#Open the static file requested and send it
    				f = open(curdir + sep + self.path) 
    				self.send_response(200)
    				self.send_header('Content-type',mimetype)
    				self.end_headers()
    				self.wfile.write(f.read())
    				f.close()
    			return
    
    
    		except IOError:
    			self.send_error(404,'File Not Found: %s' % self.path)
    
    try:
    	#Create a web server and define the handler to manage the
    	#incoming request
    	server = HTTPServer(('', PORT_NUMBER), myHandler)
    	print 'Started httpserver on port ' , PORT_NUMBER
    	
    	#Wait forever for incoming htto requests
    	server.serve_forever()
    
    except KeyboardInterrupt:
    	print '^C received, shutting down the web server'
    	server.socket.close()

    >Запись в эти таблицы будет вестись в конкурентом режиме доступа. Возможно нужно будет использовать блокировки либо всю работу спрятать в транзакции sql:
    import threading
    class Repository:
        def __init__(self):       
            self.__lock=threading.Lock()
       def add(self):
           with self.__lock:
                with open(self.config_path,"r") as json_data:
                    try:
                        data = json.load(json_data)
                    except:
                        logging.critical( "FATAL!!!can't read %s" % data)
                        raise ValueError("can't json.load(%s)" % data)

    import MySQLdb
    #Start a connection
    db= MySQLdb.connect(host="dbhost", user="dbuser" , passwd="dbpass", db="dbname")
    db.autocommit(False)
    cursor = db.cursor()
    try:
     cursor.execute("Your SQL")
     cursor.execute("Another sql")
     db.commit()
    except:
     db.rollback()

    запуск uwsgi --ini env.ini того же Flask/Falcon/etc
    env.ini:
    # it's example how run
    [uwsgi]
    plugins = python27
    http-socket = :80
    #pythonpath = /srv/myapp
    #virtualenv  = /home/project/ve
    chdir = /home/project
    processes = 1
    threads = 4
    #pythonpath = ..
    module = manager:app
    # This line below was important
    #wsgi-file = manager.py
    #callable = app
    # Turn this off for production
    catch-exceptions = true
    stats = /.tmp/.uwsgi-stats.socket
    touch-reload = /.tmp/.uwsgi-reload
    Ответ написан
    Комментировать
  • PIP или esay_install: что лучше?

    sumej
    @sumej
    DevOps
    Я пользуюсь pip. Тем не менее есть много подводных камней, примеры в статье "Почему я ненавижу virtualenv и pip перевод":
    pip каждый раз собирает из исходников

    Кажется, pip умышленно был лишён возможности easy_install устанавливать пакеты из бинарников (eggs). Несмотря на то, что распространение бинарников было значимой частью python-платформы и, кстати, вполне работоспособной, видимо, кто-то решил, что это плохая идея. Конечно, с точки зрения разработчиков, компиляция пакетов из исходников есть очевидное благо, которое позволяет им не компилировать предварительно пакет под каждую из всех поддерживаемых платформ (а переложить это на несомненно обрадованного этим пользователя — прим. пер.). Но компиляция становится злом в том случае, если целевых платформ немного, и вы точно знаете её/их и хотели бы собрать пакет заранее, избавившись от необходимости иметь компилятор на целевом компьютере

    Этот чёртов requirements.txt

    Те разработчики, которые пишут лишь приложения, не вполне понимают все особенности создания пакетов, поэтому, недолго думая, просто «захардкоживают» весь ассортимент используемых ими модулей в своё приложение, просто перечисляя их в requirements.txt, ведь это так удобно! Эти разработчики чаще всего просто советуют пользователям установить venv, а затем накатить в него свой пакет командой pip install -r requirements.txt.

    В результате мы имеем некоторое количество python-разработчиков, которые считают requirements.txt панацеей от всех проблем. Они даже никогда не узнают о существовании setuptools. Их легко покоряет кажущимся простым тупое перечисление ссылок на необходимые пакеты, лежащие где-то в недрах интернета: на сайтах или в системах контроля версий. Меня обескураживает их святая уверенность в «фантастической» прагматичности этого подхода и вытекающем отсюда желании пропагандировать использование virtualenv+pip как связки незаменимых инструментов для всех и каждого.

    URI в качестве путей к зависимостям это отстой

    setuptools позволяет вам указать имя и необходимую версию пакета, который по умолчанию скачивается с Pypi. Pypi обеспечивает индексацию, но вы можете создать и свой собственный индекс (в виде простых HTML страниц) и указать, что информацию следует извлекать в первую очередь из них, а не с сайта Pypi. Кто бы ни разработал эту технологию, он пытался предоставить разработчику возможность привязываться к именам пакетов, а не их физическому местоположению или веб-протоколу. И он мыслил правильно.
    Если вы в requirements.txt указываете путь к локальному файлу или к лежащему на каком-нибудь сайте тарболлу, по факту вы захардкоживаете эту ссылку. Хотя в данном случае лучшим выходом было бы использование репозитория пакетов. Который позволил бы людям, например, настроить зеркала на него в своей локальной сети. Кроме того, вы не можете указать минимальную версию, лишь только точную текущую. А в один прекрасный день тот самый файлик с пакетом переместится или удалится, в общем, пропадёт, и код внезапно перестанет работать. Совершенно очевидно, что мы этого не хотим, ведь так?

    Если вам по нраву pip freeze, с вами что-то не так
    У меня хорошо получается отслеживать свои зависимости и управлять ими. Я делаю это с помощью pip freeze. Команду pip freeze используют для того, чтобы убедиться, что никакие Python-зависимости не были упущены посреди цикла разработки. Если вы полагаете, что pip freeze выдаёт вам список зависимостей как раз для вставки в requirements.txt (который, напомню, не нужен) — тогда вы просто используете --no-site-packages (который тоже не нужен) при создании нового venv, и весь набор зависимостей всё равно получается глобально-системным, а не питоньим. А, и кроме того, таким образом не узнать, какие из ваших зависимостей установлены напрямую, а какие подтянуты другими.

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

    pip вполне подойдет.
    Установить пакет pip install MyProject
    Обновить пакет pip install --upgrade MyProject
    Установить определённую версию пакета pip install MyProject==1.0
    В общем:
    Usage:
      pip <command> [options]
    
    Commands:
      install                     Install packages.
      uninstall                   Uninstall packages.
      freeze                      Output installed packages in requirements format.
      list                        List installed packages.
      show                        Show information about installed packages.
      search                      Search PyPI for packages.
      wheel                       Build wheels from your requirements.
      zip                         DEPRECATED. Zip individual packages.
      unzip                       DEPRECATED. Unzip individual packages.
      help                        Show help for commands.
    Ответ написан
    Комментировать
  • Обезопасить прием pickle сообщений?

    sumej
    @sumej
    DevOps
    Я понимаю, что речь идёт про Exploiting Misuse of Python's "Pickle", Playing with Pickle Security.
    В данной статье он еще и медленный
    Don't Pickle Your Data:
    Pickle is slow

    Pickle is both slower and produces larger serialized values than most of the alternatives.
    To illustrate this, I put together a simple benchmark comparing pickle to the built in JSON module, the Apache Thrift library, and MessagePack. This benchmark measures the number of objects a second each of these libraries can read and write. The data being serialized here are just randomly generated fake 'Tweet' objects containing just four fields:

    Pickle is the clear underperformer here. Even the 'cPickle' extension thats written in C has a serialization rate thats about a quarter that of JSON or Thrift. Pickle also produces serialized values that are around double the size of Thrift or MessagePack.


    Но на что бы я обратил внимание:
    Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.


    Я думаю лучше поискать другое решение.
    Ответ написан
    Комментировать
  • Как настроить локальний сервер python на mac OS X?

    sumej
    @sumej
    DevOps
    Нужно узнать ип вашего компьютера и зайти по нему. Вроде бы по умолчанию ваш сервер будет на всех ип:
    #python -m SimpleHTTPServer 8000
    Serving HTTP on 0.0.0.0 port 8000 ...
    Mac OS X (10.4) - Finding the IP address and MAC a...
    Mac OS X (10.5.x, 10.6.x, 10.7.x, 10.8.x, 10.9.x, ...
    Ответ написан
    1 комментарий
  • Интернет магазин на python / django + cms взятся самому или отдать профессионалам?

    sumej
    @sumej
    DevOps
    Мне необходимо создать интернет магазин приблизительно такого функционала: https://canopy.co
    ....
    Стоит ли братся разбиратся в этом самому или лучше отдать дело опытным разработчикам. Ведь я могу не знать о многих подводных камнях учитывая , что будет происходить оплата

    WTF??? Необходимо или нет?
    Взять ответственность или нет? Судя по вопросу — появится в середине другой дядя и скажет, что ты не справишься и ты всё бросишь.
    Ответ написан
    Комментировать
  • Почему использование 'object.get_attribute()' лучше, чем object.attribute?

    sumej
    @sumej
    DevOps
    self.x - хм...
    pythoner.name/documentation/tutorial/classes/private
    В Python не существует "частных" (приватных) переменных экземпляра, т.е. тех, которые не могут быть доступны, кроме как изнутри объекта. Тем не менее есть соглашение, которое поддерживается большей частью кода Python: идентификатор с префиксом нижней черты (например _spam) должны рассматриваться как непубличная часть API (будь то функция, метод или элемент данных). Следует учитывать, детали реализации и предмет могут быть изменены без предварительного уведомления.
    Поскольку есть действительные прецеденты для приватных для класса идентификаторов (а именно, чтобы избежать конфликтов имен с именами, определенными подклассами), есть ограниченная поддержка такого механизма, называемого корректировкой имен (name mangling). Любой идентификатор вида __spam (по крайней мере с двумя первыми подчеркиваниями и не более чем одним завершающим) текстуально заменяются на _classname__spam, где имя класса - это текущее имя класса с начальным символом(ами) подчеркивания. Эта корректировка делается безотносительно к синтаксической позиции идентификатора тех пор, пока это происходит в определении класса.
    Корректировка имен полезна для того, чтобы позволить подклассам переопределять методы, не нарушая внутриклассовых вызовов методов. Например:
    class Mapping:
        def __init__(self, iterable):
            self.items_list = []
            self.__update(iterable)
     
        def update(self, iterable):
            for item in iterable:
                self.items_list.append(item)
     
        __update = update   # private copy of original update() method
     
    class MappingSubclass(Mapping):
     
        def update(self, keys, values):
            # provides new signature for update()
            # but does not break __init__()
            for item in zip(keys, values):
                self.items_list.append(item)
    Ответ написан
    Комментировать
  • Как правильно использовать отступы в python?

    sumej
    @sumej
    DevOps
    pastebin.com/UZf6vWz4
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import random
    
    number=random.randint(1, 10)
    
    hello = (str(raw_input("Жмакай Y, если хочешь сыграть в угадайку, ну или N, чтобы пропустить блок ")))
    running=True
    
    if hello == "Y":
        while running:
            try:
                guess = int(raw_input('Введите целое число : '))
            except KeyboardInterrupt:
                break
            except:
                print('Это не число. }:(')
                continue
            if guess == number:
                 print('Поздравляю, вы угадали.')
                 running = False # это останавливает цикл while
            elif guess < number:
                 print('Нет, загаданное число немного больше этого')
            else:
                 print('Нет, загаданное число немного меньше этого.')
    else:
        print('Завершение.')
    Ответ написан
    Комментировать
  • Docker, lxc и каша в голове или каким образом их лучше приготовить?

    sumej
    @sumej
    DevOps
    Привет
    Преследую 2 цели, изучить новые интересные технологии и организовать команду разработчиков.
    Что имею: выделенный сервер и root доступ. Что хочу получить develov машину и 3 ноды для разработчико

    Ты бы описал что там разработчики разрабатывают =) (сайты/софт/картинки)?

    Для разработки, ИМХО, нужно неизменное окружение разработчика + репозиторий, где храняться результаты работы. А так же отдельно должно быть тестовое окружение.

    Я обычно делаю окружение разработчика (то к чему нужно подключить IDE):
    • Если это динамический язык, то можно разрезать на докер-контейнеры: интерпретатор языка; сервера, необходимые для работы в своих контейнерах.
    • Если это компилируемый язык, то стараюсь держать всё как можно ближе и на одном контейнере. Дело в том, что держать mysql-dev пакет в одном контенере, а в другом mysql-server - глупо. С другой стороны, если есть некие сервисы, которые собираются с своими ключами, то их в отдельный контейнер(а лучше пакет).


    Вообще не важно будет ли у вас 10 контейнеров, или 1. Важно что в внутри. Например у вас есть django 1.4.18 и вы продолжаете разработку на 1.6.х. Что произойдет? Или у вас есть сайт, который писали во времена php 5.2.1, а в dev-окружении 5.2.26, что будет?

    По моему мнению у вас должно быть налажено чёткое соответствие окружения разработчика и продакшн. Автотесты на том же jenkins. А если вы меняете версию окружения разработчика - версия продукта так же меняется.

    ЗЫ:
    Всё это можно делать на docker/lxc/chroot/bare metal/etc — кои инструменты лишь. Мне кажется вы целей своих не понимаете.
    Ответ написан
    Комментировать
  • Как написать CLI client для golang daemon?

    sumej
    @sumej Автор вопроса
    DevOps
    Как работают cli для (допустим) Open vSwitch или других не сетевых демонов (в голову не приходят примеры)?
    Я уже задумался о реализации хранения в локальной базе: sqlite / xml files. Но как вызываются функции через cli не по сети?
    Ответ написан
    Комментировать
  • Как быстро сравнить файлы в Linux, получить дельту и потом по ней откатить/восстановить изменения?

    sumej
    @sumej Автор вопроса
    DevOps
    Нашёл ответ: overlayfs, но у него одна проблема - поддержка вложенного монтирования
    Ответ написан
    Комментировать