anton_nazarov: (Default)
В дополнение к предыдущему посту функция для скачивания выбранных треков из плейлиста EMMS. Чтобы в плейлисте можно было отмечать треки, надо нажать M-x emms-mark-mode. Кнопка m выделяет треки, кнопка w (от wget) скачивает выбранные песни в папку emms-source-file-default-directory.

(defun my-wget-track (track)
  (start-process "wget" (get-buffer-create "my-wget-output") "wget"
                 (cdr (assoc 'name track))
                 "--progress=dot"
                 "-O"
                 (expand-file-name
                  (format "%s - %s.mp3"
                          (cdr (assoc 'info-artist track))
                          (cdr (assoc 'info-title track)))
                  emms-source-file-default-directory)))

(defun my-emms-download ()
  (interactive)
  (if (emms-mark-has-markedp)
      (let ((tracks (emms-mark-mapcar-marked-track 'emms-tag-editor-track-at t)))
        (dolist (track tracks)
          (my-wget-track track)))
    (my-wget-track (emms-tag-editor-track-at))))

(define-key emms-playlist-mode-map "w" 'my-emms-download)
anton_nazarov: (Default)
Чего бы не делать, лишь бы не работать!

Читал Хабр, наткнулся на пост про ВК и решил поиграться.

В результате написал две функции для Emacs - заслать текущий буфер на стену и получить плейлист из вконтактика в EMMS (Подробнее тут).

Код ниже, прежде, чем пользоваться, надо сходить по адресу и скопировать из адресной строки значение параметра access_token. Потом это значение надо вписать в переменную vk-auth-token, а в переменную vk-user-id - свой id. Можно использовать M-x customize-variable vk-auth-token и M-x customize-variable vk-user-id.

(defcustom vk-auth-token
"YOUR-TOKEN"
"VK API auth token" :type 'string)

(defcustom vk-user-id YOUR-ID "VK User Id" :type 'number)

(defun vk-post ()
  (interactive)
  (url-retrieve-synchronously
        (format
         "https://api.vk.com/method/wall.post?owner_id=%d&message=%s&v=5.0&access_token=%s"
                        vk-user-id (url-hexify-string (buffer-string))
                        vk-auth-token)))


(defun vk-get-audio (&optional arg)
  (interactive "PUser id:")
  (let ((id (if arg arg vk-user-id)))
    (set-buffer 
        (url-retrieve-synchronously (format
        "https://api.vk.com/method/audio.get?owner_id=%d&need_user=0&v=5.10&access_token=%s"
            id vk-auth-token) 't 't))
    
    (set-buffer-multibyte 't)
    (search-forward "{")
    (backward-char)
    (let* (
           (json-array-type 'list)
           (items (cdadar (json-read))) (vk-emms-buffer (emms-playlist-new)))
      (set-buffer vk-emms-buffer)
      (dolist (item items)
        (let ((track 
               (emms-track 'url (cdr (assoc 'url item)))))
          (emms-track-set track 'info-title  (cdr (assoc 'title item)))
          (emms-track-set track 'info-artist (cdr (assoc 'artist item)))
          (emms-playlist-insert-track track)))
      (switch-to-buffer vk-emms-buffer))))
anton_nazarov: (Default)


Захотелось мне во что-нибудь поиграть и я вспомнил, что несколько лет не играл в шахматы с людьми. Я подумал, что найти подходящего соперника легко можно в интернете. Пошел во вконтактик и запустил самое популярное приложение по слову "шахматы". Оказалось, что несколько друзей его тоже запускали, а у двоих даже есть сыгранные партии!
Я сыграл несколько партий и выяснил досадную вещь - игроки в приложении в основном из России и из-за разницы во времени я не всегда могу найти подходящего соперника. А вскоре выяснилось, что само приложение не очень стабильно и иногда бывает недоступно. Я разочаровался в веб-приложении.

Но вскоре вспомнил, что когда я первый раз ставил Linux в 10 классе, там была программа xboard. Посмотрел в списке пакетов - она до сих пор существует и позволяет играть как с компьютером, так и через интернет. Причем популярный бесплатный сервер FreeChess существует с 1995 года!
Я тут же зарегистрировался и сыграл несколько партий.
Помимо xboard можно использовать и другие программы-клиенты. Приятно, что Mobialia chess для android работает и на моей книжке Nook Simple Touch.

Конечно, для игры на freechess.org совершенно не обязательно ставить специальную программу. Можно просто запустить java-апплет с сайта или даже соединиться telnet-ом и вводить ходы с клавиатуры.

Оказалось, что есть клиент и для emacs - emacs-chess. Причем существует много лет, так что даже в Debian есть пакет, правда сломанный. В нем не хватает изображений фигур, которые надо скачать отдельно. Причем после установки emacs-chess можно играть как с компьютером (M-x chess), так и с людьми через интернет (M-x chess-ics).

К сожалению, emacs-chess довольно старый пакет, поэтому в новой версии emacs, которая стоит у меня (emacs24.3.50.1 2014-01-01), при запуске возникают ошибки. Однако оказалось, что эти ошибки довольно просто исправить, о чем я и написал автору ([1], [2]). После этих исправлений можно играть против одной из трех шахматных программ - gnuchess, crafty и phalanx. Все программы есть в Debian/Ubuntu. Естественно, игра через интернет на FreeChess.org тоже работает.

Среди приятных особенностей игры на этом сервере стоит отметить поддержку различных вариантов шахмат, например, шведских шахмат, постоянные турниры и полную историю всех игр. История хранится на ficsgames.org, причем можно не только посмотреть партии, но и узнать статистику популярных дебютов и даже получить анализ партии прямо на сайте!
anton_nazarov: (Default)
Автор рассказывает про свои инструменты для программирования голосом. Особенно прекрасен набор специальных слов для управления emacs-ом и набора кода на разных языках программирования. Утверждается, что диктовать быстрее, чем набирать.



Отсюда
anton_nazarov: (Default)
Если вы используете оконный менеджер вроде dwm или xmonad, то вам может пригодится следующий трюк.

В .emacs добавить
(defun my-server-edit (&optional arg) 
  (interactive)
  (server-edit arg)
  (start-process "switch" nil shell-file-name shell-command-switch "xdotool key \"super+Tab\""))
(global-set-key "\C-x#" 'my-server-edit)

В .bashrc
export EDITOR=myemacsclient

А в ~/bin/myemacsclient
#! /bin/bash
xdotool key 'super+1'
emacsclient "$@"


Теперь при нажатии C-x C-e в окне терминала произойдет переключение на первое рабочее место, где у вас висит emacs, а после завершения редактирования командной строки - обратное переключение на окно терминала. Ну и в .conkerorrc можно добавить
editor_shell_command="myemacsclient";
anton_nazarov: (bw)
Пробую очередной клиент для живого журнала в emacs.
Вроде работает.
anton_nazarov: (Default)
10:55 22.08.2011
@naa: *geek *jabber *emacs *google
Гугл недавно поменял формат, в котором googletalk отдает список контактов. В результате jabber.el не мог его отобразить. Вот здесь описано решение этой проблемы: sourceforge.net

read more at Anton Nazarov (naa) - Juick

anton_nazarov: (Default)

Начал читать книжку "Dreaming in code".
Довольно интересно.
В книжке описывается история разработки программы-органайзера нового
поколения под названием Chandler. Оказывается версия 1.0 вышла совсем
недавно - в декабре, только через 6 лет после начала разработки!



Я пока прочитал только первые две главы, но рассказ о мотивации
основателя проекта, о предыдущих подобных проектах, таких как Lotus
Agenda и об идеях Энгельбарта о расширении способностей человека путём
использования компьютера напомнил мне, что в Emacs есть очень
продвинутый пакет Org Mode.
Про Org Mode я когда-то читал, но подробно разобраться руки не
доходили. А тут мне захотелось, и я потратил некоторое время на чтение
руководства.



По сути, Org Mode - это способ текстовой разметки, с синтаксисом типа
wiki. Но его возможности безграничны, это центральный компонент
интегрированного офисного пакета для операционной системы Emacs :)



Что я имею в виду: структурированный текст в файлах Org Mode можно
сворачивать, разворачивать и фильтровать. Любой элемент можно пометить
как задачу (TODO), добавить дату и время. При этом на лету формируется
список задач, а встречи добавляются в календарь, который можно
синхронизировать с другими органайзерами (например, я импортировал
календарь из Palm-а).



Кроме того, в файлы Org Mode можно добавлять ссылки на что угодно -
сайты в интернет, файлы (или конкретные места в файлах) на компьютере,
записи в адресной книге BBDB, письма (или записи в блогах, полученные
через RSS) в gnus, команды shell и функции на elisp, которые
выполняются по щелчку на ссылке.



А ещё в Org Mode есть редактор таблиц, который круче Excel-я, во
всяком случае вот пример из руководства:
Finally, just to whet your appetite on what can be done with the
fantastic `calc' package, here is a table that computes the Taylor
series of degree `n' at location `x' for a couple of functions
(homework: try that with Excel :-)

FuncnxResult
exp(x)4x1 + x + x2 / 2 + x3 / 6 + x4 / 24
exp(x)2x1 + x + x2 / 2
exp(x)3x1 + x + x2 / 2 + x3 / 6
x2+sqrt(x)2x=0.10.326 + 1.78 x - 0.178 - 2.95 (x - 0.1)2
x2+sqrt(x)2x=12 + 2.5 x - 2.5 + 0.875 (x - 1)2
tan(x)3x0.0175 x + 1.77e-6 x3




Помимо всего перечисленного, в файлы Org Mode можно вставлять
TeX-овские формулы с предпросмотром:








Да, и все заметки можно потом экспортировать в виде красивого html и
автоматически выкладывать в интернет.
Например, этот пост написан с использованием Org Mode. Исходный файл
выглядит вот так.



Теперь надо будет дочитать книжку и скачать Chandler для сравнения.
Правда там наверняка нельзя обойтись без использования мышки, да и не
понятно, есть ли интеграция с Emacs =)

anton_nazarov: (Default)
Специальный livecd Thnake содержит emacs 22.3 (включая gnus), python 2.5, tcl/tk 8.5 и sbcl 1.0.20.
Для разработки на lisp есть slime. В качестве браузера используется Conkeror, основанный на движке Firefox-а и использующий сочетания клавиш Emacs, очень быстрый и довольно удобный.
Весит всё это счастье всего 110 мегабайт.
Я поставил на флешку по этой инструкции.
После загрузки у меня заработал звук и wifi, легко подключился диск и русский язык.
anton_nazarov: (Default)
Я, конечно, страшный извращенец, но last.fm я слушаю таким вот зверским способом.
Сегодня в качестве отдыха приделал себе кнопочку сохранения понравившейся песни.
Для этого мне пришлось сделать следующее.
1. Написать shell-скрипт /home/anton/bin/lastfm-play-and-save.sh:
#!/bin/bash

FNAME=`mktemp ~/.shell-fm/savetmp/tXXXXXX` || exit 1
tee $FNAME | mpg123 -q -

if [[ -e "/home/anton/.shell-fm/savetmp/save" ]]; then
    { 
	read ARTIST
	read TITLE
    } < "/home/anton/.shell-fm/savetmp/save"
    cp $FNAME "/home/anton/music/${ARTIST} - ${TITLE}.mp3"
    mp3info -a "$ARTIST" -t "$TITLE" "/home/anton/music/${ARTIST} - ${TITLE}.mp3"
    rm "/home/anton/.shell-fm/savetmp/save"
fi;
rm $FNAME


2. Поменять конфигурацию shell-fm так:
username = anton_nazarov
password = мой пароль
extern = lastfm-play-and-save.sh


3. Добавить в свой .emacs следующее:
(defun my-save-mp3 ()
  "Saves mp3 from last.fm stream"
  (interactive)
  (let* ((art-tit (split-string (substring (shellfm-track-info) 18) " — "))
	 (artist (car art-tit))
	 (title (cadr art-tit)))
    (shell-command (format "echo -e \"%s\n%s\" > \"/home/anton/.shell-fm/savetmp/save\"" artist title))))

(global-set-key [(control XF86AudioPrev)] 'my-save-mp3)


Теперь по нажатию Control-Prev (у меня есть кнопки для управления музыкой на передней панели ноутбука) понравившаяся песня сохраняется в ~/music с правильным именем и id3 тегом.
anton_nazarov: (Default)
Поставил свежую версию slime из cvs, оказалось там теперь есть backend для mit-scheme, а ещё существует backend для clojure.
Про его установку и настройку здесь.
Clojure - это относительно новый диалект lisp, работающий на платформе java. В нём реализован интересный подход к многопоточности и сделан упор на функциональное программирование без побочных эффектов.

Так что теперь у меня работает sbcl, clojure и mit-scheme.



Чтобы использовать slime с этими языками надо в .emacs написать следующее:
(setq inferior-lisp-program "/usr/bin/sbcl") ; <-- insert your path
(add-to-list 'load-path "/home/anton/local/share/emacs/slime") ; <-- insert your path
(add-to-list 'load-path "/home/anton/local/share/emacs/slime/contrib") ; <-- insert your path
(require 'slime)
(require 'slime-autoloads)
(slime-setup '(slime-fancy slime-scratch slime-editing-commands slime-fuzzy slime-presentations slime-scheme))

(setq slime-net-coding-system 'utf-8-unix)
(setq common-lisp-hyperspec-root "/home/anton/programing/doc/lisp/HyperSpec/"); <-- insert your path

(setq slime-lisp-implementations
	     '((mit-scheme ("mit-scheme") :init mit-scheme-init)))

(add-to-list 'slime-lisp-implementations '(sbcl ("sbcl" "--core" "/home/anton/local/share/sbcl.core-for-slime")))

(defun mit-scheme-init (file encoding)
  (setq slime-protocol-version 'ignore)
  (format "%S\n\n"
	  `(begin
	    (load-option 'format)
	    (load-option 'sos)
	    (eval 
	     '(construct-normal-package-from-description
	       (make-package-description '(swank) '(()) 
					 (vector) (vector) (vector) false))
	     (->environment '(package)))
	    (load ,(expand-file-name 
		    "/home/anton/local/share/emacs/slime/contrib/swank-mit-scheme.scm" ; <-- insert your path
		    slime-path)
		  (->environment '(swank)))
	    (eval '(start-swank ,file) (->environment '(swank))))))

(defun mit-scheme ()
  (interactive)
  (slime 'mit-scheme))

(defun find-mit-scheme-package ()
  (save-excursion
    (let ((case-fold-search t))
      (and (re-search-backward "^[;]+ package: \\((.+)\\).*$" nil t)
	   (match-string-no-properties 1)))))

(setq slime-find-buffer-package-function 'find-mit-scheme-package)

(add-to-list 'load-path "~/local/share/clojure-mode"); <-- insert your path
(require 'clojure-auto) 
(setq swank-clojure-binary "/home/anton/bin/clojure") ; <-- insert your path
(add-to-list 'load-path "~/local/share/swank-clojure") ; <-- insert your path
(require 'swank-clojure-autoload) 
anton_nazarov: (Default)
Игрался сегодня с Emacs, настроил чтение почты из gmail-a через imap в gnus (это такой почтовый клиент внутри emacs), браузер в Emacs (w3m), и jabber, через который я сейчас и пишу этот пост.
Теперь осталось еще проигрыватель музыки прикрутить, и из Emacs-a можно будет уже не переключаться :)
anton_nazarov: (Default)
Вчерашняя запись про Emacs как-то не вызвала энтузиазма, поэтому я хочу поинтересоваться: было бы вам интересно прочитать про использования Emacs для программирования на Python-е (интерактивная отладка, рефакторинги, goto declaration, работа с системами управления версиями), для взаимодействия со свободным математическим пакетом Maxima и для верстки в LaTeX?

Еще из технических вещей я могу написать про опыт использования Django, и про то, чему я учу студентов, а из не технических - ощущения от чтения "Истории западной философии" Рассела :)
anton_nazarov: (Default)
Многие используют Maple для символьных вычислений и не догадываются о богатых возможностях языка программирования Maple.
Да я и сам их слабо представляю.

Например, в языке Maple есть средства функционального программирования, такие, как функции curry и map. Есть макросы и директивы препроцессора.

Однако программированию в Maple мешает пользовательский интерфейс, ориентированный на интерактивную работу. В частности, очень не удобно набирать длинные функции из-за необходимости заканчивать строчку нажатием Control-Enter и отсутствия автоматического сдвига новых строчек.

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

Но все эти проблемы помогает решить мой любимый текстовый редактор Emacs.

Чтобы писать программы на языке Maple в Emacs, нужно установить maplev mode. В Debian/Ubuntu maplev mode находится в пакете emacs-goodies.

Если maple и mint находятся в каталоге, входящем в $PATH, то практически никакая настройка не требуется, можно приступать к написанию кода.

На скриншоте видно, что Emacs дает возможности для программирования на языке Maple, которые привычны программистам на других языках - подсветку синтаксиса, автоотступы, браузер кода (ecb).



В Emacs есть еще и режим интерактивной работы с Maple, который конечно не столь хорош, как Imaxima, но все равно очень полезен для отладки. В этом режиме в окне Emacs запускается консольная версия Maple, и при нажатии соответствующего сочетания клавиш в Mape выполняется текущая строка, функция, выделенная область или весь редактируемый файл:

Profile

anton_nazarov: (Default)
anton_nazarov

September 2014

S M T W T F S
 123456
78910111213
14 151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 21st, 2017 05:00 am
Powered by Dreamwidth Studios