понедельник, 14 декабря 2015 г.

Первые впечатления от Go

Решил взяться за изучение так сильно разрекламированного в последнее время языка "Go". На данный момент я его знаю весьма слабо, ничего сложнее "hello word" на нём на писал. Но мне просто хочется изложить свой первый "незамутнённый" взгляд на язык, а потом после более близкого знакомства сравнить ощущения. По причине плохого знания языка, в тексте ниже могут быть неточности, но по крайней мере, я старался по мере сил каждое утверждение проверять. Приступим.

понедельник, 30 ноября 2015 г.

Поиск в Emacs при помощи Swiper

Нужно признать очевидное, дефолтный поиск в Emacs ужасен, допускаю, что там есть волшебные настройки делающие его лучше, но я так и не смог их осилить. Скажу страшное, если по текущему файлу нужно было много искать - я зачастую переключался в Sublime Text и делал это там. Но похоже я нашёл для себя решение, делающие мои волосы мягкими и шелковистыми, имя ему - swiper.

понедельник, 23 ноября 2015 г.

Software render на Rust: кубические текстуры

Сегодня в качестве темы, я решил взять отражения, а что бы не было совсем просто - рассмотрим не плоские зеркала, а 3D, которые реализуются через так называемые CubeMap-текстуры. Сразу хочу отметить, что если предыдущие темы были для меня более-менее знакомы, то с этой я разбирался с нуля, так что возможно будут какие-то неточности, если таковые обнаружатся, прощу исправлять меня в комментариях.



четверг, 19 ноября 2015 г.

Подружить git и meld за 5 минут

Я не то что бы знаток git, но мне искренне больно смотреть, как некоторые люди пользуются встроенными в IDE инструментами для мёржа или просмотра diff-ов. Особенно когда вокруг так много гораздо более удобных утилит для этой задачи, причём когда настроить взаимодействие git с подобными утилитами это дело 5 минут, включая чтение документации.

понедельник, 16 ноября 2015 г.

Профилирование в Rust

Стоит отметить, что описанные инструменты не специфичны для Rust, а вполне применимы для широкого спектра языков. Но при этом я сразу оговорюсь, что речь будет идти о Linux инструментарии, что из этого портировано на другие ОС я не изучал.


пятница, 30 октября 2015 г.

Какой язык программирования учить первым - опрос в блоге eax.me

Поучаствовал в интересном опросе в блоге небезызвестного @afiskon. Он предложил независимо ответить на один и тот же вопрос "Какой язык программирования вы бы посоветовали учить первым, и почему именно его?" разным людям и свёл результаты вместе и опубликовал. Я если честно ожидал что все ответы будут о 2-3 языках, примерно с одинаковой аргументацией, ан нет, разброс мнений меня сильно удивил. Не менее интересное обсуждение идёт в комментариях, советую почитать.

Собственно вот ссылка на сам пост.

четверг, 29 октября 2015 г.

Скринкасты и UNIX-way

Не так давно обсуждали с коллегами разницу между возможностями command-line в Windows и Linux. Мне кажется так и не удалось донести мысль, что тот же powershell не смотря наличие нескольких хороших идей в большинстве своём остаётся для повседневных задач неудобным, неповоротливым монстром. И что пресловутый UNIX-way, с сотнями утилит на все случаи жизни гораздо практичнее и функциональнее. Сотни тысяч приложений, написанных в стиле максимальной конфигурируемости, позволяют как из кубиков собирать нужное и максимально удобное для себя родимого. Для иллюстрации подхода, попробую на примере записи скринкастов в GIF, показать насколько удобно можно собирать эти кубики.

понедельник, 26 октября 2015 г.

Визуальные undo redo в Emacs

Концепция операций undo/redo кажется выверенной и отточенной многими годами, добавить туда что-то новое не возможно. Большинство редакторов впрочем и не пытаются, полностью сосредоточившись на редизайне кнопок в интерфейсе и добавлении новых шкурок. В Emacs'е же, попытки изменить устоявшуюся концепцию есть и на мой взгляд удачные.

понедельник, 19 октября 2015 г.

Software render на Rust: добавляем текстуры

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

вторник, 6 октября 2015 г.

Мой первый пакет для Emacs: multi-compile

Более актуальная версия
Я часто пишу заметки о Emacs, в формате: скопируйте вот эти строки подкорректируйте под себя, вставьте в конфиг, установите ещё вот этот плагин и т.п. Сегодня решил выйти на "новый уровень" и сделал полноценный пакет для Emacs и что бы нанести пользу максимально большой аудитории - разместил его в melpa. Конечно подготовить его несколько сложнее, чем просто пример конфига для блога, но для меня это своеобразное возвращение долгов за используемые мной open-source решения.

пятница, 25 сентября 2015 г.

appveyor - travis-ci под windows

Я недавно делал обзор travis-ci и пожаловался на то, что там нет возможности прогонять тесты на windows. В комментариях ozkriff дал ссылку на appveyor.com, спасибо ему. Сервис как раз и специализируется на создании продукта для continuous integration под windows. У меня наконец дошли руки до того, что бы посмотреть на то, что он умеет, результаты далее.

среда, 16 сентября 2015 г.

Подборка ресурсов по Emacs

Что-то накопилось много разных ссылок на разные полезные и интересные материалы по Emacs, решил поделиться.

среда, 9 сентября 2015 г.

Software render на Rust: интерполяция атрибутов и освещение

В прошлой статье я показал как можно реализовать буфер глубины с помощью интерполяции значения 1/z. А так же сделал простейшую систему освещения, когда цвет рассчитывался целиком для треугольника. На низкополигональных моделях это выглядело ужасно, так рисовали много лет назад, когда производительности катастрофически не хватало. Сейчас даже ресурсов только процессора хватит, что бы сделать нормальное попиксельное освещение, чем мы сейчас и займёмся.

пятница, 4 сентября 2015 г.

Автоматическое удаление в Emacs лишних пробелов и табуляции в конце строки

Набрел недавно на замечательную возможность emacs, не могу не рассказать. Многих я думаю раздражают лишние пробелы или табы, которые остаются в конце строки (как отобразить непечатаемые символы я писал раньше). В emacs есть функция "M-x delete-trailing-whitespace" которая удалит все пробелы и табы в конце строк в текущем буфере, а заодно и лишние линии в конце файла, оставив только одну. А что бы автоматизировать этот процесс, можно добавить в конфиг вот такую строчку:
(add-hook 'before-save-hook 'delete-trailing-whitespace)
Теперь "delete-trailing-whitespace" будет вызываться перед каждым сохранением файла автоматически.

вторник, 1 сентября 2015 г.

Software render на Rust: переходим в 3d

В предыдущей статье, разобрались с отрисовкой одноцветного треугольника на плоскости. Теперь пора переходить в 3D. С нуля разработать математический аппарат по проецированию треугольника на плоскость - задача весьма нетривиальная. Однако за нас уже все сделали и упростили до такого уровня, что практическое использование осилит даже тот, кто прогуливал уроки математики в школе.


пятница, 28 августа 2015 г.

Небольшой обзор travis-ci

Наверняка многих, в своё время, не обошла стороной шумиха вокруг travis-ci. Это сервис для сборки и тестирования проектов на GitHub, относительно простой, но в принципе покрывающий большинство use case. По сравнению с тем же Jenkins, он выглядит малофункциональным, но тут преимущество в том, что за вас уже развёрнута инфраструктура, причём совершенно бесплатно.

понедельник, 24 августа 2015 г.

Software render на Rust: рисуем треугольник

Я уже давно хотел разобраться получше с Rust, что бы составить впечатление о языке. У них есть достаточно хорошая документация, которая к тому же переведена на русский, в интернете - куча статей. Но видно я не из тех, кто способен понять язык по книжкам. Поэтому было решено написать на нем, что-то более или менее крупное, в качестве задачи решил взять Software rendering, заодно университетский курс линейной алгебры вспомню. Тем более я уже когда-то давно писал его для конкурса (я там под ником Rean), правда исходники не сохранились, но зато в памяти остались общие моменты. Сразу оговорюсь: я не буду пошагово описывать все алгоритмы, которые я использую, иначе это будет не серия постов, а объёмная книга. Но постараюсь давать ссылки на материалы, которые, на мой взгляд, хорошо описывают что я делаю и комментаровать некоторе моменты. Так же буду выкладывать ссылки на мою реализацию в GitHub, местами корявую, частично из-за незнаний языка, частично из-за подзабытых алгоритмов. Всего этого должно быть в принципе достаточно для воспроизведения, при желании, моих результатов на любом другом языке. А для тех кому лень - будут картинки, по которым можно оценить прогресс.

среда, 29 июля 2015 г.

Ansible - заключение

В предыдущих статьях (1 2 3 4) я обзорно прошёлся по основным на мой взгляд моментам ansible. Конечно очень многое осталось "за кадром", но для составления мнения мне хватило. Настало время подвести итоги и показать что получилось в результате экспериментов. Впечатления от ansible остались неоднозначные. Очень много негатива, хотя есть и положительные моменты. Если честно, я ожидал большего.

воскресенье, 26 июля 2015 г.

Minecraft без demo

Решил я на днях поиграть в minecraft на Linux. Зарегистрировался на сайте, установил пакет, когда launcher попросил - ввёл данные свои регистрационные, все как положено. Игра заработала - наслаждаюсь, вот думаю разработчики java молодцы, обещали что "написано один раз, работает везде" и выполнили таки обещание, несмотря на то, что игра выкуплена Microsoft - на Linux проблем нет. Но проходит пара часов - а она денег просит, прям как вирус какой поганый, про какое-то буржуйское "demo" талдычит. Я их тарабарскому наречию не обучен, чувствую только что java опять гадит, ибо других вирусов на Linux не водится.

вторник, 21 июля 2015 г.

Ansible - встроенные возможности

В предыдущих сериях 1 2 3, были примеры того какие возможности в плане расширения предоставляет ansible, на примере работы с пакетами в archlinux. Сейчас я попробую решить пару - задач декларативными средствами ansible, принципиально не используя самописные плагины и вызов внешних скриптов напрямую. Заодно будет повод ознакомиться с тем, что собственно ansible предоставляет из коробки. Тем более, что они в playbook умудрились добавить поддержку циклов, условий, переменных и т.п. Интересно понять насколько удобно ими пользоваться.

воскресенье, 19 июля 2015 г.

Ansible - плагины

В предыдущей статье я показал как можно написать для ansible свой модуль, на примере установки пакетов из AUR. Это делает меня на один шаг ближе к цели - создать решение для максимально полного сохранения конфигурации своего домашнего компьютера, однако остаются нерешенные задачи. В частности хотелось бы список пакетов, которые нужно устанавливать - хранить в отдельном конфигурационном файле, а не прописывать их в playbook. Это позволит н-р в одном случае прочитать конфиг и вернуть из него только неустановленные пакеты, подав их на вход модуля yaourt, в другом случае - можно будет сравнить список явно установленных пакетов в системе и выдать те, которые ещё не прописаны в конфиге и т.д.

вторник, 14 июля 2015 г.

Ansible - модули

В предыдущей статье удалось заставить ansible работать со стандартными модулями, в частности устанавливать пакеты через менеджер pacman. Однако в archlinux одним pacman сыт не будешь, большинство "вкусных" пакетов находится в пользовательском репозитории пакетов AUR. А разработчики дистрибутива заняли принципиальную позицию, что никогда не будет официального способа ставить неофициальные пакеты, мол если уж решились - то качайте и ставьте самостоятельно. Сообщество выпустило несколько альтернативных менеджеров для работы с AUR, одним из самых популярных считается yaourt. Я это всё к тому, что из ansible просто необходимо уметь вызывать yaourt, а такого модуля у них нет. В принципе это даже хорошо, поскольку даёт повод немного глубже окунуться в ansible и написать такой модуль самостоятельно.

суббота, 11 июля 2015 г.

Ansible - введение

Есть такой класс инструментов, как системы управления конфигурациями. Они сейчас довольно многочисленны: chef, puppet, salt и другие. Отличия в них не принципиальные - одна проще в настройке, другая стабильнее и чуть больше умеет, но в целом выбрав одну из них, вы так или иначе сможете добиться поставленных целей. Я к сожалению не обладаю достаточной компетенцией, что бы их сравнивать, поскольку со всеми знаком только на уровне статей\документации. Лично для себя, что бы познакомиться с этим классом инструментов я выбрал ansible. Судя по отзывам он наиболее логичен, прост в освоении, активно развивается и написан на python. Последнее важно, т.к. я более или менее знаком с этим языком, в отличии от часто используемого для таких инструментов ruby.

понедельник, 29 июня 2015 г.

Отображение непечатаемых символов в emacs

Отображение непечатаемых символов в emacs с одной стороны очень простая тема, выполняем "M-x whitespace-mode" и пробелы, символы табуляции, перес строк будет сразу видны на экране, выполняем команду ещё раз - режим выключается. Настройки по умолчанию в принципе неплохие и если они устраивают, то на этом можно и закончить изучение режима. Но это же emacs, и "под капотом" скрывается на удивление много настроек для этого режима. К сожалению информация о нем раскидана по разным уголкам интернета, а кое-что пришлось узнавать экспериментальным путём. Так что сейчас попробую описать важные на мой взгляд опции этого режима.

воскресенье, 28 июня 2015 г.

Расширенная проверка орфографии в emacs


В предыдущей статье я рассказал как можно настроить двуязычную проверку орфографии, однако такая проверка работает с каждым словом в отдельности, не учитывая контекст. Это безусловно полезная проверка, но её одной мало, хочется расширенного анализа: проверки расстановки дефисов, пунктуации, стиля и т.п. Конечно же в emacs нашёлся способ проводить и такой анализ текста. Делается это при помощи плагина работающего с приложением languagetool.

суббота, 20 июня 2015 г.

Изучаем английский

Кому-то иностранный язык даётся просто, пару раз увидел\написал слово и запомнил, а вот у меня с этим плохо, не даётся и все тут. Я перепробовал довольно много разных способов изучать его. Начиная от сильно разрекламированного lingualeo, заканчивая написанием своей собственной программы. Кончалось все одинаково, через пару тройку месяцев энтузиазм заканчивался, я начинал пропускать занятия и в конце концов забрасывал это дело ещё на пол года. За годы экспериментов сформировалось, сугубо личное конечно, мнение о том, какое должно быть приложение, для изучения иностранного языка. И как ни странно, я его нашёл, там есть что улучшать, куда расти, но идеология и направление движения очень правильные.

вторник, 16 июня 2015 г.

Двуязычная проверка орфографии в Emacs

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

воскресенье, 14 июня 2015 г.

Компиляторы иногда ругаются по делу

Буквально только что натолкнулся на забавную особенность языка C++, уже встречался с ней раньше, но каждый раз удивляет. Имеем вот такой код:
void foo(uint32_t v)
{
    ...
    CTimeout t(std::chrono::seconds(v));
    ...
}
Компилятор объявление переменной интерпретирует как объявление функции, считая его эквивалентом вот этого:
CTimeout t(std::chrono::seconds v);
Т.е. он просто решил, что скобки тут лишние и убрал их. Искать такую ошибку в большом проекте можно очень долго. К счастью компиляторы сейчас пошли умные и о таких ситуациях предупреждают (по крайней мере clang), хотя и компилируют. Но когда проект компилируется с парой сотен ворнингов, отыскать важный сложно. Выводу, я думаю очевидны.

воскресенье, 7 июня 2015 г.

Конфиг для python скриптов

Захотелось тут на днях написать небольшую утилиту на python, дабы пользу себе нанести и язык заодно вспомнить. И оказалось, что требует она для своей работы конфиг. В мозгу сразу возникли слова: json, ini, xml, yaml и т.п. Но вот незадача - кто-то из них в стандартной библиотеке python отсутствует, где-то комментарии не поддерживаются, что-то имеет ужасный интерфейс работы из под python, опять же произвольную вложенность не везде можно использовать. И в добавок абсолютно все не поддерживают типизацию. Я уж было совсем приуныл, но в этот момент постучалась в мою голову одна светлая мысль: а python ведь скриптовый язык.

воскресенье, 31 мая 2015 г.

Переключение между окнами в Emacs

Что-то я давно не писал о Emacs, пора поправить упущение. Итак, в Emacs есть понятие окон - грубо говоря каждое окно, это область экрана, где отображается содержимое файла. Сейчас мониторы стали большими и возможность открыть одновременно штуки 4 окна - это довольно удобная фича. Но раньше, когда об over 20" даже не мечтали, не думаю, что кому-то было было комфортно работать с более чем 2 окнами одновременно. И в связи с этим, переключение между окнами, пришедшее к нам с тех времен было реализовано через комбинацию (C-x O), которая просто переключает фокус на следующее окно. Пока их 2, проблем нет, когда их 3 и более - прощелкать последовательно все окна становится утомительным.

Проблема решается плагином window-numbering, работает он очень просто, в строке состояния каждого окна, он рисует его номер - от 1 до 10. А так же привязывает горячие клавиши (M-1, M-2,…) нажатие которых перемещает фокус в соответствующее окно. Нумерация окон довольно интуитивная, через какое-то время запоминаешь в какой области экрана, какое окно находит и переключаешься на него на автомате. Настройка тоже не вызывает проблем, достаточно установить плагин и включить его в файле конфигурации: "(window-numbering-mode t)".

В целом очень удобная штука - рекомендую.

вторник, 19 мая 2015 г.

TDD есть опиум для народа


Ваш так называемый TDD действует как опий: он завлекает и приглушает боли вместо того, чтобы придать силы.
(сказал бы Новалис, если бы жил сейчас)

Один пацан писал все через TDD, говорил что нравится, удобно, читабельно.
Потом его в дурку забрали, конечно.



В последнее время все громче и настойчивее звучат голоса о пользе TDD вообще и главенствующей роли unit тестов в частности. Правда радует, что пока еще многие говорят, что делают это, но мало кто занимался им на самом деле. Но тенденция пугает, в первую очередь потому, что идеология выстроена с вкраплением здравых и полезных мыслей, из которых потом делают странные выводы и обобщения.


суббота, 16 мая 2015 г.

Подкасты, как способ провести свободное время с пользой

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

вторник, 12 мая 2015 г.

О возрасте

Мне почему-то запомнилось, как когда-то на школьной дискотеке - подошел ко мне старшеклассник, года на 4 старше и по отечески так сказал "шел бы ты потанцевал, а то мол вырастешь до моих лет - не до этого будет".

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

На работе уже пошли высказывания на тему: год два (пять, десять) поработаешь, дома уже к компьютеру подходить не захочешь, ну разве что погоду на завтра посмотреть. Вот тоже рейтинговое: когда жить не один будешь, семью заведешь, не до новых тенденций в IT станет.

И вот, что тогда, что сейчас - что-то совсем не могу их понять. Ну почему с возрастом должно меньше хотеться учиться, узнавать что-то новое, интересоваться новинками в своей сфере?

понедельник, 11 мая 2015 г.

World of Tanks in Linux




Неудержимо захотелось после 9 Мая поиграть в World of Tanks. Помня, что где-то год назад я задавался целью завести его под Linux и находил в интернете какие-то зело сложные мануалы по установке патченного wine, что бы со всем этим не заморачиваться, я уж было собрался ставить Windows в dualboot. Но решил на всякий случай еще поискать, вдруг что-то изменилось с того времени...



суббота, 9 мая 2015 г.

Меняем комментарий, автора, email и дату коммита в git



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

суббота, 2 мая 2015 г.

Горячие клавиши Emacs в русской раскладке


ru_hotkeys.jpg 


В Emacs по умолчанию горячие клавиши заданы и соответственно работают в английской раскладке, после переключения на русскую - работать они перестают. Я довольно долго искал способ решения, перепробовал несколько разных, остановился на следующем…

понедельник, 27 апреля 2015 г.

Emacs как IDE для Rust


rust_logo.png Многие слышали про такой язык программирования как Rust, это чрезвычайно, на мой взгляд, перспективный и интересный язык от Mozilla, про него сейчас часто пишут и говорят. Он пока еще очень молод (в данный момент доступна только beta версия), в связи с чем поддержки в модных и популярных IDE для него нет или она очень слабая, а попробовать и составить мнение о языке хочется. Как обычно, в таких случаях на помощь нам приходит emacs, в нем относительно легко можно настроить подсветку синтаксиса, компиляцию, автодополнение и т.п.

среда, 22 апреля 2015 г.

Emacs backspace like sublime

В sublime есть одна вещь, которой мне очень не хватало в emacs, при выравнивании текста пробелами, клавиша <backspace> удаляла не один пробел, а сразу столько, сколько входило в один "tab". Это легче показать:
backspace.gif


Emacs из коробки так к сожалению не умеет, но как всегда исправить это совсем не сложно…

суббота, 18 апреля 2015 г.

Docker vs virtual machine

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

понедельник, 13 апреля 2015 г.

Умное назначение горячих клавиш в Emacs

Рано или поздно пользователям Emacs приходится переназначать горячие клавиши. Даже те, кто по идеологическим причинам используют дефолтные сочетания, приходят к тому, что нужно назначить на часто-употребляемую команду более простое сочетание клавиш или повесить hotkey на свой собственный скрипт. В интернетах советуют делать это как-то так:
(global-set-key (kdb "C-a") 'mark-whole-buffer)
Это какое-то время работает, пока не находится плагин, который переопределяет выбранное сочетание на что-то свое...

пятница, 10 апреля 2015 г.

Удаление в Emacs без копирования в буфер обмена

В Emacs есть такие замечательные функции, как удалить слово после курсора (kill-word), перед курсором (backward-kill-word), а так же удалить все символы от курсора до конца строки (kill-line). Однако у них есть одна особенность, они не просто удаляют символы, а еще копируют их в буфер обмена (так называемый kill ring). Лично меня подобное поведение не устраивает, поэтому я написал свои аналоги этих функций.

среда, 8 апреля 2015 г.

Авто установка пакетов в Emacs

Все наверное знают про возможность установки плагинов в Emacs, "M-x package-list-packages" и вперед - выбираем, устанавливаем, удаляем что не нужно. Это возможно удобно, когда мы экспериментируем с плагинами, играемся с новыми. Но допустим синхронизировать подобным образом плагины на всех своих машинах - уже желания никакого нет. Хочется прописать в конфиг названия всех используемых пакетов, а Emacs, пусть сам при загрузке проверит недостающие и доставит их. К сожалению, встроенной функциональности для этого в Emacs нет, однако добавить такую возможность, как и все остальное, в Emacs не сложно...

вторник, 7 апреля 2015 г.

Настройка PageUp PageDown в Emacs

По умолчанию работа клавиш PageUp PageDown в Emacs отличается от других редакторов. Вот в такой ситуации, когда курсор находится в нескольких строчках от верхнего края документа: 
в большинстве редакторов PageUp поставит курсор на первую строчку, а Emacs - ничего делать не будет, если вся верхняя часть документа попадает на экран. Не то что бы поведение других редакторов правильное, а в Emacs - нет, просто подобное поведение ожидается уже на уровне рефлексов и когда курсор не двигается - это раздражает. Но к счастью в Emacs можно поменять поведение почти всего и PageUp/PageDown не исключение, напишем две маленькие функции: 

(defun cfg:page-up ()
  (interactive)
  (condition-case nil (scroll-down)
    (beginning-of-buffer (goto-char (point-min)))))

(defun cfg:page-down ()
  (interactive)
  (condition-case nil (scroll-up)
    (end-of-buffer (goto-char (point-max)))))

Они - пододвигают курсор в начало (или в конец для page down) документа, если встроенные функции отказались это делать. Теперь назначаем их на нужные нам клавиши: 

(global-set-key (kbd "<prior>") 'cfg:page-up)
(global-set-key (kbd "<next>") 'cfg:page-down) 
 
Все готово, можно пользоваться.