Отдал бы и ползарплаты! Войти !bnw Сегодня Клубы
Привет, TbI — HRWKA! 1239.0 пользователей не могут ошибаться!
?6946
прекрасное6443
говно5907
говнорашка5512
хуита4716
anime3066
linux2654
music2635
bnw2602
рашка2565
log2356
ололо2178
дунч1832
pic1815
сталирасты1491
украина1439
быдло1437
bnw_ppl1421
дыбр1238
гімно1158

fs:/ipfs/bafymbzaciawqwzebiox4cdhxl2dbsuwkbq3nguyc4nqoncrixtrqsjx44at3phc3cfzfmu7anysei2ubauk5qe2tdagu4n3hvutq6pueiglp2o3k <- DeepNude + патч на убирание вотермарки, сохранил на всякий случай
#JCUTV0 (2) / @voker57 / 2000 дней назад
Боремся с говнохостингами вместе: % ~/rehost --chat ~/rehost fs:/ipfs/bafk4bzacib45uzbwzccvmgbquo5qaayyvti6bdz7zzxcmucknsdvvsi4cubkobt36v5t3llxmf6piwj4sylwvpox45szwkj4vu4qikavowm3jdkb сохранил на всякий случай
#40ZJZQ (55) / @voker57 / 2021 день назад
ребейзнул свой патч (остался один!) на последнюю ипфс, жрет вроде столько же но работать должно лучше https://github.com/Voker57/go-ipfs
#ZND22A (4) / @voker57 / 2021 день назад
Как и рекомендовали ведущие идеологи разработки софта, из ipfs решили выкинуть собственный пакетный менеджер gx, который находил пакеты в собственно ipfs. gx их не устраивал тем, что в не хватало каких-то тулз, и запостив краткий ишшью https://github.com/ipfs/go-ipfs/issues/6108, в котором просуммировали базар в курилке после совещания, на котором whyrusleeping уговаривали допилить gx а он отнекивался ибо нашел новую игрушку, gx удалили а go mod впилили. Вместо gx теперь в коде есть файлик в котором указываются нужные версии модулей, и еще один, в который записываются адреса гита и какие-то чексуммы. При запуске билда эти гиты начинают качаться, по дороге выясняется, что этих ревизий и тегов в гитах уже нет, а в других гитах ГНУ/ТЛС ЕГГОГ -27. После такой оказии весь скрипт начинается заново качать все ревизии, кеша там нет. Теперь остается только последовать совету следующих идеологов и рекомендовать ставить ipfs через докер, имедж собранный под строгим контролем в Protocol Labs.
#V2Q0K2 (49+1) / @voker57 / 2025 дней назад
выложил код вики с bitcheese.net: https://github.com/Voker57/bitcheese
#QL6WQH (2) / @voker57 / 2740 дней назад
Братишки, я вам сорц поменеджить принес: https://www.fossil-scm.org/ Юзать я это не пробовал, но давайте разберем по частям ими написанное: > Integrated Bug Tracking, Wiki, and Technotes - In addition to doing distributed version control like Git and Mercurial, Fossil also supports bug tracking, wiki, and technotes. Отличное начало, я знаю инит-систему которая начиналась так же! > Fossil is a single self-contained stand-alone executable Заебись, у меня как раз иноды кончаются и пакетного менеджера нет. Ща заживем. > TH1 scripting language Недоязычок в комплекте, ахаха, наканецта > https://www.fossil-scm.org/index.html/doc/trunk/www/antibot.wiki Тут автор рассказывает как он героически борется с ботами. Надо просто проверять у всех яваскрипт и всех, у кого его нет, не пускать никуда! Гениально! Клаудфлер не нужен, Wait a minute со спиннером встроен прямо в VCS. > GIT: Ad-hoc, pile-of-files key/value database FOSSIL: Relational SQL database Действительно, нахуй все эти кучи файлов которые может любой распарсить и починить. Надо все сложить в базу данных, у которой по определению одна реализация. // написанная тем же автором, по совпадению > Git strives to record what the development of a project should have looked like had there been no mistakes. > Fossil, in contrast, puts more emphasis on recording exactly what happened, including all of the messy errors, dead-ends, experimental branches, and so forth. Вот это топ удобно. Всегда мечтал иметь в проекте кучу несвежей истории, ошибочных коммитов. Сядешь, бывало, у подогретого i7, и вспоминаешь как ты обосрался в позапрошлом году. И скачивать это все при клоне тоже удобно. but wait, у автора есть для этого решения! > https://www.fossil-scm.org/index.html/doc/trunk/www/shunning.wiki Итак, мы можем пометить некий объект в репе как shunned и скачиваться он не будет, только храниться там уже где есть. Изящное решение. Только проверить все, что из него вытекает, криптографически мы никак не сможем, но это похуй. Сервер свой человек, ему можно доверять))) > Autosync mode vs Manual-merge workflow Можно выбрать одно, или централизованная работа где все поддерживают анальную связь с сервером, или распределенность. Т.е. или ты молишься на один сервер и при его падении всё идет по пизде, или хранишь у себя полную копию со всеми зафейленными бранчами, если из нее админ не зашаннил лишнее.
#U0234R (7+1) / @voker57 / 2758 дней назад
> filter (/= ".") . groupBy (\a b -> &#39;.&#39; /= a && &#39;.&#39; /= b) Трава не наркотик.
#2YC9FR (7) / @ndtimofeev / 3081 день назад
public FileCollection minus(final Iterable<FileCollection> collections) { DeprecationLogger.nagUserWith("The minus(Iterable<FileCollection>) method and using the '-' operator in conjunction with an Iterable<FileCollection> object have been deprecated and are scheduled to be removed in " + GradleVersion.current().getNextMajor().getVersion() + ". Please use the minus(FileCollection) method or the '-' operator with a FileCollection object instead."); return this.minus(new UnionFileCollection(collections)); } from: https://github.com/gradle/gradle/blob/db9d00d7a463fa8bbffa453cf04d6105a1dca77d/subprojects/core/src/main/groovy/org/gradle/api/internal/file/AbstractFileCollection.java кекнул с nagUserWith
#0RZRPB (0) / @hdghg / 3193 дня назад
Задумался что в контексте monad remote имеет смысл специальный класс OnException с одноименным методом таким что для любых двух buffered команд справедливо: (cmd1 `onException` hnd1) <*> (cmd2 `onException` hnd2) == (cmd1 <*> cmd2) `onException` (hnd1 >> hnd2) Правда форкать exceptions так не хочется. Также никак не пойму кто кому суперкласс: OnException для MonadCatch или наоборот.
#XLPWTF (0) / @ndtimofeev / 3256 дней назад

https://github.com/4DA/eshell-toggle

Набыдлил простую фичу: по шоткату (например s-`) показывается консолька eshell под активным окном с каталогом текущего буфера.
По этому же шоткату убирается.

#RIAJSG (0) / @ninesigns / 3388 дней назад
Интересно, в http://code.google.com/codejam/ кто участвует? Палите ники.
#RSDXHU (1) / @ygrek / 3539 дней назад
https://github.com/SFTtech/openage/blob/master/doc/code_style/mom.h программисты шутят про мамаш
#9LOQVM (0+1) / @dulo_t-34 / 3557 дней назад

Костыли чтобы заюзать org-capture для того чтобы добавить запись в файлик ledger.
Плюс комлишен Accounts из задаваемого списка.

https://github.com/4DA/emacs-stuff/blob/master/ledger-completed-capture.el

Работает примерно так

#AMPGD9 (0) / @ninesigns / 3834 дня назад

Увидел следующую замену systemd:

#define _XOPEN_SOURCE 700
#include <signal.h>
#include <unistd.h>

int main()
{
    sigset_t set;
    int status;

    if (getpid() != 1) return 1;

    sigfillset(&set);
    sigprocmask(SIG_BLOCK, &set, 0);

    if (fork()) for (;;) wait(&status);

    sigprocmask(SIG_UNBLOCK, &set, 0);

    setsid();
    setpgid(0, 0);
    return execve("/etc/rc", (char *[]){ "rc", 0 }, (char *[]){ 0 });
}

Какие подводные камни?

#8NZN4P (7+1) / @ninesigns / 3964 дня назад

Расписание горнолыжных соревнований TZ: MSK+4
| Day | Date | Begin | End | Discipline |
| День 3 | Воскресенье, 9 февраля | 11:00 | 13:10 | Скоростной спуск, мужчины |
| День 4 | Понедельник, 10 февраля | 11:00/15:00 | 12:30/16:10 | Суперкомбинация, женщины |
| День 6 | Среда, 12 февраля | 11:00 | 13:10 | Скоростной спуск, женщины |
| День 8 | Пятница, 14 февраля | 11:00/15:30 | 12:30/16:40 | Суперкомбинация, мужчины |
| День 9 | Суббота, 15 февраля | 11:00 | 13:10 | Супергигант, женщины |
| День 10 | Воскресенье, 16 февраля | 11:00 | 13:10 | Супергигант, мужчины |
| День 11 | Вторник, 18 февраля | 11:00/14:30 | 13:00/16:10 | Гигантский слалом, женщины |
| День 12 | Среда, 19 февраля | 11:00/14:30 | 13:00/16:10 | Гигантский слалом, мужчины |
| День 15 | Пятница, 21 февраля | 16:45/20:15 | 18:00/21:25 | Слалом, женщины |
| День 16 | Суббота, 22 февраля | 16:45/21:50 | 18:15/20:15 | Слалом, мужчины |

#U2DX0Y (0) / @ninesigns / 3966 дней назад

Костыль для емакса чтобы в конец буфера вставлялся первый встретившийся выше номер поста или комента (вида #foo/bar).

(defun do-reply-to-post-comment ()
(if (re-search-backward
"^#[0-9a-zA-Z]+\(/[0-9a-zA-Z]+\)?" nil t 1)
(progn
(end-of-buffer)
(insert-buffer-substring-no-properties (current-buffer)
(match-beginning 0) (match-end 0))
(insert " "))
(message "No comments found")))

(defun reply-to-post-comment()
(interactive)
(save-excursion
(do-reply-to-post-comment))
(end-of-buffer))

(global-set-key (kbd "C-c r") 'reply-to-post-comment)

#URWGTT (24) / @ninesigns / 3993 дня назад

Драйвер редиса возвращает Redis (Either Reply a). При операции HGET возвращает, соответственно, Redis (Either Reply (Maybe ByteString)), типа значения по ключу может и не быть. Программист для упрощения пишет сначала специальную функцию redis', которая заворачивает ответ редиса в EitherT-based монаду, чтоб соединять подобные вычисления и возвращать первую неудачу:

newtype Redis' a = Redis' (EitherT Redis.Reply Redis.Redis a) deriving (MonadIO)
instance Monad Redis' where
    return = Redis' . EitherT . return . Right
    (Redis' m) >>= f = Redis' $ m >>= \rv -> unwrapRedis' $ f rv
redis' = Redis' . EitherT

Таким образом, теперь, если вы получаете ответ Redis (Either Reply a), вы его преобразуете в

Redis' (EitherT Reply Redis a)

и можете соединять подобные вычисления в do-блоке типа:

do
    res <- redis' $ Redis.hget foo bar
    res2 <- redis' $ Redis.hget baz zab

и вычисление остановится на первом возврате ошибки.

Далее. Программисту необходимо по кучке значений сделать HGET и вернуть это как-то внутри кортежа, поскольку мы внутри новой монады Redis' -- завернуть результат в неё. В случае, если значения хоть по одному ключу не существует, хочется вернуть Nothing для всех. Потому создаётся новая монада:

newtype HashFields a = HashFields (MaybeT Redis' a)
    deriving (Functor, Monad)
instance Applicative HashFields where
    pure = return
    (<*>) = ap

описывающая вычисления типа Redis', которые могут вернуть неудачу. Пишется новая функция

hashField = HashFields . MaybeT . redis'

способная завернуть результат неудачи в новую монаду, которая умеет останавливаться на первой неудаче. Также пишется специальная функция для HGET:

getField :: ByteString -- ^ Key
         -> ByteString -- ^ Hash field name
         -> HashFields String
getField key field = fmap toString $ hashField $ Redis.hget key field

Также напишем функцию, которая "запустит" наше вычисление:

getRedisFields :: forall a. HashFields a -> Redis' (Maybe a)
getRedisFields (HashFields f) = runMaybeT f

И теперь лёгким движением руки мы можем сделать что-то вроде:

getRedisFields ((,,,,,) <$>
    getField k "foo" <*>
    getField k "bar" <*>
    getField k "baz" <*>
    getField k "zab" <*>
    getField k "rab" <*>
    getField k "oof")

Вопрос: вам не кажется это "слишком"? Я пока еще не настолько просто манипулирую типами в голове, чтоб ощутить всю ситуацию, хорошо хоть в целом могу медленно прости по шагам по коду, но есть ощущение, что что-то здесь не так.

#DEENSA (6+1) / @kb / 4059 дней назад

Суровый выхлоп работы ракетовского макростеппера:
(define (g)
(forever (let ([abort abort])
(unless #t (abort)) (abort))))))

Для тех, кому интересно: первый abort имееет контекст из раскрытия макроса while', а второй - из раскрытия макросаforever', этакие костыли для обхода гигены без использвания stx-params.
сорцы: http://paste.lisp.org/display/138905
соус: barzilay.org/misc/stxparam.pdf‎

#1UQKN6 (1) / @ninesigns / 4116 дней назад

$ torify cabal update
Downloading the latest package list from hackage.haskell.org
Segmentation fault

#RE0I13 (0) / @ninesigns / 4145 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.