LINUX.ORG.RU

Избранные сообщения nerdogeek

Брутальная тестилка программ

Форум — Development

Вот примерно что я хочу: есть запущенный процесс и нужно натравить на него программу-тестилку. Что может делать эта тестилка: проверяет открытые файлы и рандомно их удаляет/закрывает, шлёт posix сигналы процессу случайным образом, стопает и продолжает работу процесса, подключается к слушающему сокету и пишет туда мусор и т.п. Хотелось бы чтоб такая тестилка ещё могла запускать приложение с разными rlimit, в chroot'е... Ну в общем вы поняли хотелку. Есть ли подобное решение, такая брутальная тестилка?

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

 ,

nerdogeek ()

Что почитать по concurrency и memory model в С++11

Форум — Development

Интересуют atomics, CAS, memory barriers, false sharing detection and prevention, lock-free структуры данных, разные примеры happens before и т.д.

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

Статьи тоже сойдут, хотя я уже их начитался.

 , ,

vertexua ()

Haskell, монады, память, и все-все-все

Форум — Development

Есть задача - пройтись по текстовому файлу и найти максимальное число одинаковых последовательно идущих строчек. Задача весьма синтетическая, просто надо продемонстрировать, что

  • Потоково обрабатывается некий объем данных;
  • Есть состояние - надо помнить предыдущую строку в файле при обращении к следующей.

Решение в лоб на IORef-ах (m1.hs):

module Main where

import Data.IORef
import Control.Monad (forM)

main :: IO ()
main = do
   input    <- getContents
   lastLine <- newIORef (Nothing)
   counter  <- newIORef (0)
   result   <- newIORef (0)

   let incr    = modifyIORef counter (\x -> x `seq` x+1)
       reset s = do c <- readIORef counter
                    r <- readIORef result
                    writeIORef result (max c r)
                    writeIORef lastLine (Just s)
                    writeIORef counter  1

   forM (lines input) $ \line -> do
     ml <- readIORef lastLine
     case ml of
       (Just s) -> if s == line then incr else reset line
       Nothing  -> reset line

   r <- readIORef result
   putStrLn $ "Largest subsequence of equal lines: " ++ show r

Более модное решение с трансформером StateT (m2.hs):

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

import Control.Monad (forM)
import Control.Monad.State.Strict

data AppContext = AppContext { ctxLastLine :: Maybe String
                             , ctxCounter  :: Integer
                             , ctxResult   :: Integer
                             }

initialContext :: AppContext
initialContext = AppContext { ctxLastLine = Nothing
                            , ctxCounter  = 0
                            , ctxResult   = 0
                            }

newtype App a = App (StateT AppContext IO a)
                deriving (Monad, MonadIO, MonadState AppContext)

runApp (App app) = execStateT app

incr :: App ()
incr = do
   cnt <- gets ctxCounter
   modify $ \s -> s { ctxCounter = cnt+1 }

reset :: String -> App ()
reset l = do
   cnt <- gets ctxCounter
   res <- gets ctxResult
   modify $ \s -> s { ctxLastLine = Just l
                    , ctxCounter  = 1
                    , ctxResult   = max res cnt
                    }

processLine :: String -> App ()
processLine line = do
   ll <- gets ctxLastLine
   case ll of
      (Just s) -> if line == s then incr else reset line
      Nothing  -> reset line

main :: IO ()
main = do
   input <- getContents
   s <- runApp (forM (lines input) processLine) initialContext
   putStrLn $ "Largest subsequence of equal lines: " ++ show (ctxResult s)

Интересно, как поведут себя оба варианта на обработке, скажем, «Улисс» Джойса (txt, 1.6 MB):

[dmatveev@localhost memq]$ ghc --make m1.hs -rtsopts -prof
[1 of 1] Compiling Main             ( m1.hs, m1.o )
Linking m1 ...
[dmatveev@localhost memq]$ ghc --make m2.hs -rtsopts -prof
[1 of 1] Compiling Main             ( m2.hs, m2.o )
Linking m2 ...
[dmatveev@localhost memq]$ du -sh ulysses.txt
1.6M    ulysses.txt
[dmatveev@localhost memq]$ wc -l ulysses.txt
33055 ulysses.txt
[dmatveev@localhost memq]$ time cat ulysses.txt | ./m1 +RTS -hd -i0.001
Largest subsequence of equal lines: 5

real    0m1.599s
user    0m1.577s
sys     0m0.021s
[dmatveev@localhost memq]$ time cat ulysses.txt | ./m2 +RTS -hd -i0.001
Largest subsequence of equal lines: 5

real    0m19.360s
user    0m19.123s
sys     0m0.091s

ШОК! Посмотрим, что там с памятью:

[dmatveev@localhost memq]$ hp2ps -e8in -c m1.hp
[dmatveev@localhost memq]$ hp2ps -e8in -c m2.hp

m1.png, m2.png

Очевидно, что во втором примере что-то течёт, а я что-то глобально упустил.

Вопросы:

  1. ЧЯДНТ?
  2. Как быть?
  3. Как правильно готовить монадические ивентлупы с изменяемым состоянием?

З.Ы. Да, я знаю, что на awk это решается проще и быстрее, суть-то не в этом, а в вопросе №3. Извините за неровный почерк.

 ,

yoghurt ()

К вопросу построения аксиоматической теории вечного блаженства: все ли дороги ведут в ниббану?

Форум — Talks

Часть I. Почему вы ещё не на героине?
Мой друг Миша говорит, что человек - это автомат, стремящийся к максимизации удовольствия. Только ли?

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

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

Получается, какой контраргумент не придумай, абсолютное блаженство всё равно его перекроет, и человек, как автомат, который стремится удовольствие максимизировать, должен выбирать нирвану?
Правда, концепция «вечного блаженства» может быть противоречивой, как идея всемогущего бога («может ли бог создать камень, который сам не может поднять?») или концепция множества всех множеств (парадокс Рассела).

Тогда можно придумать что-то менее идеалистичное:
Если бы вам вместо вашей жизни (которая включает в себя людей и предметы, которые вы любите) предложили всю жизнь стимулировать центр удовольствия электротоком или какие-нибудь очень крутые наркотики, которых бы хватило на всю жизнь, что бы вы выбрали?

Насколько интересна такая концепция: есть маленькая часть меня, которая осознаёт себя и тянется к удовольствию (а может, есть ещё меньшая?). Большая навязывает ей все эти игры в изучение мира, создание чего-то и социальный статус. Но почему маленькая часть должна играть в них?
А может, вопрос в том, с какой из частей себя отождествлять?

И что во мне тогда сопротивляется идее о нирване?

Часть II. Есть ли у IBM Watson природа будды?
Привязываться к человеку довольно скучно. Можно ли в принципе создать разум (или изменить сегодняшнего человека, как мечтают, например, эти ребята - http://ru.wikipedia.org/wiki/Аболиционизм_(биоэтика)), для которого игры в науку и творчество будут предпочтительнее статичного получения кайфа? Лишим его страдания в теперешнем понимании, заменим его «информационно-сигнальными градиентами здоровья», что бы это не значило, и дадим возможность получать от разных видов деятельности разные оттенки удовольствия.

Но не будет ли и для него статичное состояние, включающее одновременно все эти оттенки, более предпочтительным, чем упомянутые выше игры? И не будет ли обычное лишённое страданий, но не насыщенное всеми оттенками удовольствий состояние всё равно в каком-то смысле страданием?

Получается, буддизм неизбежен?

Интересное чтиво не в тему: http://en.wikipedia.org/wiki/Hilbert's_paradox_of_the_Grand_Hotel
Linux тут при том, что он был написан JFF.

Deleted ()

Кинематограф. Домашняя фильмотека

Форум — Talks

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

nihil ()

Новый фундамент интерфейса, всплывающие окна, тонущие двери, мастерская идей

Форум — Talks

Инновационный интерфейс, новая корневая идея, всплывающие окна, тонущие двери, убегающие стенки, конкурирующие звёзды, толкающие шары

Приглашаю в творческю мастерскую идей интерфейса

Есть обширное рабочее пространство. Одни окна лежат поверх других. Есть обычные координаты xгоризонталь и yвертикаль. Также есть zглубина. Слишком глубокие окна тонут и сворачиваются в иконку нижнего моря панели. Слишком близкие окна конкурируют с другими близкими окнами, конкуренты представляются как звёзды в верхней панели небе.

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

Передо мной круглая дверь около изображения, на ней надпись размытие. Я постучал в дверь. Из неё вышли две двери, размыть гаусово, размыть пиксельно, дверь из которой они вышли вывернулась на изнанку и утонула.

Я стучу в дверь размыть гаусово и за ней начинает размываться картинка. Я достаю картинку из за двери, но не даю утонуть этой двери, поэтому изменения оригинальной картинки влияет на размытую версию.

Я листаю каталоги информация загружается и стенки убегают. Ограниченность оперативки не позволяет мне разогнать все стенки, я какбы в пузыре стенок.

Я захожу в виртуальную машину через дверь и закрываю эту дверь изнутри, мне не мещают другие элементы я полностью в контексте.

Я трогаю шар под определённым вектором и вызываю причину его качения, ура я сделал необративное действие, это шаротрон.

Но я до этого ясно видел последствия трогания шара в этом векторе, потому что я представлял дальнейшие касания. Это как всё равно как нажать на кнопку.

Прошу не придираться к фантастичности и другому. А приглашаю в мастерскую перлов во имя новых идей !!

Перемещено tazhate из development

 ,

masloed ()

Хочу купить мак, но чтобы не мак

Форум — Linux-hardware

Хочу купить легкий, быстрый ноут отличной сборки с громандным ресурсом батареи, но не от Apple, потому что я не гей

Поставлю туда линукс.

Есть такие?

vertexua ()

хорошие фильмы

Форум — Talks

посоветуйте хороших фильмов, в любом жанре, он не важен, главное интересные, вроде: достучаться до небес, легенда о пианисте, адвокат дьявола, персонаж, игры разума, киборг 2, терминатор 2. Уточнение: такие фильмы как спидермен, халк, аватар, являются трешем, то есть, подобные предлагать не нужно, в них песчинки смысла нет.

makeB ()

Современные гениальные ВИА

Форум — Talks

Слышал такие: MGMT, Tame Impala, Pond, Portugal The Man...
Какие еще?
Прошу указывать только современные. Всякие старые, типа The Velvet Underground, The Doors, Pink Floyd... и не очень (Queen, Комитет Охраны Тепла...) и другие не указывать.

 

nerdogeek ()

Бьёрн Страуструп выбирает борщ: «С++ почти так же быстр как Haskell»

Форум — Development

В дополнение к предыдущему посту о сферах применимости С++ и шедевральному посту об ооп (в данный момент продолжающегося обсуждением топологии Скотта).

(credits: гугля материалы о лиспе, случайно наткнулся на вот такой пост в ЖЖ, откуда я невозбранно изъял множество текста для написания этого сообщения.)

Итак, виновник торжества, этот пдф: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3449.pdf

Автор С++, преподобный Страуструп, и команда отчаянных друзей-борщевиков пишут новую библиотеку для диспетчеризации по типам с помощью внешней интроспекции. Это либа, написанная на шаблонах С++x11, и называется Mach7 (почти как вот эти няшные автомобильчики)

Вот, собственно, что так хочет видеть в крестах сам преподобный Бьорн:

int eval (const Expr& e)
{
    Match(e)
    Case(const Value& x) return x.value;
    Case(const Plus& x) return eval (x.e1)+eval(x.e2);
    Case(const Minus& x) return eval(x.e1)−eval(x.e2);
    Case(const Times& x) return eval(x.e1)∗eval(x.e2);
    Case(const Divide& x) return eval(x.e1)/eval (x.e2);
    EndMatch
}

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

struct Expr { virtual int eval () = 0; };
struct Value : Expr { ⋯ int eval (); int value ; };
struct Plus : Expr { ⋯ Expr& e1; Expr& e2; };

но более открытый (читай: расширяемый) дизайн заключается в другом:

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

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

Насколько быстро теперь работает? Говорят, примерно как OCaml или Haskell:

Библиотека реализована как стандартный C++11 код с шаблонным мета-программированием и несколькими макросами. Оно работает примерно также быстро, как эквиваленты на OCaml или Haskell, и даже иногда приближается по быстродействию или даже становится быстрее написанного руками C++ кода, который использует Visitor дизайн-паттерн.

Ну это хорошо, что так быстро, как OCaml или Haskell. Вопрос, зачем при таком раскладе использовать C++, замнём для ясности.

Но дальше вообще прелесть идёт: критика паттерна Visitor!

Библиотека Mach7 и идеи в ней были мотивирована нашим неудовлетворительным опытом работы с различными C++-ными фронт-эндами и фреймворками для анализа программ. Проблема была не с самими фреймворками, но с фактом, что мы должны были использовать шаблон проектирования Visitor для того, чтобы смотреть, обходить и обогощать абстрактные синтаксические деревья целевых языков. Мы нашли Visitor-шаблоны неподходящими для прямого выражения логики приложения, удивительно сложными для обучения студентов, и часто более медленными, чем решения для обхода, написанные вручную. Вместо них, пользователи опирались на динамические приведения типов во многих местах, часто многоуровневые, таким образом предпочитая более короткий, более ясный, и более прямой код, нежели чем Visitor'ы. Соответствующий проигрыш в производительности был обычно незамечаем до более поздних стадий кодирования, когда уже было поздно что-то менять.

Ну можно поздравить C++, теперь можно на нём отдельные вещи писать почти так же коротко, ясно и почти так же быстро, как на OCaml.

В пдф по ссылке присутствуют графики сравнения перфоманса Хацкеля и Крестов, начертанные самим преподобным Бьорном, очень рекомендованные к просмотру для тех, кто еще не готов отречься от старых убеждений и перейти на новые.

Заметим, что не только Страуструп раскаялся в прошлом. Кармак с энтузиазмом рассказывает, как с головой погрузился в Haskell и Scheme, объясняет, почему хаскель невероятно крут и почему сегодня он бы, вероятно, сделал QuakeScheme вместо QuakeC. Он пишет на хаскеле порт wolf3D. (видео на ютубе — Quakecon 2013, обсуждение в толксах)

Пора задуматься о жизни, господа и дамы крестопоклонники.

 , , , ,

stevejobs ()

Запустить bovinate сразу на всех файлах проекта EDE

Форум — Development

Всем привет. Использую Emacs 24.3 + последний CEDET, и возникла одна небольшая проблема с навигацией по коду.

Есть проект на C/C++, в котором довольно часто приходится пользоваться функцией semantic-analyze-proto-impl-toggle, чтобы перескочить к определению функции. Но эта команда не работает для ещё ни разу не открывавшихся .c/.cpp файлов, тк semantic их ещё не распарсил. Есть ли в Semantic стандартный способ запустить распарсивание всех C/C++ файлов в корне проекта и подкаталогах, как будто мы заходим в каждый из них по отдельности и запускаем bovinate?

 ,

Cheater ()