пятница, 19 сентября 2014 г.

Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Пусть мы хотим вычислить десятимиллионное число Фибоначчи программой на Python. Функция, использующая тривиальный алгоритм, на моём компьютере будет производить вычисления более 25 минут. Но если применить к функции специальный оптимизирующий декоратор, функция вычислит ответ всего за 18 секунд (в 85 раз быстрее):


вторник, 17 июня 2014 г.

Настройка удаленного интерпретатора на Pycharm для Django



В этой статье хочу рассказать, а также показать настройку полезного инструмента для удаленной разработки от компании JetBrains встроенное в IDE Pycharm. Такой инструмент есть уже давно, но многие разработчики относятся к этому не серьезно, и для внесения изменений в проект предпочитают разворачивать его локально. Когда намного легче на том-же сервере, сделать копию части проекта и изменять или тестировать на другом порту с помощью встроенных средств удаленного интерпретатора Pycharm. Конечно не во всех ситуациях это хороший вариант, но для правки, и доработки небольших проектов очень даже подходит. А если проект с нуля, то создавая его на удаленном сервере, исчезает потребность в переносе и адаптации его под сервер(хостинг), которые неизбежно ведут к появлению множества багов и несовместимостей.


пятница, 11 апреля 2014 г.

четверг, 27 марта 2014 г.

Вакансия Junior Python Developer

Компания Simpals, лидирующая на рынке анимации, интернет-разработок и дизайна в Молдове в связи с развитием проектов объявляет об открытии вакансии: Junior Python Developer. Требования - Желание перейти с другого языка программирования на python; - Уверенное пользование html ,css, javascript; - Знания принципов работы вебсайтов; Мы предлагаем - Участие в разработки сложных проектов; - Карьерное и профессиональное развитие; - Достойную заработную плату; - Нормированный рабочий день с 9:00 до 18:00; - Дружный молодой коллектив; Заинтересованных кандидатов просим выслать резюме на адрес: hr@simpals.md

среда, 26 марта 2014 г.

Примеры использования asyncio: HTTPServer?!

Не так давно зарелизилась новая версия Python 3.4 в changelog которой вошло много «вкусностей». Одна из таких — модульasyncio, содержащий инфраструктуру пригодную для написания асинхронных сетевых приложений. Благодаря концепции сопрограмм (coroutines), код асинхронного приложения прост для понимания и поддержки. 

В статье на примере простого TCP (Echo) сервера я постараюсь показать с чем едят asyncio, и рискну устранить «фатальный недостаток» этого модуля, а именно отсутствие реализации асинхронного HTTP сервера.

INTRO


Прямой конкурент и «брат» — это фреймворк tornado, который хорошо зарекомендовал себя и пользуется заслуженной популярностью. Однако на мой взгляд, asyncore выглядит проще, более логичен и продуман. Впрочем это не удивительно, ведь мы имеем дело со стандартной библиотекой языка.

Вы скажете, что на Python можно было и раньше писать асинхронные сервисы и будете правы. Но для этого требовались сторонние библиотеки и/или использования callback стиля программирования. Концепция coroutine доведенная в этой версии Python практически до совершенства позволяет писать линейный асинхронный код использую лишь возможности стандартных библиотек языка.

Сразу хочу оговориться, что все это я писал под Linux, однако все используемые компоненты кроссплатформенные и под Windows тоже должно заработать. Но версия Python 3.4 обязательна.


суббота, 28 сентября 2013 г.

Секционирование таблиц моделей в Django с PostgreSQL

Это топик о том, как относительно быстро и безболезненно настроить секционирование (партицирование) таблицы по месяцам, если вы используете Django+PostgreSQL. Многое из описанного подойдёт и для других фреймворков и ORM.

О том, что такое секционирование и зачем оно нужно, можно почитать, например, здесьздесь и здесь.

Итак, есть проект на Django и таблица одной из моделей должна быть очень большой. Если чтение из этой таблицы происходит часто, и всегда известен период времени, в который запись была сделана, секционирование ускорит работу базы данных.

Каждый раз писать запросы для включения секционирования не очень хочется, так что попробуем автоматизировать. Хорошо, если на выходе получится что-то, что может использовать и не сильно знакомый с SQL человек. I've read the docs, so you don't have to.

Сперва я расскажу, как быстро попробовать мои наработки, а потом о том, что под капотом. Действуем так:
  1. Ловим syncdb, чтобы можно было добавить команды секционирования.
  2. Подключаем SQL, который вытащит установленные индексы, создаст секции, активирует индексы на них, добавит функции и триггеры.
  3. Активируем секционирование в конечных приложениях и моделях.

среда, 25 сентября 2013 г.

JetBrains Delights the Python Community with a Free Edition of its Famous IDE, PyCharm 3.0

We are happy and proud to let you know that we’ve just released PyCharm 3.0, the newest version of our Python IDE. It comes with an outstanding lineup of new features and enhancements, including:
  • SQLAlchemy support
  • Pyramid & Web2Py web frameworks support
  • Full-featured embedded local terminal
  • Configurable language injections
  • Improvements in Python and Django code intelligence
  • Much better code insight for PyQt and PyGTK
  • and a lot more…
But the most noteworthy announcement for version 3.0 is:
PyCharm now comes in two editions: Community and Professional.
And yes, you read it right: a free and open-source edition of PyCharm is now available!

пятница, 19 апреля 2013 г.

DevConf::Python() 14 июня в Москве — приезжает автор книги «Porting to Python 3»

Не пропустите «питонячью» секцию Devconf 2013

image— Prehistoric Python: Patterns Past their Prime 
Lennart Regebro — created his first website in 1994, and has been
working full time with open source web development since 2001. He is
the author of the book «Porting to Python 3».

— Tulip — новый стандарт на асинхронный код 
Андрей Светлов — использует Python с 2000 года.
Занимается разработкой языка и стандартной библиотеки как Python Core Developer.
Участвует в создании tulip.

— UI нового поколения с Leap Motion и Python'ом 
Павел Коломиец. Занимается разработкой веб-проектов с 2003-го года. 
С 2010-го руководит разработкой игр в компании Insollo. 
Любит Python3 (!), zeromq, redis и другие прогрессивные технологии. 

— Логирование в Python 
Колодяжный Иван. Лидер харьковского python сообщества KharkivPy. 
Пишет на питоне и пытается портировать библиотеки на Python 3.3.

Полный список докладов 
devconf.ru/offers/python

вторник, 26 февраля 2013 г.

Байесовский анализ в Python

Этот пост является логическим продолжением моего первого поста о Байесовских методах, который можно найти тут.
Я бы хотел подробно рассказать о том, как проводить анализ на практике.

Как я уже упоминал, наиболее популярным средством, используемым для Байесовского анализа, является язык R с пакетамиJAGS и/или BUGS. Для рядового пользователя различие в пакетах состоит в кросс-платформенности JAGS (на собственном опыте убедился в наличии конфликта между Ubuntu и BUGS), а также в том, что в JAGS можно создавать свои функции и распределения (впрочем, необходимость в этом у рядового пользователя возникает нечасто, если вообще возникает). Кстати, отличным и удобным IDE для R является, например, RStudio.
Но в этом посте я напишу об альтернативе R — Python с модулем pymc
В качестве удобного IDE для Python могу предложить spyder.
Я отдаю предпочтение Python потому, что, во-первых, не вижу смысла изучать такой не слишком распространенный язык, как R, только для того, чтобы посчитать какую-то задачку, касающуюся статистики. Во-вторых, Python с его модулями, с моей точки зрения, ничем не уступает R в простоте, понятности и функциональности.

Я предлагаю решить простую задачу нахождения коэффициентов линейной зависимости данных. Подобная задача оптимизации параметров довольно часто встречается в самых разных областях знаний, поэтому я бы сказал, что она весьма показательна. В конце мы сможем сравнить результат Байесовского анализа и метода наименьших квадратов

вторник, 12 февраля 2013 г.

Announcing Topaz, an RPython powered Ruby interpreter


Hello everyone
Last week, Alex Gaynor announced the first public release of Topaz, a Ruby interpreter written in RPython. This is the culmination of a part-time effort over the past 10 months to provide a Ruby interpreter that implements enough interesting constructs in Ruby to show that the RPython toolchain can produce a Ruby implementation fast enough to beat what is out there.

Disclaimer

Obviously the implementation is very incomplete currently in terms of available standard library. We are working on getting it useable. If you want to try it, grab a nightly build.
We have run some benchmarks from the Ruby benchmark suite and the metatracing VMs experiment. The preliminary results are promising, but at this point we are missing so many method implementations that most benchmarks won't run yet. So instead of performance, I'm going to talk about the high-level structure of the implementation.

понедельник, 11 февраля 2013 г.

Вышел новый PyCharm 2.7 с поддержкой Django 1.5, улучшенным рефакторингом и автодополнением

В свежей версии PyCharm 2.7 команда разработчиков постаралась учесть пожелания сообщества, внесла несколько полезных улучшений и добавила поддержку свежей версии Django. 

Более предметно:

Внешний вид
В версии 2.7 PyCharm получил новую тему интерфейса в темных тонах (Darcula), знакомую по IntelliJ IDEA 12.



Если вы — счастливый обладатель новенького MacBook, то ваш глаз порадуют новые значки, разработанные специально для экранов Retina.


четверг, 7 февраля 2013 г.

Библиотека Jevix для Python

Jevix — средство автоматического применения правил набора текстов, наделённое способностью унифицировать разметку HTML/XML документов, контролировать перечень допустимых тегов и аттрибутов, предотвращать возможные XSS-атаки в коде документов.

Автором этой библиотеки для php является, хабра житель ur001, ссылка на проект jevix.ru/project/

среда, 6 февраля 2013 г.

Объединяя C++ и Python. Тонкости Boost.Python. Часть вторая


Продолжаем мучить Boost.Python. В этот раз настала очередь класса, который нельзя ни создать, ни скопировать.
Обернём почти обычную сишную структуру с необычным конструктором.
И поработаем с возвращением ссылки на поле объекта C++, так чтобы сборщик мусора Python его не удалил ненароком. Ну и наоборот, сделаем альтернативный вариант, чтобы Python прибрал мусор после удаления того, что ему отдали на хранение.
Поехали…

понедельник, 4 февраля 2013 г.

Еще раз о многопоточности и Python

Как известно, в основной реализации Питона CPython (python.org) используется Global Interpreter Lock (GIL). Эта штука позволяет одновременно запускать только один питоновский поток — остальные обязаны ждать переключения GIL на них.

Коллега Qualab недавно опубликовал на Хабре бойкую статью, предлагая новаторский подход: создавть по субинтерпретатору Питона на поток операционной системы, получая возможность запускать все наши субинтерпретаторы параллельно. Т.е. GIL как бы уже и не мешает совсем.

Идея свежая, но имеет один существенный недостаток — она не работает…

Позвольте мне сначала рассмотреть GIL чуть подробней, а потом перейдем к разбору ошибок автора.

GIL


Тезисно опишу существенные для рассмотрения детали GIL в реализации Python 3.2+ (более подробное изложение предмета можете найти тут).

Версия 3.2 выбрана для конкретики и сокращения объема изложения. Для 1.x и 2.x отличия незначительны.

  • GIL, как следует из названия — это объект синхронизации. Предназначен для блокирования одномоментного доступа к внутреннему состоянию Python из разных потоков.
  • Он может быть захвачен каким-либо потоком или оставаться свободным (незахваченным).
  • Одновременно захватить GIL может только один поток.
  • GIL один единственный на весь процесс, в котором выполняется Python. Еще раз подчеркну: GIL спрятан не в субинтерпретаторе или где-то еще — он реализован в виде набора static variables, общими для всего кода процесса.
  • С точки зрения GIL каждому потоку, выполняющему Python C API вызовы, должна соответствовать структура PyThreadState. GIL указывает на один из PyThreadState (работающий) или не указывает ни на что (GIL отпущен, потоки работают независимо и параллельно).
  • После старта интерпретатора единственная операция, позволенная над Python C API при незахваченном GIL — это его захват. Всё остальное запрещено (технически безопасен также Py_INCREF, Py_DECREF может вызвать удаление объекта, что может вызвать бесконтрольное незащищенное одновременное изменение того самого внутреннего состояния Python, которое и пытается предотвратить GIL). В DEBUG сборке проверок на неправильную работу с GIL больше, в RELEASE часть отключена для повышения производительности.
  • Переключается GIL по таймеру (по умолчанию 5 мс) или явным вызовом (
    PyThreadState_Swap, PyEval_RestoreThread, PyEval_SaveThread, PyGILState_Ensure, PyGILState_Release и т.д.)


Как видим, запускать одноременное параллельное выполнение кода можно, нельзя при этом делать вызовы Python C API (это касается выполнения кода написанного на питоне тоже, естественно). 

При этом «нельзя» означает (особенно в RELEASE сборке, используемой всеми) что такое поведение нестабильно. Может и не сломаться сразу. Может на этой программе вообще работать замечательно, а при небольшом безобидном изменении выполняемого питоновского кода завершаться с segmentation fault и кучей побочных эффектов.

Почему субинтепретаторы не помогают


Что же делает коллега Qualab (ссылку на архив с кодом можете найти в его статье, исходник я продублировал на gist: gist.github.com/4680136)? 

В главном потоке сразу же отпускается GIL через PyEval_SaveThread(). Главный поток больше с питоном не работает — он создает несколько рабочих потоков и ждет их завершения.

Рабочий поток захватывает GIL. Код вышел странноватым, но сейчас это не принципиально. Главное — GIL зажат у нас в кулаке.

И сразу же параллельное исполнение рабочих потоков превращается в последовательное. Можно было и не городить конструкцию с субинтерпретаторами — толку от них в нашем контексте ровно ноль, как и ожидалось. 

Не знаю, почему автор этого не заметил сразу, до опубликования статьи. А потом долго упорствовал, предпочитая называть черное белым.

Вернуться к параллельному исполнению просто — нужно отпустить GIL. Но тогда нельзя будет работать с интерпретатором Питона. 

Если всё же наплевать на запрет и вызывать Python C API без GIL — программа сломается, причем не обязательно прямо сразу и не факт что без неприятных побочных эффектов. Если хотите выстрелить себе в ногу особенно замысловатым способом — это ваш шанс.

Повторюсь опять: GIL один на весь процесс, не на интерпретатор-субинтерпретатор. Захват GIL означает, что все потоки выполняющие питоновский код приостановлены.

Заключение


Нравится GIL или не очень — он уже есть и я настоятельно рекомендую научиться правильно с ним работать. 

  1. Либо захватываем GIL и вызываем функции Python C API.
  2. Или отпускаем его и делаем что хотим, но Питон трогать в этом режиме нельзя.
  3. Параллельная работа обеспечивается одновременным запуском нескольких процессов черезmultiprocessing или каким другим способом. Детали работы с процессами выходят за рамки этой статьи.

воскресенье, 3 февраля 2013 г.

SALT – ПО для управления конфигурациями на Python

Уважаемые коллеги, хочу представить вашему вниманию одну из систем управления конфигурациями, полностью написанную на Python. Она достаточно новая, но уже заслуживает внимания. Если вам интересно как можно управлять парком серверов и рабочих станций как единой системой с помощью этого приложения – прошу под кат.



Почему Salt?

Объединяя C++ и Python. Тонкости Boost.Python. Часть первая

Boost.Python во всех отношениях замечательная библиотека, выполняющая своё предназначение на 5+, хотите ли вы сделать модуль на С++ для Python либо хотите построить скриптовую обвязку на Python для нативного приложения написанного на С++.
Самое сложное в Boost.Python — это обилие тонкостей, поскольку и C++ и Python — два языка изобилующие возможностями, и потому на стыке их приходится учитывать все нюансы: передать объект по ссылке или по значению, отдать в Python копию объекта или существующий класс, преобразовать во внутренний тип Python или в обёртку написанного на C++, как передать конструктор объекта, перегрузить операторы, навесить несуществующие в C++, но нужные в Python методы.
Не обещаю, что в своих примерах опишу все тонкости взаимодействия этих фундаментальных языков, но постараюсь сразу охватить как можно больше частоиспользуемых примеров, чтобы вы не лазили за каждой мелочью в документацию, а увидели все необходимые основы здесь, или хотя бы получили о них базовое представление.


Настраиваем Eclipse PyDev под отладку Python 3.x с честным юникодом и кириллицей

Однажды, холодным зимним вечером, я внезапно вспомнил, что не поделился простым секретом, как добиться простого питоновского счастья за пределами ASCII резервации в такой замечательно-бесплатной IDE как Eclipse с плагином PyDev. Причём счастья с отладкой и честным юникодом, что означает следующее: если вы назвали свою переменную кириллицей, вы сможете посмотреть у неё значение, поставив breakpoint, написать пару строк текста по-русски и у вас ничего не отвалится.
Да-да, уважаемый читатель, Eclipse PyDev не очень-то дружит с символами за пределами 0x7F и отладка очень любит отваливаться всякий раз при попытке прочитать значение кириллической переменной. Да какое там, простое наведение мышкой на юникодовый символ приводит к фатальным последствиям при отладке кода написанного на Python 3.x (UTF-8). Если же настройки вашей файловой системы отличаются от UTF-8, поздравляю, вы не сможете даже запустить ваш скрипт. Я имею в виду именно то, что например под Windows ваш замечательный скрипт с единственным словом по-русски просто выведет из строя PyDev.
Возможно я перестарался, сгущая краски, не пугайтесь, починить это в состоянии мы сами, просто прочитав эту небольшую инструкцию. В награду мы получим бесплатное средство разработки, довольно удобное, фантастически гибкое в настройках и усовершенствовании, вплоть до разработки на нескольких языках, со встроенным инструментом версионирования.
Под катом инструкция и неприличных размеров картинки.

понедельник, 28 января 2013 г.

Вычислительная математика на Python — нахождение корней

В середине первого семестра я познакомился с одним довольно мощным математическим инструментом — Методом Ньютона, позволяющим при удачно выбранном начальном приближении довольно быстро вычислить корни почти любого многочлена.

Если вы знакомы с понятием производной, применение этого метода не окажется трудной задачей. 
Формула выглядит следующим образом:


Xn означает начальное приближение, Xn+1 — следующее значение. Когда Xn+1 вычислено, и мы хотим получить более точный корень — подставляем Xn+1 в качестве начального приблежения.
То есть, по формуле, вычитаем из Xn дробь, в числителе — исходный многочлен, в знаменателе первая производная, в значение X везде подставляем Xn. Эту процедуру можно повторять бесконечно часто, разумеется результат будет становится бесконечно точнее.

воскресенье, 27 января 2013 г.

Использование Python в многопоточном приложении на C++ и настоящая многопоточность в Python

Все более или менее знающие Python разработчики знают про такую жуткую вещь как GIL. Глобальный блокировщик всего процесса до тех пор пока Python выполняется в одном из потоков. Он даёт потоко-защищённость методами сравнимыми с садизмом, поскольку любая неявная блокировка в многопоточном приложении смерти подобна, всё что опиралось на параллельное выполнение, умирает в мучениях, раз за разом натыкаясь на блокировку GIL.
Известно что по сей день из-за этого скорбного факта программисты на C++ используют Python-обёртки по большей части лишь в однопоточных приложениях, а программисты на Python пытаются всех убедить, что им и так неплохо живётся.
Казалось бы, если поток порождён в C++, он не знает ни о каком GIL, используй Python без блокировок и радуйся. Радость разработчика однако закончится уже на втором потоке запросившем область глобальных переменных без блокировки.
Однако есть путь ведущий к светлому будущему!
Этот путь был изначально в таком языке как Perl, он же поддерживается в Си-API языка Python и я ума не приложу почему подобный механизм не включен в один из стандартных модулей Python! Способ по сути сводит использование различных под-интерпретаторов Python в разных потоках, причём используя свой GIL для каждого(!!!) без всякого шаманства и магии, просто последовательно вызвав несколько функций и стандартного набора Си-API языка Python!

пятница, 25 января 2013 г.

Программа PyCon Russia 2013 сформирована

… на 90%. Т.е. какие-то подвижки ещё могут быть, шесть человек ещё определяются с докладами, но большая часть содержательной части конференции готова. Предлагаем её вашему вниманию:

Иностранные докладчики:

image

четверг, 24 января 2013 г.

PyMongo 2.4.2 Is Out


Yesterday released PyMongo 2.4.2, the latest version of 10gen's Python driver for MongoDB. You can see the whole list of nine bugsfixed. Here are some highlights:
  • I made PyMongo's MongoReplicaSetClient smarter about reading from replica set members in failure scenarios. Since version 2.1, PyMongo has been able to detect when a secondary becomes primary or vice versa. But it wasn't very smart about members that are neither primary nor secondary because they're in recovery mode. Now, PyMongo reacts as soon as it notices such a member: it stops trying to use it, and it refreshes its view of all members' states immediately.
  • We got an excellent pull request from Craig Hobbs that lets you specify your read preference in the connection string, like:
    "mongodb://localhost/?readPreference=secondary"
    
  • If you want to try MongoDB's full-text search, PyMongo can nowcreate a text index. (All versions let you to run the text command to use a text index once you've created
(Down here we have to speak very quietly, because the next part is top-secret: I snuck a feature into what's supposed to be a bugfix release. PyMongo 2.4.2 has the hooks Motor needs to wrap PyMongo and make it non-blocking. This lets Motor take a new direction, which I'll blog about shortly.)

Python Unit Testing Tutorial (PyMOTW unittest update)


tl;dr: an update to PyMOTW for `unittest` in Python 3: Python Unit Testing Tutorial.

When I was learning programming in Python, Doug Hellmann's 'PyMOTW' (Python Module Of The Week) blog-series was one of the best resources to learn Python's standard library.
His series later culminated in the book: 'The Python Standard Library By Example'.
The PyMOTW entry on `unittest` was a great introduction to unit testing in Python. Since the PyMOTW version is getting quite outdated, I updated the `unittest` module entry.
This new version includes some edits and updates to the text, and all code and examples have been updated to reflect Python 3.3.
Have a look at my updated Python 3.3 version:
'Python Unit Testing Tutorial'


say no to bugs...

среда, 23 января 2013 г.

Around the World in 10 Python Conferences

Larry Hastings had a busy 2012. Throughout the year he made his way to five continents, attending 10 Python conferences. The 3.4 release manager and host of Radio Free Python was on stage for four of them, and sprinted at each of them. Most of all, he had a blast and got to meet wonderful Python people all around the globe.

Larry got his introduction to Python around 1996, and his time as a core CPython contributor started within the last few years. However, he did have a contribution accepted into Python 1.5.1b2, but it was backed out before the final release and was revived again for 3.1, almost 11 years later!

The first PyCon Larry attended was in 2008, the first of two events in Chicago. He followed that up with each US-based PyCon since then, making the trips to Atlanta and Santa Clara, before adding EuroPython to the mix in 2011. “After that it sort of snowballed,” he said of what became of 2012.

Here’s where he ended up:

  1. Santa Clara, California, USA for PyCon US
  2. Florence, Italy for EuroPython
  3. Tokyo, Japan for PyCon JP
  4. Coventry, England for PyCon UK
  5. Cape Town, South Africa for PyCon ZA
  6. Dublin, Ireland for PyCon Ireland
  7. Conway, Arkansas, USA for pyArkansas
  8. Montevideo, Uruguay for PyCon UY
  9. Buenos Aires, Argentina for PyCon Argentina
  10. Rio de Janeiro, Brasil for PythonBrasil

понедельник, 21 января 2013 г.

О порядке поиска пакетов и модулей для импорта в Python

Начать, видимо, следует с того, что речь пойдет об интерпретаторе CPython версии 2.7.x (примеры проверялись на версии 2.7.3).

На официальном сайте имеются описания инструкции import и модулей в Python:

Из них следует, что в Python имеются пакеты (package), модули (module) и имена, определенные в модулях (names). Также следует отметить, что в некоторых частях документации модули называются подмодулями (submodule), если они размещены внутри пакета.

пятница, 4 января 2013 г.

New Years' Python Meme

  1. What’s the coolest Python application, framework or library you
    have discovered in 2012?
    That's definitely OpenStack, the cloud infrastructure management
    system.
  1. What new programming technique did you learn in 2012?
    I've been doing a lot with messaging via AMQP and with NoSQL
    storage using MongoDB. I've also become a git convert, moving over
    from hg and svn.
  1. What’s the name of the open source project you contributed the
    most in 2012? What did you do?
    Most of the work I've done for DreamHost this year has been on
    ceilometer, the metering system for OpenStack. I was one of the
    original developers on the project, and designed and implemented a
    lot of the internal architecture.
  1. What was the Python blog or website you read the most in 2012?
    Planet OpenStack and Planet Python let me keep up with a broad
    cross-section of both communities.
  1. What are the three top things you want to learn in 2013?
    Other NoSQL systems (including figuring out which to learn), cloud
    orchestration, and cloud platform-as-a-service tools. If you have
    tips, I'd love to hear them in the comments.
  2. What are the top software, app, or lib you wish someone would write in 2013?
    I would love to move off of emacs to a portable editor that I could
    customize with python. Pretty please?

среда, 21 ноября 2012 г.

Python 3.2 lets you write Python on the iPhone



We've posted before about Codea, an iPad app that allows you to code and create LUA scripts. And now here's a new iPhone app called Python 3.2 that, as you might imagine, allows coders to write Python scriptsthrough iOS. The app runs Python 3.2.3 and serves as a full development environment for that scripting language, complete with an interactive interpreter and a number of other Python-related bells, whistles and options.

Of course, the issue with both of these script-writing apps is that you're often writing code you can't actually run on the iPhone or iPad, given Apple's restrictions on security and the way it requires apps to be sandboxed. But Python allows you to save scripts as needed and presumably you could just copy them out of the app if you wanted to run them elsewhere. We don't exactly have "Xcode for iPad" just yet, but coding on Apple's iOS platform is becoming more viable.