Подумалось
aquarel, dog, ball
[info]asviraspossible
MicrosoftGNU
Win APIlinux, glibc, GLib, GTK+
GDIXlib, GDK, Cairo
Direct XSDL
Direct 3DOpenGL
Direct ShowGStreamer
COMD-Bus, GLib
Windows RegistryGConf
ASIOJack
Direct SoundPulse Audio, Open AL
Windows Installerdpkg, rpm
-APT, yum
.NETMono, Java, ...
AeroCompiz

Xpost to Haskell-Cafe
aquarel, dog, ball
[info]asviraspossible

Я писал GUI-проложение на Gtk2hs. Это интерпретатор ламбда-исчисления и комбинаторной логики, если кому надо могу поделиться, лицензия GPL.

Проблема в том, что GUI-код стал ужасно уродлив и я горю желанием полностью его переписать. Я смотрел в сторону всяких там FRP, но никто так мне и не объяснил, что такое FRP. Посты Conal Eliot'а слишком расплывчаты, чтобы служить определением. Хочется попробовать Grapefruit но я теряюсь, когда вижу стрелочную нотацию.

Я думаю над более легковесным и более императивным решением. Оно ближе к CSP (Communicating Sequential Processes) чем к FRP. Я тут набрасал на коленке программку, которая бы проиллюстрировала мой подход.

&lquo;Поведение&rquo; в моей версии это монада и не просто монада, а IO-монада (MonadIO), т. е. можно использовать любой ввод-вывод (а значит и Gtk2hs методы), какой захочется. Разница в том, что вы не навешиваете статичные обработчики событий, в которых пытаетесь понять что делать, глядя на глобальное состояние программы, вместо этого вы добавляете и удаляете обработчики, так часто, как это необходимо. &lquo;Поведения&rquo;, в таком случае выглядят, как процессы, которые могут заснуть в ожидании события от пользовательского интерфейса, и проснуться когда получат событие.

Есть несколько деталей, которые ещё нужно уточнить:

  • Как ждать несколько разных событий одновременно
  • Как обрабатывать IO-исключения

В общем-то сам код:

{-# LANGUAGE ExistentialQuantification #-}
module Main where

import Data.IORef
import System.Glib
import Graphics.UI.Gtk
import Control.Monad.Trans

type Event obj = IO () -> IO (ConnectId obj)

data Behaviour a =
  forall b. BBind (Behaviour b) (b -> Behaviour a)
  | BIO (IO a)
  | forall obj. GObjectClass obj => BWaitEvent (Event obj) (Behaviour a)

instance Monad Behaviour
  where action >>= generator = BBind action generator
        return a = BIO (return a)

instance MonadIO Behaviour
  where liftIO action = BIO action

runBehaviour :: Behaviour a -> IO a
runBehaviour (BBind (BWaitEvent event after) f) = runBehaviour (BWaitEvent event (after >>= f))
runBehaviour (BBind (BIO a) f) = a >>= \x -> runBehaviour (f x)
runBehaviour (BBind (BBind a f) g) = runBehaviour (a >>= (\x -> f x >>= g))
runBehaviour (BIO a) = a
runBehaviour (BWaitEvent event after) =
  do sigIdRef <- newIORef (error "You can't access sigIdRef before signal is connected")
     sigId <- event $
       do sigId <- readIORef sigIdRef
          signalDisconnect sigId
          runBehaviour after
          return ()
     writeIORef sigIdRef sigId
     return (error "You can't expect result from behaviour")

waitEvent :: GObjectClass obj => Event obj -> Behaviour ()
waitEvent event = BWaitEvent event (return ())

main :: IO ()
main =
  do initGUI
     window <- windowNew
     onDestroy window mainQuit
     set window [windowTitle := "Hello World"]
     button <- buttonNew
     let buttonB label =
           do liftIO $ set button [buttonLabel := label]
              waitEvent (onClicked button)
              buttonB (label ++ "*")
     runBehaviour (buttonB "*")
     set window [containerChild := button]
     widgetShowAll window
     mainGUI

Здесь buttonB label — это поведение. Оно выставляет надпись на кнопке, ждёт события нажатия кнопки, а затем работает так же, только к надписи на кнопке добавляется звёздочка. Технически, при каждом нажатии на кнопку перевешивается обработчик нажатия на тот, который выставляет надпись на кнопке на ту же, только с дополнительной звёздочкой. Подобным образом я думаю реализовывать более сложные схемы процессов. При этом в коде не нужно проверять состояния, так как будет висеть тот обработчик для которого уже статически ясно что нужно делать.

XPost to ru_declaretive


Quod Libet
aquarel, dog, ball
[info]asviraspossible
После долгих поисков нашёл идеальный плеер под Linux: Quod Libet. Очень похоже на foobar2000, интерфейс конечно другой, но набор возможностей почти тот же. Так что советую всем фубаристам переходить на Quod Libet, так как это чудо кросс-платформенное и под Windows тоже работает, чем больше пользователей, там лучше продукт и всё такое.

(no subject)
aquarel, dog, ball
[info]asviraspossible
Прослезился

Купил вот...
aquarel, dog, ball
[info]asviraspossible



Lenovo ThinkPad SL500



Люблю когда есть клитор... Поставил Ubuntu 9.10 и полночи настраивал сканер отпечатков пальцев. Мне нравится...


Californication
aquarel, dog, ball
[info]asviraspossible
Может быть кто-то не смотрел, но это офигительный сериал. Офигенный, офигенный, офигенный. Долой графоманию и высокопарные обороты. It makes my heart hurt...



Про карты
aquarel, dog, ball
[info]asviraspossible
Чтобы идеально перемешать колоду нужно 7 раз смешать половинки колоды: http://www.dartmouth.edu/~chance/teaching_aids/Mann.pdf

(no subject)
aquarel, dog, ball
[info]asviraspossible
А, и ещё!!! Я прошёл Yoshi's Island!!!

Avatar
aquarel, dog, ball
[info]asviraspossible
Есть такая странная вещь в современных операционных системах: эмулятор текстового терминала. Когда делался Unix (60-е лето любви, LSD и марихуаны) появились "микрокомпьютеры" и пользоваться ими можно было с помощью телетайпов --- такая печатная машинка, которую можно подключить к компьютеру. То что тебе говорит компьютер для тебя печатается на ленте, а то, что ты говоришь компьютеру ты набиваешь на клавиатуре. Так как вся Unix-комманда имела страсть к созданию новых слов, путём выкидывания букв из старых, что можно пронаблюдать в новом языке программирования Go, который они создали, то телетайп стал называться tty. Позднее стали распространены более практичные устройства "текстовые терминалы", фишка которых была в том, что некоторые последовательности символов обрабатывались самим терминалом, а не передавались компьютеру. Благодаря этому свойству можно было генерировать управляющие последовательности и тем самым "рисовать" на терминале: произвольно передвигать курсор по экрану и заполнять его разноцветными символами. Так появился псевдо-графический интерфейс (недогуи) лучшим воплощением которого спустя пару десятков лет стала программа Norton Commander для MS DOS. С распространением текстовых терминалов распространилась и Unix, благодаря прикольной лицензии и анти-монопольным мерам которые применялись тогда к компании внутри которой она создавалась. Так Unix превратилась в BSD, SGI, Sun OS и тысячи подобных операционных систем, которые вынуждены были соблюдать баланс совместимости между друг другом. В то же время та же Unix-комманда создала первый графический-терминал, где можно было реально "рисовать". Кроме того появились локальные сети, которые в результате приведут к появлению Интернет. Но было уже позно. Запущенные ветви Unix разлетались в разные стороны всё дальше и дальше, и единственной связью друг с другом была их родная звезда, оригинальная Unix. Текстовые-терминалы стали необходимым условием существования системы. И сегодня загружая свою домашнюю Ubuntu вы постоянно видите чёрные окошки "терминалов". Даже если у вас нет текстового терминала, чтобы жить Unix'у приходится его эмулировать.

Есть такая штука AAlib --- это библиотека для вывода видео. Она превращает видео-поток в поток команд для текстового терминала, в результате чего видео "проигрывается" в текстовых терминалах в виде набора картинок, которые сейчас принято называть ASCII-art. У вас есть 80 на 25 позиций, куда можно поставить один из около 200 символов, всё это можно раскрасить в 16 цветов. Благодаря MPlayer можно посмотреть любой фильм в любом популярном формате в окошке терминала.

Так вот к чему это я всё. На создание Avatar'ной версии сказки про Пакахонтес, Кэмерон угробил невминяемое количество бабла, вычислительных ресурсов и усилил глобальное потепление нагревая воздух огромными кластерами Unix-машин. В связи с этим, мне кажется наиболее дзен-кашерным (поклон Витеньке Пелевину) способом просмотра этого творения было бы полностью посмотреть фильм в текстовом терминале. Если то, что пишет Волабуев верно и Кэмерон до сих пор умеет снимать стружку с вечных историй, так как делал в своё время Спилберг или Лукас, то должно получится смотрибельно, со Звёздными Войнами же покатило.

(no subject)
aquarel, dog, ball
[info]asviraspossible
http://lukepalmer.wordpress.com/2009/12/20/reflections-on-a-holy-grail-frp/

Такой вдохнавлённый текст. Я тоже себя так часто чувствую, видимо. А может я просто очень мало читал и общался с людьми последнее время. Мне кажется, что проблема физики и FRP в том, что чтобы изменить взляд на мир надо изменить взгляд на самого себя. Эти слова так банально звучат без контектса, но по отношению к физике и FRP мне кажется это очень важно. Понятие "наблюдателя" настолько же вредно для физики как и понятие "элементарная частица" и настолько же вредно для FRP как и понятие "время" (Последнее утверждение особенно спорно, по-моему). Нет никаких людей, нет никаких частиц, нет никакого времени. Мир это что-то другое. И чтобы его понять надо отказаться от всех предубеждений.

По этому поводу была интересна статья http://arxiv.org/pdf/0704.0646. Я искал эту статью, наткнулся в википедии на http://en.wikipedia.org/wiki/Multiverse и там есть фраза "Thus, far beyond our cosmological horizon, there will eventually be a Hubble volume identical to our own. Tegmark estimates that such an identical volume should be about 10^(10^115) meters away." Я прочёл это и подумал что за человек этот Tegmark, что может оперировать такими числами, КАК ВООБЩЕ МОЖНО ОПЕРИРОВАТЬ ТАКИМИ ЧИСЛАМИ? И вот в конце я нашёл именно ту статью, что я искал и оказалось, что её написал тот самый Tegmark :)

What is the meaning of an interactive program?

Haskell 2010 is out
aquarel, dog, ball
[info]asviraspossible
http://hackage.haskell.org/trac/haskell-prime/wiki

То что вошло:

http://hackage.haskell.org/trac/haskell-prime/query?status=new&status=assigned&status=reopened&state=accepted&milestone=Haskell+2010&order=priority

А это программа на Haskell, которая выводит программу на Python, которая выводит программу на Ruby, которая выводит исходную программу на Haskell.

q a b c=putStrLn $ b ++ [toEnum 10,'q','(']
  ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] 
++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" 
  "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" 
  "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print 
b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"

Теория категорий в Haskell
aquarel, dog, ball
[info]asviraspossible
Вот пытаюсь читать: http://www.math.uchicago.edu/~may/VIGRE/VIGRE2009/Awodey.pdf

какие-то мысли )

(no subject)
aquarel, dog, ball
[info]asviraspossible
Yeeepieee, I've just got Google Wave invitation. Let's wave together.

(no subject)
aquarel, dog, ball
[info]asviraspossible
Хуй войне. Давно не просыпался таким бодрым и здоровым. Не знаю, что сыграло больше Ягуар или Терафлю. Возможно это чудесная комбинация. Radioactive Toy и Сидя на красивом холме. Новая музыка на плеере и готовность ко всему. Я это я и я буду собой во чтобы то ни стало.

(no subject)
aquarel, dog, ball
[info]asviraspossible
Моральным релятивизм утверждает, что этика становится
субьективной, только когда вы приближаетесь к скорости света.
Таким образом, абсолютно нормально плевать на окружающих,
красть и убивать пока вы двигаетесь действительно,
действительно быстро.

(Замечание: именно по этому реп звучит лучше,
если вы едите ночью по шоссе со скоростью 150 км/ч)

(C) xkcd

Why I am not a Professor
aquarel, dog, ball
[info]asviraspossible
http://www.lambdassociates.org/blog/decline.htm

нашёл у [info]iakovz

Новый Веб2.0-сервис, для меломанов
aquarel, dog, ball
[info]asviraspossible

В отличие от last.fm позволяет отслеживать прослушивание всякой музыки из браузера. Вообще, по информации с сайта — офигенно интегрированный во всё сервис.

twones.com

The magic of our site begins with the Twones Tracker, which tracks all of your plays from around the web and on your computer and ties them all back to your Twones library. As long as you have your tracker-enabled browser active, all of your plays end up in Twones — ready to be organized, shared, or accessed from anywhere on the web.

The best part? Tracking is only the start. When you hit “play” in your Twones library, you are immediately connected to a world of information about that track and artist. From Wikipedia info and similar artists, to YouTube videos and Flickr pictures — Twones even gives you up-to-the-minute tour schedules and allows you to track the artist’s buzz on Twitter!

Finally, discovering new music is social, so we’ve built social sharing features into every area of Twones. If you want to discover music in Twones, just go to the “on air” section and rock out to what’s playing on the real-time web from your friends or the entire Twones community. If you want to share a song or even a playlist you made in Twones with your friends in the outside world – just hit the “Tweet” button!


Type classes considered underused
aquarel, dog, ball
[info]asviraspossible
Прикольный пример классов-типов для численных методов:
http://cdsmith.wordpress.com/2009/09/20/side-computations-via-type-classes/

Upd: моя версия кода: http://www.hpaste.org/fastcgi/hpaste.fcgi/view?id=9676#a9677

(no subject)
aquarel, dog, ball
[info]asviraspossible
Вот здесь разыгрываются билеты на Аквариум на 23 октября в Б1: http://golubchikav.livejournal.com/820693.html

Вы охуели?
aquarel, dog, ball
[info]asviraspossible
Зашёл в вконтакт, а он "для подтверждения регистрации введите номер телефона". Проверил /etc/hosts в винде, закрыл, ещё раз перешёл по ссылке из закладке: нет, не spoof... Они уже собрали базу людей и университетов, теперь ещё телефоны хотят, WTF?

Home