Перекрестная публикация из моего блога Анализируйте данные, а не бредни
Продолжая тему рассылки программных раздражителей: сегодняшний
раздражитель — включая синтаксически окрашенный код в блогах, LaTeX, Word и других документах. Это постоянная заноза в заднице; особенно для пользователей идиосинкразических языков программирования. У всех нас есть свои любимые хаки и обходные пути; сегодня я поделюсь одним из них: использование jupyter для синтаксической раскраски J-кода.
Несколько лет назад Мартин Саурер внес выдающийся вклад в сообщество разработчиков языка программирования J. Он создал ядро jupyter для J. Если вы не знаете, что такое jupyter, пожалуйста, вылезьте из-под скалы и присоединитесь к остальным в XXI21-м веке.
Как я уже говорил ранее, блокноты jupyter — это просто правильный способ представления сложных «исполняемых» технических документов, содержащих большие дозы математики, программного кода и графики. Я не единственный, кто придерживается этого мнения: многие с ним согласны. Было бы преуменьшением сказать, что jupyter был успешным. Сейчас он является доминирующим инструментом во многих дисциплинах. Если вы не используете его, вы упускаете один из самых полезных инструментов программирования с открытым исходным кодом.
Я пришел в jupyter из pythonverse. Основанный на JSON ipynb
формат блокнота возник там и первоначально расшифровывался как Interactive PYthon Note*Book, но в одном из лучших решений в области дизайна программного обеспечения, создатели jupyter решили сделать его *независимым от языка программирования. Это означает, что любой язык программирования может быть подключен к jupyter, если он реализует хорошо определенный интерфейс ядра. Именно это и реализовал Мартин. Теперь многие языки программирования поддерживают jupyter. Это стало ожидаемой возможностью, и если она отсутствует, что ж, это хорошая причина использовать другой язык программирования.
Ядро J Мартина работает очень хорошо, и я постоянно им пользуюсь, но есть несколько способов улучшить ядро J и ядра jupyter в целом.
Отладка кода в блокноте
Отладка кода в блокноте не так отточена, как могла бы быть. Ядра обычно представляют собой «невидимые» исполняемые файлы, которые отвечают на запросы, отправленные с сервера блокнота. Большинство ядер остаются в фоновом режиме и не предоставляют стандартную среду программирования, специфичную для конкретного языка. Обычно это не представляет особой проблемы, но при отладке сложных программ было бы удобно нажать кнопку и вызвать стандартный отладчик. В случае с J появится сессия JQt или JHS, содержащая весь код, загруженный или созданный в блокноте.
блокнотом. Вы можете отлаживать и изменять свой код, а затем переходить к сессии блокнота, чтобы опробовать его.
В настоящее время ядро J не «всплывает» в видимых сессиях J, но вы можете добиться чего-то подобного, извлекая код блокнота J в виде J-скрипта и выполняя его в другой сессии JQt или JHS. jupyter делает это легко!
Глупый трюк с Jupyter #1 — экспорт кода блокнота в виде J-скрипта
jupyter может загружать блокноты в различных форматах. Один из
форматов, предоставляемых ядром J, является ijs
или J-скрипт. Перейдите в
меню Файл, выберите Загрузить как, затем выберите J (.ijs). jupyter извлечет все ячейки J-кода в блокноте в порядке следования ячеек и запишет файл скрипта туда, куда вы хотите. Я обычно сохраняю такие скрипты в временном каталоге J jpath ~temp
, где их удобно загружать и запускать.
Когда вы запускаете загруженный скрипт блокнота J в другом сеансе J, он, по сути, выглядит следующим образом1 воссоздает состояние ядра блокнота.
Вставка J-кода в блокноты
Извлечение J-кода из блокнотов для отладки полезно, но, как ни странно, обратная операция — вставка J-кода в блокноты — еще более полезна. Как уже отмечалось ранее, jupyter может экспортировать блокноты во множество форматов. В частности, он может генерировать HTML, LaTeX, Markdown и PDF версии блокнотов. Я нашел сгенерированные форматы LaTeX, HTML и Markdown чрезвычайно удобными.
Глупый J Jupyter трюк #2 — вставка блокнота с J-кодом
Если вы ищете быстрый и грязный способ синтаксического раскрашивания J-кода, сделайте следующее:
-
Создайте пустой блокнот jupyter.
-
Откройте J-скрипт в своем любимом редакторе.
-
Вырежьте и вставьте скрипт в ячейку кода jupyter.
-
Загрузите блокнот в формате HTML или PDF.
jupyter красиво раскрасит синтаксис вашего кода. Он даже хорошо справляется с разрывом строк. Файлы GitHub brandxmp.ijs.pdf
и brandxmp.ijs.html
являются примерами того, что вы получите прямо из коробки.
Глупый J Jupyter трюк #3 — более умная вставка в блокнот J кода
Быстрый и грязный метод прост и удобен, но при подготовке сложных документов LaTeX он малопригоден. В LaTeX вам нужен не только код. Вам нужны перекрестные ссылки, веб-ссылки, сноски, математические выражения, графика, индексы, приложения и прочие прелести грамотного программирования. Достичь таких целей гораздо проще, если J-код разбит на множество ячеек. Следующий глагол делает именно это.
ipynbfrjod=:3 : 0
NB.*ipynbfrjod v-- extract J words from JOD and insert in blank
NB. jupyter notebook.
NB.
NB. monad: clIpynb =. ipynbfrjod blclNames
NB.
NB. NB. examples use docs and utils
NB. require 'general/jod'
NB. od ;:'docs utils'
NB.
NB. nbj=: ipynbfrjod ;:'sha1 sha1dir'
NB. nbj write 'C:Usersbakerjupyter_notebookstest0.ipynb'
NB.
NB. nbj=: ipynbfrjod }. grp 'ipynb'
NB. nbj write 'C:Usersbakerjupyter_notebooksipynb_onself.ipynb'
NB. require 'general/jod' !(*)=. disp
jc=. disp&.> y
NB. markdown sections with word name
sec=. dblquote (<MDSECTION,JWORDMARK) ,&.> y
sec=. (<NBJCELLBEGst) ,&.> sec ,&.> <NBJCELLBEGen
NB. j code to quoted list of python strings notebook format
nbj=. <;._2@(REVPYESCAPECHRS&changestr)@tlf&.> jc
nbj=. ;&.> '"' , L: 0 (<'n",',LF) ,~ L: 0 nbj
nbj=. ,&'"'&.> 'n",'&beforelaststr&.> nbj
nbj=. sec ,&.> nbj ,&.> <NBJCELLEND
toJ NBHEADER , (LF ,~ ','&beforelaststr ;nbj) , NBTRAILER
)
После загрузки слов J в ячейки все средства экспорта jupyter становятся сразу доступными. Примеры выводов jupyter, использующих этот хак, доступны на GitHub: смотрите ipynb_onself.ipynb
и ipynb_onself.pdf
.
Для использования ipynbfrjod
загрузите ipynb.ijs
и соответствующий документ ipynb.pdf
. Все эти файлы находятся на GitHub. Помогите себе!
Постскриптум: Если у вас уже установлена последняя версия J, вы можете напрямую установить этот скрипт как addon
, введя следующую команду в сеансе JQt или JHS.
install 'github:bakerjd99/jackshacks'
NB. load script
load '~addons/jacks/ipynb.ijs'
-
При разработке блокнотов J jupyter необходимо соблюдать некоторую осторожность, чтобы гарантировать, что экспортируемые скрипты точно воссоздают состояния ядра.