Посоветуйте литературу и нормальную документацию к Haskell
Сабж. Желательно на русском языке.
Сабж. Желательно на русском языке.
Всем привет.
Познаю хаскель, наткнулся на проблему.
Есть простое дерево с лесом:
data RoseTree a = RoseEmpty | RoseTree a [RoseTree a]
deriving (Show,Eq)
Пытаюсь реализовать для него интерфейс тайпкласса Foldable:
instance Foldable RoseTree where
foldr _ acc RoseEmpty = acc
foldr f acc (RoseTree x []) = f x acc
foldr f acc (RoseTree x ts) = let mapped = map (foldr f acc) ts
folded = foldr f acc mapped
in f x folded
Идея простая: чтобы свернуть список поддеревьев, применяю частично примененный (foldr f acc) к списку, получаю вместо списка поддеревьев (RoseTree a) список значений (a), потом сворачиваю список значений и применяю функцию f к значению ноды из паттерна и свернутому значению поддеревьев.
Но получаю ошибку в ghci:
error:
• Couldn't match type ‘b’ with ‘a’
‘b’ is a rigid type variable bound by
the type signature for:
foldr :: forall a b. (a -> b -> b) -> b -> RoseTree a -> b
at lecture11.hs:131:5
‘a’ is a rigid type variable bound by
the type signature for:
foldr :: forall a b. (a -> b -> b) -> b -> RoseTree a -> b
at lecture11.hs:131:5
Expected type: [a]
Actual type: [b]
• In the third argument of ‘foldr’, namely ‘mapped’
In the expression: foldr f acc mapped
In an equation for ‘folded’: folded = foldr f acc mapped
• Relevant bindings include
folded :: b (bound at lecture11.hs:134:39)
mapped :: [b] (bound at lecture11.hs:133:39)
ts :: [RoseTree a] (bound at lecture11.hs:133:29)
x :: a (bound at lecture11.hs:133:27)
acc :: b (bound at lecture11.hs:133:13)
f :: a -> b -> b (bound at lecture11.hs:133:11)
Насколько я понимаю, ругань на то, что частично примененный (foldr f acc) получает на вход список не того типа. Но не могу понять почему, ведь этот foldr есть мой рекурсивный вызов и по идее он должен выглядеть так:
map (foldr f acc) ts
или для примера
map (foldr (+) 0) [RoseTree 1 [], RoseTree 2 [], RoseTree 3 []]
т.е.
[foldr (+) 0 (RoseTree 1 []), foldr (+) 0 (RoseTree 2 []), foldr (+) 0 (RoseTree 3 [])]
и по одной из моих реализаций Foldable RoseTree, где
foldr f acc (RoseTree x []) = f x acc
, получаем [1, 2, 3], что подтверждается пошаговым биндингом этого кода в ghci, но вот целиком ghci мой Foldable не проглатывает.
В чем проблема, парни?
Как вы знаете, в РФ есть довольно странное законодательство на счет персональных данных, в котором зарубежные рекрутеры не хотят разбираться. Со стороны это выглядит так, как будто вы пошли на сайт например Red Hat или IBM, а нажать кнопку «apply» вам не дали, вывесив текст о том, что законодательство вашей cтраны не позволяет обрабатывать персданные за границей.
ВАЖНО: эту заглушку не ставит работодатель, ее ставит рекрутер потому что так ему посоветовал МакКинзи или Прайс, которые так посоветовали потому что увидели некоторый риск для рекрутера. Никаких других прчин для этого нет, если вы зайдете на ту же страницу с IP любой европейской страны или США, то ваше резюме будет принято, рассмотрено, вам будут звонить на ваш российский номер телефона.
Важно понимать, что перетащить вас из страны в страну стоит некоторого количества сил и денег. Самостоятельно этого добиться трудно, для этого есть специальные агенства, у которых есть отработанные процедуры. Из этого есть 2 важных прямых следствия и одно косвеное: искать работу стоит в больших корпорациях/стартапах с деньгами, которым не горит вас нанять и для которых затраты на перевозку не критичны. Просто составьте таблицу больших фирм, чья продукция вам нравится, сходите на их раздел «Карьера» и попроситесь на все-все вакансии, которые вам подходят. Второе следствие: естественно все эти затраты кратно вернутся работодателю за первые ваши 2 года работы, так как бизнес - деятельность по извлечению прибыли и единственная причина вас нанять и тащить через пол мира - маржинальность вашей деятельности (местный попросит больше денег и не будет так держаться за место как вы за визу). Это нормально, считайте их затраты на ваше беспроблемное перемещение своей косвенной прибылью. Самостоятельно вы все равно потратите больше, можете потерпеть неудачу не зная точно важных формальностей. Косвенное следствие: с идущими работать в большую корпорацию посольство обращается значительно мягче, чем с идущими работать в новую или мутную фирму.
Прежде чем посылать CV в большую фирму, сходите на Linkedin/Facebook, пройдитесь там по знакомым и укажите их как референсы в резюме. Вы не поверите, сколько пользователей ЛОР, например, в Бренском Red Hat или IBM и с каким удовольствием они оставят о вас отзыв своему HR. Cпойлер: это возможные премии во многих конторах, так что не стесняйтесь спрашивать и просить рекомендации.
UPDATE из 2019. Теперь по крайней мере Red Hat заставляет формально аппаиться через российское представительство посте того, как зааплаился через VPN.
Перемещено Falcon-peregrinus из job
Перемещено Klymedy из talks
В 14-м году на курсере был классный курс, который я упустил. А сейчас понял что очень хочется его пройти. После гуглежа оказалось, что курс доступен бесплатно без смс прямо на сайте стенфорда.
Вот, выкладываю ссылку (может будет полезно кому-нибудь) https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/
Если есть ещё слоупоки кроме меня, то давайте вместе проходить!
К линуксу это имеет немного косвенное отношение, но здешним линуксоидам будет интересно. Авось информация начнёт копиться в одном месте. Немного самонадеянно с моей стороны, но прошу обратить внимание, что это не talks|general, и тред не про вопросы нужности.
Ну, из спортивного интереса и зачатков паранойи я попытался.
Сначала проверим, активен ли Boot Guard. Сделать это можно из под линукса, метод с патченной intelmetool из coreboot. У меня не сработало (error access чего-то там, запускал ессно от рута), но вы по ссылке сходите, там информация о косвенных признаках присутствия Boot Guard, который, суде по ссылке на сатью на хабр выше, может нам испортить всю малину.
В (CS)ME System Tools с форума все утилиты есть для доса и .efi, а FWUpdate и для линукса. Но FIT есть только под винду. Можно ли без неё - хз. Но все туториалы, которые я находил, все опирались на неё. Поэтому далее манипуляции проводил из под винды.
Запустил скачанную с форума под своё железо MEinfo. Она бодро рапортует. Что-то. Если что-то такое, то конкретно вам повезло.
В таком случае, если вы с помощью утилиты flash programming tool (FPT) дампните себе всё (fpt.exe -d image.bin), то всё скорее всего пройдёт без ошибок. Полученный образ будет содержать таблицу-дескриптор, дамп биоса, дамп МЕ, ещё чего-нибудь. Посмотреть на эту таблицу, кстати, можно натравив coreboot'овский ifdtool либо на образ, либо на результат выполнения команды fpt.exe -D desc.bin -DESC (на случай, если МЕ не дампается).
Этот обрах можно редактировать в flash imaging tool (FIT). Всё настраиваете (убрать бут гард, отключить МЕ, поставить HAP-бит, например). Ещё можно взять ME регион, который появляется в папке disassembly в папке с экзешником FIT, и натравить на него me_cleaner (инструкцию как всё правильно сделать находил в интернете). По отчётам, с HAP битом эта процедура не ломает загрузку.
Собственно собранный FIT'ом образ, вроде бы и нужно шить, но я боюсь, что я пропускаю тут какие-то важные нюансы, я так далеко не заходил. Так как мы всё-таки не софт ставим, а аж шьём биос, то я бы разорился на программатор с клипсой и таки снял бы дампы с чипов. Так надёжнее, ибо потенциально можно раскирпичить девайс, плюс много попыток. Правда возможно, там тоже есть свои подводные камни, нужно гуглить.
Если же на этапе проверки бут гарда не повезло, и картинка какая-то такая, то не повезло, и фиг что с ME сделаешь. Наверно. У меня картинка на ноутбуке была как раз такая.
Я не очень шарю во всём этом, могу где-то тупить. Хочу попробовать поменять что-нибудь с помощью setup_var, но никак не могу понять, какие адреса переменных использовать. IFRextract'овский файл содержит VarStoreInfo и VarStore, и я хз, какой адрес использовать. Не знаю, насколько это осмысленно, поэтому прошу не пинать.
Например, тут:
One Of: Me FW Image Re-Flash, VarStoreInfo (VarOffset/VarName): 0x2, VarStore: 0x4, QuestionId: 0x86E
Для примера дамп «скрытого меню» (я хз как в него попасть, был бы рад советам): Section_PE32_image_E6A7A1CE_5881_4B49_80BE_69C91811685C_Setup_body IFR.txt
UEFI Protocol Detected
--------------------------------------------------------------------------------
String Packages
--------------------------------------------------------------------------------
Offset: Language:
--------------------------------------------------------------------------------
0x354 en-US (0x0)
Form Sets
--------------------------------------------------------------------------------
Offset: Title:
--------------------------------------------------------------------------------
0x44E74 Platform Information Menu (0x12CB from string package 0x0)
0x45504 Intel Advanced Menu (0x12DD from string package 0x0)
0x5DB4A Ref: Firmware Update Configuration, VarStoreInfo (VarOffset/VarName): 0xFFFF, VarStore: 0x0, QuestionId: 0x864, FormId: 0x1043 {0F 0F 89 03 8A 03 64 08 00 00 FF FF 00 43 10}
0x5DB59 Gray Out If {19 82}
0x5DB5B QuestionId: 0xA17 equals value 0x1 {12 86 17 0A 01 00}
0x5DB61 QuestionId: 0xA15 equals value 0x1 {12 06 15 0A 01 00}
0x5DB67 Or {16 02}
0x5DB69 End {29 02}
0x5DB6B One Of: ME State, VarStoreInfo (VarOffset/VarName): 0x2, VarStore: 0x1108, QuestionId: 0x865, Size: 1, Min: 0x0, Max 0x1, Step: 0x0 {05 91 91 03 92 03 65 08 08 11 02 00 10 10 00 01 00}
0x5DB7C One Of Option: Disabled, Value (8 bit): 0x0 {09 07 04 00 00 00 00}
0x5DB83 One Of Option: Enabled, Value (8 bit): 0x1 (default) {09 07 03 00 30 00 01}
0x5DB8A End One Of {29 02}
0x5DB8C End If {29 02}
0x5DD5A Form: Firmware Update Configuration, FormId: 0x1043 {01 86 43 10 89 03}
0x5DD60 One Of: Me FW Image Re-Flash, VarStoreInfo (VarOffset/VarName): 0x2, VarStore: 0x4, QuestionId: 0x86E, Size: 1, Min: 0x0, Max 0x1, Step: 0x0 {05 91 8B 03 8C 03 6E 08 04 00 02 00 10 10 00 01 00}
0x5DD71 One Of Option: Disabled, Value (8 bit): 0x0 (default) {09 07 04 00 30 00 00}
0x5DD78 One Of Option: Enabled, Value (8 bit): 0x1 {09 07 03 00 00 00 01}
0x5DD7F End One Of {29 02}
0x5DD81 Suppress If {0A 82}
0x5DD83 QuestionId: 0xA11 equals value 0x3 {12 86 11 0A 03 00}
0x5DD89 Not {17 02}
0x5DD8B End {29 02}
0x5DD8D One Of: Local FW Update, VarStoreInfo (VarOffset/VarName): 0x1, VarStore: 0x1108, QuestionId: 0x86F, Size: 1, Min: 0x0, Max 0x1, Step: 0x0 {05 91 8D 03 8E 03 6F 08 08 11 01 00 10 10 00 01 00}
0x5DD9E One Of Option: Disabled, Value (8 bit): 0x0 {09 07 04 00 00 00 00}
0x5DDA5 One Of Option: Enabled, Value (8 bit): 0x1 (default) {09 07 03 00 30 00 01}
0x5DDAC End One Of {29 02}
0x5DDAE End If {29 02}
0x5DDB0 End Form {29 02}
Может, это вообще не то, я целый вечер тыкаюсь почти вслепую.
Для определённости. Использовал биос от ThinkPad P50 (1.46).
Здравствуйте!
Внезапно осознал, что очень хотел бы делиться своим опытом в программировании.
Могу давать всякие интересные задачи и проверять их решение, могу заниматься моим любимым делом - усложнять задачи данные в университете для курсовой и диплома так чтобы это было похоже на вызов, могу советовать технологии для изучения..
Разумеется всё на Linux, если в университете требуется работа программы под Windows, помогу освоить кроссплатформенную разработку.
Всё совершенно безвозмездно, т.е. даром. Кому интересно прошу стучаться в почту: undefer _na_ gmail.com
Нужно на Python 3 нарисовать данные по типу таких, для начала без прозрачностей: https://www.tecplot.com/wp-content/gallery/3d-plots/tecplot_3d_cfd_fluid_blow...
Есть ли такие библиотеки. Вот представленная на этой картинке - проприетарная штука, управляется через Python. А на халяву есть?
Здравствуйте! Сегодня мы узнаем, как отключить PulseAudio в Linux! Но «для чего?» не узнаем - вы должны знать ответ сами!
Как это сделать?
mkdir ~/.config/pulse
echo "autospawn = no" >> ~/.config/pulse/client.conf
killall pulseaudio
Вообще, тут должен был быть скучный список «если такой-то дистр меньше N-й версии, то ~/.pulse
, а если больше, то ~/.config/pulse
». Или хитрый скрипт, который проверяет «if ~/.pulse exist, then echo tuda, else echo v ~/.config/pulse». Но сделаем просто:
mkdir ~/.config/pulse
mkdir ~/.pulse
echo "autospawn = no" >> ~/.config/pulse/client.conf
echo "autospawn = no" >> ~/.pulse/client.conf
killall pulseaudio
Вот! Чтобы наверняка.
Почему не работает просто killall pulseaudio?
Потому что Поттеринг. И ведь это - одна из первых его поделок, и поэтому в ней работает отключение хотя бы через не очевидный способ! В последующих нет даже неочевидного способа.
Почему не удалить пульсу?
Многие программы слинкованы с /usr/lib/libpulse.so.0 Upd: Оказывается libpulse и системная служба PulseAudio - в разных пакетах! Значит, удалять всё-таки можно.
То есть, отключаем пульсу - и всё, звук идёт через ALSA?
Да. Попробуйте сами.
Хотя не совсем. В некоторых дистрибутивах Linux не исчезает ALSA-устройство «pulse» - звук, соответственно, идёт в /dev/null. У меня в Debian и Ubuntu ALSA-устройство «pulse» пропадает при отключении пульсы. А в openSUSE пришлось также удалить/переименовать/закомментировать конфигурационный файл /etc/asound-pulse.conf.
Это устройство - довольно хитрый «костыль»: те программы, которые поддерживают PulseAudio, выводят звук напрямую в него. А те, которые поддерживают только ALSA, выводят звук в ALSA-устройство default, ведущее в «pulse», которое ведёт в PulseAudio. А потом снова в ALSA, и далее в дом, который построил Джек
Какие проблемы могут быть?
У меня в KDE такого не было, но было в MATE. В MATE можно установить программку Volti. В репозиториях она собрана с GTK2, а в GIT доступна начальная поддержка GTK3
У меня такого не было, но другие люди жаловались. Если у вас не работает, включите в настройках Volti. Работает либо через HAL, которого в современном линуксе уже нет (но есть в CentOS 6), либо через Xlib (который в современном линуксе ещё есть). Также советую выставить в настройках Volti недефолтный микшер (например этот), потому что дефолтный неудобен.
Запускайте через apulse (уже в репозиториях!)
У меня в KDE такого не было, но было в MATE. Проверить можно этой игрой. Решается так:
echo "drivers = alsa" > ~/.alsoftrc
Или:
export SDL_AUDIODRIVER=alsa
./run_game.sh
А тут вот что произошло. BlueZ 4 поддерживал ALSA, а BlueZ 5 - перестал. Разработчики сказали «а мы не обязаны! Вот посмотрите: разработчики PulseAudio написали плагин сами. Почему плагин для ALSA должны писать мы?», и удалили поддержку ALSA.
Bluez-alsa пока доступен не во всех репозиториях, поэтому даю ссылку на исходники. Инструкция по настройке.Какой язык самый лучший для работы с массивами? Лучший - не с самой производительной реализацией, а в котором лаконичней всего описываются различные операции с массивам: трансформации, итераторы, разнообразные произведения между массивами.
Всем добра!
Хочу, наконец, поменять убогий дешванский SOHO TP-Link на крутой конструктор более универсальное решение.
В общем, хочу себе маленький бесшумный PC с очень низким энергопотреблением под эту задачу.
Я не сильно разбираюсь в сетевом оборудовании, но подозреваю, что нужны особые сетевые карты, которые не будут сильно грузить процессор обработкой пакетов.
Задачи: wi-fi ac на 5 устройств (максимально быстрая синхронизация файлов по воздуху), интернет 100 мегабит от провайдера, всякие owncloud и другие развлечения для красноглазых.
Изначально хотел себе собрать очень маленький Desktop и поручить ему работу роутера, но решил, что хочу сперва более специфичное устройство без вентилятора.
Поделитесь, пожалуйста, историями успехов или просто ссылками на материнский платы, сетевые карты, антенны.
TMSU - это инструмент для пометки файлов. Программа предоставляет простой инструмент командной строки для тегирования/нанесения меток, который использует виртуальную файловую систему. Так что вы можете просматривать/искать свои файлы без каких либо дополнительных программ.
TMSU не изменяет файлы, они остаются неизменными на диске или в сети, где бы вы их не держали. TMSU имеет собственную базу данных.
Особенности:
Пример использования программы:
$ tmsu tag mysong.mp3 music audio year=2010
$ tmsu files music
./mysong.mp3
$ mkdir mountpoint
$ tmsu mount mountpoint
$ ls mountpoint/tags/music
mysong.1.mp3
>>> Подробности
Всем привет, как-то уже давненько я пытался решить одну проблему, но так и не смог. Проблема в назначении тегов файлам на ПК, допустим, я хочу присвоить файлу теги amateur, teen, black qt и qml (если это мануал) и потом найти его поиском по тегам из пачки аналогичных мануалов по другим темам. Как мне это сделать? Желательно под KDE и чтобы было в репах моей божественной Федоры.
Какая-то встроенная система комментариев в кедах есть, но она не выдаёт ни подсказок, ни списка всех тегов, поиск по ним тоже не работает.
Гугл выдавал какие-то невнятные полудоделанные программки.
Здравствуйте. Кто из вас настраивал квм для игр? поделитесь полными мануалами.
Спасибо.