LINUX.ORG.RU

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

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
()

Nokia N900: hackers' choose

Галерея — Скриншоты

Linux здесь при том, что в Nokia N900 используется ОС Maemo, основанная на дистрибутиве Debian. И так, поехали.

Был далекий какой-то там год, когда я еще был школьником в начальных или около того классах, а по телеку шла реклама какой-то там Nokia с выдвигающейся QWERTY-клавиатурой, совсем как у компьютера! (речь скорее шла о ранних N-моделях, еще без функции звонилки) Мало сказать, что на меня, как на школьника-wanna-be-кулхацкера, такой девайс произвел сильный вау-эффект. Время шло, о девайсе забыл, реклама с телека пропала. На ЛОРе время от времени упоминали об этом девайсе, заглянул на ebay, - стоимость всего $140! Так, уже зарабатывая самостоятельно, я решил осуществить свою школьную влажную фантазию, и заказал сей аппарат, отдав половину зарплаты сторожа. :3

Посылка RS904098185CH шла из Гон-Конга, почтовой службой SWISS POST, и сначала полетела к себе в Швейцарию, и затем уже ко мне. Итого ~32 дня.

Телефон полностью оправдал все мои ожидания и даже больше. Как минимум, я расчитывал, «чтоб было не как у всех» - девайс с выдвигающейся клавиатурой (чтобы девочки с айфонами падали от моей крутизны). А получил целый линукс на борту!
Аппарат, к сожалению, как это называется, не «ванильный» прямо с печи с завода. По всей видимости был залочен, судя по наличию пункта меню, предлагающего снять блокировку. Что впрочем, никак не мешает его полнофункциональной работе. Энивей, я доволен.

Поскольку линукс предполагает полную свободу выбора и действий, то уже сейчас к данному телефону можно подключать различные USB устройства, используя лишь простенькие переходники USB - MicroUSB (не MiniUSB, обратите внимание! ибо разные вещи). И таки да, на людей производит сильное впечатление, когда из телефона на проводе болтается обыкновенная флешка, мигающая огоньком. Ибо их топовые айфоны, «купленные в кредит на два года», так не умеют (или они не знают об этом). =)

Сразу следом, бегло погуглив о возможностях телефона, из страны восходящего солнца были заказаны различные переходники, а именно:

  • USB A/F A/F переходник, куда втыкается USB с обеих сторон. Дата-кабель Micro USB подключается к телефону, USB порт кабеля втыкается в этот переходник, и в другой конец переходника уже можно подключить любое другое USB устройство.
  • Осознавая, что дата-кабель будет торчать сбоку и сильно мешаться лапе, был куплен USB A/F - Micro USB B/M переходник, расположенный уголком. Да, он на самом деле не сильно торчит из телефона и не мешается, и сразу в него втыкается любое USB устройство.
  • И почти такой же переходник, повернутый уголком чтоб не мешался, но болтающийся на проводе. Чисто для крутизны, чтоб та же флешка болталась в воздухе и всем ее было видать. =)
  • AV (TV) кабель, для подключения телефона к телевизору.
  • Внешняя сетевая Ethernet USB карточка, чтобы подключить ее через переходник к телефону, а в саму карточку воткнуть RJ-45 провайдера. Зачем? Потому что это круто!

Теперь ближе к самому девайсу. Так как, аппарат считается хакерским.. ну ладно, просто гиковским, но все же, на него была установлена соответствующая тема оформления Okuda. Уже имея небольшой опыт от своего предыдущего смартфона, я понимаю, что телефон - это телефон, и должен им оставаться. Ставить 100500 приложений на него просто нет смысла, ибо, не для того он создавался. Единственная актуальная софтина, это SSH-клиент, чтобы подключаться к компьютеру, серверу или куда еще... и уже на полнофункциональном компьютере выполнять все задачи. А не на телефоне. Так вот.

Что же было установлено?

  • rootsh для получения рута и полного контроля над телефоном.
  • OpenSSH Client для основной работы в терминале на удаленных устройствах.
  • OpenSSH Server чтобы подключаться к телефону и выполнять необходимые команды с компьютера, не мучаясь на крохотной хардварной клавиатуре.
  • Kernel Power единственная актуальная фича которого - поддержка IPv6, всем остальным заявленым я просто никогда не пользуюсь. И еще заметил, что телефон стал меньше жрать батарейку, что тоже плюс.
  • Mobile HotSpot для раздачи мобильных интернетов по Wi-Fi.
  • USB Hostmode для возможности подключать любые USB устройства к телефону.
  • Desktop Command Execution Widget для создания собственных «панелек» с выхлопом любой консольной команды. Тут уж все ограничивается вашей фантазией, какую информацию и откуда вы будете получать и выводить на экран телефона.
  • Custom Operator Name Widget для изменения названия оператора. Терпеть не могу «брендирование», поэтому просто удаляю надпись.
  • Extra Decoders Support для поддержки всевозможных кодеков.
  • Okuda theme тема оформления.

Вот список тех необходимых фич, которые ящитаю, должны быть в телефоне, хотя вторую половину из них (рюшечки) можно выкинуть. В любом мобильным девайсе самое главное SSH-клиент, все остальное просто не нужно(тм). Ведь для работы и выполнения любой функции всегда есть (должен быть?) свой десктоп/сервер, и не нужно устанавливать всякие мокрые кхм..софтины на телефон. Как завещал дедушка UNIX: нужно выполнять одну функцию, но делать ее хорошо.

На скриншоте рабочего стола, можно увидеть две иконки: терминал, браузер; а также виджет контроля аудиоплеера. В плеере играет Thunder King, - да, эпичнейший саундтрек к World of WarCraft из последнего официального альбома «Mists of Pandaria Vol. 2». Рекомендую оценить трек:

wget -O - 'http://spfng.com/Thunder_King.mp3' 2>/dev/null | mplayer -cache 4096 -

Пустой рабочий стол выглядит как-то так.

Терминал.

Браузер с ЛОРом.

Менеджер приложений.

Переключалка между окнами/задачами.

Такие вот пироги с котятами.

Возможно, этим постом я дал вам немножко «еды», но поверьте, я лишь как ребенок, может даже инфантильно, но искренне радуюсь этому девайсу, и только-то поделился всеми своими впечатлениями.

Спасибо. =)

 , ,

Spoofing
()

Опасные мониторы

Форум — Desktop

Начал углубляться в тему болезнености глаз. Хотел поделиться со всеми, кто пересобирает мир юзает африканский линупс. Причины усталости глаз:
— неродное разрешение монитора;
— ШИМ подсветки;
— излишняя или недостаточная яркость;
— кристаллический эффект (матовые дисплеи);
— блики (глянцевый дисплей);
— неправильное питание пикселей;
— шревты;
— растояние от дисплея;
— неправильная планировка времепровождения;
линупс
— ктулху.

Разбираем детально и ищем способы решения проблем.

С первым, думаю, всё ясно — выставляем родное разрешение указанное в технических хар-ках. В случае неродного разрешения, глаза устают после длительного чтения с экрана. Проблема кроется в том, что глифы шрифтов растеризуются под несуществующую пиксельную решётку, которая растягивается и искажается монитором. Шрифты кажутся размытыми.

ШИМ подсветки — беда и чума большинства современных мониторов. Яркость дисплеев регулируется путём изменения скважности импульсного питания подсветки. Регулировать яркость изменением тока невозможно, ибо кристал светодиода деградирует при незначительном уменьшении или превышении рабочего значения тока. По сути, светодиоды мерцают. Всегда.

Помните как нам вбивали в головы, что светодиоды это будущее? Мы ведь можем сэкономить 10Вт электроэнергии, что положительно скажется на выживании вымирающих видов африканских пони. Помните, да? Реальность обманчива — светодиоды просто дешевле, чем каноничные газоразрядные лампы. Несмотря на то, что яркость газоразрядных ламп тоже регулируется ШИМ — они не могут тухнуть моментально, таким образом уменьшая нагрузку на глаза. Светодиоды же, прекрасно и моментально тухнут.

Так что, разбираем монитор, выкидываем светодиоды и ставим лампочку Ильича. Берегите свои CRT и CCFL для детей — их глаза скажут вам спасибо. Да-да, CRT тоже. Никакого радиоактивного, альфа-, гамма-, бета-, тау-, лямбда- и прочего эзотерически-атсрального излучения у них нет. А те нещасные электроны, которые атакуют внутреннюю пов-сть дисплея не могут навредить на растоянии 20 и более см.

Яркость дисплея. Правило гласит: 100-200 Нт(Кд/м^2). Кроме того, разница между освещённостью окружающих пов-стей не должна превышать 200Лк (тут точно не помню, курим СанПин). Переводим взгляд на стену и затем, на монитор — уменьшаем яркость, если чувствуем напряжение в глазах. А у тебя продуманное общее освещение в помещении?

Кристаллический эффект. Зависит исключительно от типа покрытия дисплея. Такое ощущение, что мониторы тестируют свиборги, но не люди. Используем матовые дисплеи только в крайних случаях — в полевых условиях. В условиях нормальной и продуктивной работы в помещении — глянцевые дисплеи. А если пов-сть экрана бликует, то виноват в этом не дисплей, а твои кривые руки и бездарность в планировке рабочего места.

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

Ещё немного по дешёвым матрицам. Часто применяют низкокачественные поляризаторы, что приводит к цветовой инверсии и муару, но косвенно влияет на зрение.

Шревты. Ещё Татьяныч об этом говорил. Юзаем нормальные ttf-шрифты и будет счастье. Желательно использовать полный хинтинг, чтобы глифы выглядели отчётливо, без гламура и красоты. Береги глаза, гентушник.

И ещё — юзаем человеческие темы, которые обеспечивают хорошую контрастность между текстом и фоном. Помнишь тот обоссаный фон в старых форточках? Он всяко оптимальнее белого фона. Стандартная тема в Gnome 3 — сущий ад, ибо в ней меняется контрастность окон в зависимости от фокуса. Только индусы без глаз могли такое придумать. Ну и белые литеры со слабым хинтингом на чёрном фоне всяко способствуют улучшению зоркости.

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

По теме:
http://techmind.org/lcd/dotinv.html
http://techmind.org/lcd/dotinvrgb.html
http://techmind.org/lcd/dotinv2l.html
http://techmind.org/lcd/dotinv2lb.html
http://techmind.org/lcd/dotinvrgb2l.html
http://techmind.org/lcd/dotinvrgb2lb.html

Если у тебя хотя бы на одном видно мерцание — выкинь монитор в окно. Береги глаза — они всяко дороже твоего говномонитора.

P.S. У меня мерцает на 3 и 5. При этом, если изменить контрастность с 50 на 49 и обратно, то мерцание исчезает. Исчезает до первого изменения фона на экране. Диагноз — брак в микроконтроллере монитора (или в его ПО, что не суть, ибо дома не решается). Печально, что при покупке монитора об этом обо всём не знал. Сейчас же глаза на лоб лезут. Монитор — Philips IPS 237E. Не покупайте этот и похожий на него шлак.

P.P.S. Приношу извинения линупсоидам, которых обвинял в кривых шрифтах. Действительно, ранее полагал, что глаза болят из-за кривых шрифтов в линукс. Хотел лично подвергнуть карам Столлмана, честное слово. На самом деле, пусть и не все, но часть шрифтов вполне годная. Те же liberation, droid.

sailter
()

garbage collection для Gentoo или как найти накапливающийся в системе мусор.

Форум — General

Ни для кого не секрет, что в нашем любимом онтопике имеет место быть (естественно не в таких огромных количествах, как в альтернативных ОС) накапливание мусора - конфиги там в /etc, если пакетный менеджер не удаляет, пустые директории в /var, ну и тому подобный хлам. Так как findcruft умер, а других тулз не нагуглил, решил повелосипедить. Нужна помощь с добавлением исключений.

#!/bin/bash

mkdir '/tmp/garbage/'
echo "finding packages..."
EIX_LIMIT=0 eix -#I > /tmp/garbage/packages
echo "finding files in packages..."
cat /tmp/garbage/packages | while read line; do equery f $line | grep "^/" >> /tmp/garbage/package_files; echo "searching $line"; done
cat /tmp/garbage/package_files | grep -v "/usr/src" | sort > /tmp/garbage/package_files_sort
echo "finding files in system..."
find /bin/ -type f >> /tmp/garbage/system_files
find /boot/ -type f >> /tmp/garbage/system_files
find /etc/ -type f >> /tmp/garbage/system_files
find /lib32/ -type f >> /tmp/garbage/system_files
find /lib64/ -type f >> /tmp/garbage/system_files
find /opt/ -type f >> /tmp/garbage/system_files
find /sbin/ -type f >> /tmp/garbage/system_files
find /usr/ -type f >> /tmp/garbage/system_files
find /var/ -type f >> /tmp/garbage/system_files
echo "Sorting files..."
cat /tmp/garbage/system_files | grep -v "/usr/portage" | grep -v "/usr/src" | grep -v "/var/db/pkg" | grep -v "/lib/modules" | sort > /tmp/garbage/system_files_sort
echo "Writing log file and finishing..."
diff /tmp/garbage/system_files_sort /tmp/garbage/package_files_sort > /var/log/garbage.log
rm -rf '/tmp/garbage'

Замечания по скрипту:

  • Еще не дописал удаление дубликатов, если имеются
  • делая
    equery f $line | grep "^/"
    не отображаются директории, соответственно нужно дописать поиск пустых директорий
  • не все исключения добавлены
  • нужно разобраться, как быть с x86 архитектурой например
  • игнорятся файлы в /usr/src
  • дописать парсер diff`а, чтобы по человечески и красиво.

UPD Новая версия

UPD2 Обновленная версия. Устранена практически мешанина /lib и /lib64 на x86_64

UPD3 v 0.0.1

 ,

leg0las
()

Очень сильно греется ноутбук

Форум — Linux-hardware

Очень сильно греется ноутбук, даже при отсутствии нагрузки. Графика intel hd4000. Ноутбук asus ux31a-db71.

помогите пожалуйста.

 , ,

Dm3Ch
()

Может ли компилятор Хаскеля сам генерировать instance Arbitrary для алгебраического типа?

Форум — Development

Пишу тесты с помощью QuickCheck, нужно определить instance Arbitrary для алгебраического типа, который содержит множество конструкторов, принимающих 0, 1 или 2 аргумента, для типов которых Arbitrary определен.

Соответственно, хочется не писать кучу строчек вида genConsX = ConsX <$> arbitrary, а затем arbitrary = oneOf [ genCons1, ..., genConsN], а поручить это дело компилятору.

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

И, кстати, данная процедура как-нибудь называется во всяких там теориях?

 , , quickcheck

moroz
()

[аудиофилов тред] [выбор наушников] Проясните несколько моментов

Форум — Talks

Сразу скажу, что тратить на наушники больше долларов 50-60 меня давит жаба, да и аудиофилией я, слава Патрику, не страдаю. Тем не менее охота взять что-то более-менее нормальное.

Теперь вопросы.

Что лучше: когда импеданс больше или меньше? В одной ценовой категории вижу наушники с импедансом 20-30 Ом и 100 Ом.

Часто в обзорах и отзывах читаю, мол, такая-то звуковая карта не осиливает «прокачать» эти наушники. Что есть «прокачать» в аудиофилии? На что обращать внимание при выборе, чтоб моя ноутовская intel hda купленные наушники таки «прокачала»? Что будет, если не «прокачает»? Звук превратится совсем в тыкву?

Пока выбираю между Koss Pro DJ100, KOSS UR55, Sennheiser HD 201. Что еще посоветуете?

Если что, наушники для дома.

Deleted
()

Полезные плюшки

Форум — General

Периодически на хабре проскакивают статьи про различные плюшки для bash. Иногда попадаются очень полезные, иногда просто приятные. Только что открыл для себя, что bash можно научить регистронезависимому автокомплиту:

echo 'set completion-ignore-case on' >> ~/.inputrc
К примеру, теперь cd ~/down без проблем превращается в cd ~/Download. Подумал, что было бы неплохо устроить тред полезных плюшек для bash.

 

Insomnium
()