Pull to refresh
1
0
Send message

Ещё одно неортодоксальное мнение: для всего этого есть Emacs.


  • EXWM позволяет использовать Emacs как Tiling WM, причём относительно быстрый.
  • eww, w3 – встроенные текстовые браузеры. Но тут, признаю, трудно жить без хотя бы Firefox/Midori/Chromium.
  • mu4e, Gnus – почтовые клиенты. Текстовые, но красивые (особенно если сами заморочитесь с кастомизацией). Mu4e — быстрее, Gnus — универсальнее (он вообще как приложение для чтения Usernet News создавался, а дорос до полноценного почтовика).
  • Установщики пакетов часто с Emacs интегрируются, можно выбрать тот, что побыстрее, и использоывать с удобным интерфейсом: pacman, Guix, и явно можно найти ещё. А вообще, для Emacs есть огромная база пакетов, MELPA, в которой можно найти клиенты для Reddit, Twitter, Telegram, IRC; режимы для редактирования почти всех существующих на Земле языков программирования; и множество маленьких утилиток, облегчающих жизнь.
  • EMMS – встроенный плеер, использующий консольные бэкэнды для проигрывания музыки. Простой, но мощный.
  • Dired (или даже Dired+) как файловый менеджер.
  • А вот с VLC на территории VLC состязаться пока ничего не может, хоть я и слышал про видео-расширения для EMMS :)
  • Текстовый редактор? Дайте подумать… Emacs?

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


А ещё скоро (в следующей версии, 28) завезут нативную компиляцию, так оно будет совсем мгновенно работать...

Всё бы хорошо здесь, но ведь почему-то AdBlock-сервисы блокируют этот адрес. Как рассказано здесь, "googlesyndication" — это та часть Гугловской рекламы, что хранит и передаёт на тот же YouTube информацию о профиле пользователя, и его предпочтениях.


А для чего мы все используем AdBlock? Уверен, не только ради блокировки назойливой рекламы, но и для того, чтобы никто не мог в твою личную интернет-жизнь полезть своими немытыми руками и навесить на неё ярлычок, причисляя тебя к той или иной категории покупателей или иным образом воздействуя на тебя. Whitelist-ить сайт, против которого ставится AdBlock — как минимум нелогично.


Выбор, разумеется, за вами, но старинная мантра "Работает — не лезь" в случае AdBlock-ов верна, как нигде.

К сожалению, туториалов по StumpWM и переходу на него я не могу вспомнить, (кроме небольшого гайда) но это компенсируется относительной простотой использования и качеством документации, которая представлена двумя ресурсами: StumpWM Wiki и StumpWM Manual.


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


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



Также, поскольку для настройки используется Common Lisp, могут пригодиться курительные мануалы и туториалы по этому богатому языку, которые можно найти в боковом меню сабреддита, посвящённого Common Lisp — r/Common_Lisp.


Здесь казалось бы, отличный момент для меня поделиться своим конфигом, который содержит неплохое количество озарений и ещё больше еретических костылей, но я его выложу только через этак полгода, когда польностью перейду на максимально лисповую экосистему (GuixSD + StumpWM + Emacs + Konqueror/Next), приведу все конфиги в порядок, а заодно и статью на Хабр в процессе напишу, быть может.


А пока — на здоровье! Надеюсь, вам со StumpWM будет так же комфортно, как и мне.

Статья хороша как ликбез по Linux — лично я почерпнул что-то новое, за что благодарен автору.


Но вот именно решение задачи, на примере которой проводились бенчмарки, заставляет немного поволноваться. Причина возможного беспокойства — то, что определение чётности-нечётности работает только для two's complement целых чисел, представленных в памяти последовательностью битов. Здесь есть две вещи которые могу пойти не так:


  • Представление целых чисел со знаком в системе может быть в форме one's complement, при которой отлицательные числа инвертируются (00000001 (+1) -> 11111110 (-1)), что делает невозможным и некорректным определение чётности через бинарное AND единицы с младшим битом. Да, здесь можно справедливо заявить, что one's complement представление уже никем не используется, но нет, и нет. Вероятность мала, но она есть.
  • Числа в используемом языке/библиотеке/whatever могут представляться ну совсем не в виде последовательности битов ограниченной длины. В Common Lisp, который я всей душой люблю, в том числе за его систему типов, нет чётко специфицированного метода хранения bignum-ов, и число может, в зависимости от реализации языка, храниться даже в куче, по частям. Операции же над отдельными битами bignum-ов, в силу их реализации, часто превращаются в непредсказуемые числа, потому что программист мог не учитывать, к примеру, нули в начале числа, коих много, и получить при их инвертировании, к примеру, негативный ответ (вспоминаем, как работает two's complement и one's complement представление). Может случиться и такое, что определённая реализация определённого языка будет использовать младшие биты числа для какой-то своей нужды (что звучит подозрительно, но не значит, что кто-то так не сделает), а не для представления, собственно, низших битов числа, и при этом сможет допустить прямое взаимодействие с ними (нет программ без багов — есть только те, где их пока что не нашли).

Все эти риски могут рано или поздно выстрелить, потому рекомендация использовать модуло в общем случае для определения чётности относительно оправдана.

Пользуюсь StumpWM, чувствую себя в нём отлично, тем более что он имеет схожий пользовательский опыт с Emacs, которым я уже относительно давно болею.


Из плюсов отмечу:
+ Весьма быстрый
+ Гибкая настройка, вплоть до изменения кода самого WM из конфиг-файла
+ Common Lisp как язык настройки, что позволяет втянуть существующую кодовую базу прямо в WM. Есть у меня даже безумный проект написать небольшой плагин с онлайн-переводчиком, доступным по горячей клавише.
+ Вдохновлён Emacs, соответственно, нацелен на продуктивность и настраиваемость.


Разумеется, есть и минусы:
— Не все функции и хаки задокументированы, но пользователи некоторые из них переоткрывают, поэтому чужие конфиги помогают здорово. А все мы порой страдаем эффективной прокрастинацией а-ля "А настрою-ка я свой WM/редактор/whatever", так что вас впереди ждёт много открытий, если вы начинаете пользоваться StumpWM.
— Common Lisp, который является отдельным языком, который придётся учить, если ещё не знаете.
— Вдохновлён Emacs, поэтому многие вещи могут казаться странными.


Резюмируя: StumpWM как менеджер окон хорош, но на полную он начинает работать в руках людей, которые знают хотя бы один язык из семейства Lisp, со всеми вытекающими: хакинг, метапрограммирование, compile-time computing.

Здравствуйте! Статья действительно хороша для выявления недостатков в объяснении тем с нуля, сам делал подобные ошибки, пытаясь знакомых учить основам программирования.

Но комментарий этот я пишу не только из благодарности, но из **хакерского чувства челленджа**, вызванного данной цитатой:

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

Текст задачи:
Пользователь вводит число Х. Вывести в столбик числа от 0 до 9 и поставить знак '+' напротив того числа, которое равно Х.

Исходный код для решения задачи на языке Arc (краткий до невозможности диалект Lisp), как на первом попавшемся под руку языке, ниже:

(def mark-input (num)
     ; Определяем template -- шаблон строки на вывод
     (let template "0 \n1 \n2 \n3 \n4 \n5 \n6 \n7 \n8 \n9 \n"
          (if (and (>= num  0) (<= num 9))
              ; Если число находится в промежутке 0-9, 
              ; то вписываем '+' в template[(num*3) + 1]
              ; (Почему? Посмотрите на template 
              ; и расположение символов в нём).
              (= (template (+ 1 (* num 3))) #\+))
          ; Выводим итоговую строку. Не спрашивайте, откуда nil.
          (pr template) nil))


Результат выполнения:
arc> (mark-input 5)
0 
1 
2 
3 
4 
5+
6 
7 
8 
9 
nil
arc> (mark-input (read))
6
0 
1 
2 
3 
4 
5 
6+
7 
8 
9 
nil

Information

Rating
Does not participate
Registered
Activity