Посты с тэгом programming


Когда стоит использовать Go?

Понятное дело, что это мой личный блог, и потому этот дисклеймер в теории писать нет смысла, но на практике я всë равно напомню – всë, что я тут пишу, это мои личные мысли, если не указано обратное (что это факты или мысли кого-то другого, скажем).

Так вот, когда? TL;DR: никогда.

Длинный вариант: если вам прямо сейчас нужно что-то скомпилированное и ждать Rust 1.0 нет сил, а OCaml выучить нет времени, то ок, конечно же, right tool for the job и всë такое (впрочем, мне кажется, что вы себя обманываете).

Во всех остальных случаях – уже можно взять Rust, они перестали менять весь язык полностью, и он уже рабочий, либо возьмите уже OCaml, не настолько он отличается. Единственный плюс Go перед этими языками – что в нëм может разобраться Python-программист за один вечер.

Горутины с каналами? В Rust есть green и std::comm, в Ocaml’е есть Lwt и Async. Типизация? Посмешище в Go типизацие



Когда стоит использовать Go?

Понятное дело, что это мой личный блог, и потому этот дисклеймер в теории писать нет смысла, но на практике я всë равно напомню - всë, что я тут пишу, это мои личные мысли, если не указано обратное (что это факты или мысли кого-то другого, скажем).

Так вот, когда? TL;DR: никогда.

Длинный вариант: если вам прямо сейчас нужно что-то скомпилированное и ждать Rust 1.0 нет сил, а OCaml выучить нет времени, то ок, конечно же, right tool for the job и всë такое (впрочем, мне кажется, что вы себя обманываете).

Во всех остальных случаях - уже можно взять Rust, они перестали менять весь язык полностью, и он уже рабочий, либо возьмите уже OCaml, не настолько он отличается. Единственный плюс Go перед этими языками - что в нëм может разобраться Python-программист за один вечер.

Горутины с каналами? В Rust есть green и std::comm, в Ocaml’е есть Lwt и Async. Типизация? Посмешище в Go типизацие



webhooker

Когда ты хостишь репозитории сам, то можешь сделать какие угодно хуки и по push’у в свой репозиторий делать что угодно – например, рендерить свой сайт. Но когда ты перемещаешь эти репозитории на GitHub, приходится пушить изменения и туда, и себе на сервер, чтоб они там отрендерились. Хостить сайт на гитхабе мне не хочется, да и это, опять же, лишняя работа – надо будет рендерить его в ветке gh-pages, никакого фана.

В какой-то момент мне надоело (на эту фразу уже можно прямо макрос себе завести, “сделать новый пост с ‘мне надоело’” :)), и я написал вебшлюху – такую маленькую, на 250 строк, программу на Go, которая слушает себе определëнный порт, и когда ей приходит вебхук от гитхаба, исполняет заданную команду. Написал я еë потому, что в инете такой не нашëл (нашëл нерабочую на питоне с кошмарным кодом) – что довольно



Go Replace!

Как-то раз два с лишним года назад я решил посмотреть на Go, поизучать, как это – писать на нëм программы, и насколько хороший выходит результат. Идея для первой программы родилась легко – так как мой любимый Python тормозит на запуске, я решил переписать sr, который я постоянно юзал, на Go.

Так родился Go Replace (надо было рассказать про него еще два года назад, впрочем). Очевидно, поиск по файлам – давно решëнная проблема, find + grep, или grep сам по себе, или ack, или, вот, the_silver_searcher, но никто из них не умеет заменять. Замена – это всегда раздражающее переписывание командной строки на find + sed или xargs + sed. А gr (короткое название, которое я выбрал для того, чтоб не сильно много писать) умеет, и в



RequireJS & AMD

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

Конечно, эту проблему решают разными способами и давно, но всерьëз я рассматриваю только один – AMD, Asynchronous Module Definition. Почему только его – потому что другие обычно либо являются кальками модулей с сервера (которые поголовно все синхронные), либо требуют танцев и прогибания под их проблемы.

Конечно, при каких-то условиях можно себе позволить кальку с CommonJS, например Stitch, если не беспокоит то, что и при разработке, и при деплое придëтся все модули собирать в один файл. Меня это не устраивает, я хочу разные файлы – чтобы при разработке было проще понимать, где проблемы и чтобы окончательное пр



[Перевод] PHP: фрактал плохого дизайна

Хабы: Программирование, Python, PHP

Предисловие


Я капризный. Я жалуюсь о многих вещах. Многое в мире технологий мне не нравится и это предсказуемо: программирование — шумная молодая дисциплина, и никто из нас не имеет ни малейшего представления, что он делает. Учитывая закон Старджона, у нас достаточно вещей для постижения на всю жизнь.

Тут другое дело. PHP не просто неудобен в использовании, плохо мне подходит, субоптимален или не соответствует моим религиозным убеждениям. Я могу рассказать вам много хороших вещей о языках, которых я стараюсь избегать, и много плохих вещей о языках, которые мне нравятся. Вперёд, спрашивайте! Получаются интересные обсуждения.

PHP — единственное исключение. Фактически каждая деталь PHP в какой-то мере поломана. Язык, структура, экосистема: всё плохо. И даже


SQLAlchemy: как втянуться

SQLAlchemy сейчас - очевидный лидер ORM в питоне, но у неë есть один довольно неприятный недостаток: чтобы начать пользоваться, приходится прочитать немало документации. Поэтому я решил написать (очень) короткий пост-введение в алхимию.

Уровень 1: SQL руками

Первым делом нам нужно соединение к базе, с которым можно что-то делать:

>>> from sqlalchemy import create_engine
>>> e = create_engine('mysql://user:pass@host/db')
>>> for r in e.execute('select * from table where id < %s', 2):
...     print dict(r)


SQLAlchemy: как втянуться

SQLAlchemy сейчас – очевидный лидер ORM в питоне, но у неë есть один довольно неприятный недостаток: чтобы начать пользоваться, приходится прочитать немало документации. Поэтому я решил написать (очень) короткий пост-введение в алхимию.

Уровень 1: SQL руками

Первым делом нам нужно соединение к базе, с которым можно что-то делать:

Если хочется именованных параметров, можно использовать text():

Из объектов, которые получаются итерацией результата – RowProxy - данные можно вытаскивать и индексом, и ключом, и атрибутом:

Нужна транзакция?

Это уже что-то и так можно жить, тем более что оно экранирует параметры автоматически.

Уровень 2: SQL-выражения в питоне

Можно получить объект таблицы из базы (с автоопределением колонок) и работать с ним, если так будет удобнее:

Т.е. абсолютно идентичный запрос, но уже в питоне.

Уровень 3: ORM

Ну и если приятнее с объектами работать,