Бабушка, смотри, я сделал двач! Войти !bnw Сегодня Клубы
Привет, TbI — HRWKA! 1239.1 пользователей не могут ошибаться!
?6942
прекрасное6443
говно5905
говнорашка5512
хуита4713
anime3066
linux2652
music2634
bnw2602
рашка2565
log2354
ололо2171
дунч1824
pic1815
сталирасты1491
украина1439
быдло1437
bnw_ppl1419
дыбр1238
гімно1158

fs:/ipfs/bafymbzaciawqwzebiox4cdhxl2dbsuwkbq3nguyc4nqoncrixtrqsjx44at3phc3cfzfmu7anysei2ubauk5qe2tdagu4n3hvutq6pueiglp2o3k <- DeepNude + патч на убирание вотермарки, сохранил на всякий случай
#JCUTV0 (2) / @voker57 / 1975 дней назад
Боремся с говнохостингами вместе: % ~/rehost --chat ~/rehost fs:/ipfs/bafk4bzacib45uzbwzccvmgbquo5qaayyvti6bdz7zzxcmucknsdvvsi4cubkobt36v5t3llxmf6piwj4sylwvpox45szwkj4vu4qikavowm3jdkb сохранил на всякий случай
#40ZJZQ (55) / @voker57 / 1996 дней назад
ребейзнул свой патч (остался один!) на последнюю ипфс, жрет вроде столько же но работать должно лучше https://github.com/Voker57/go-ipfs
#ZND22A (4) / @voker57 / 1996 дней назад
Как и рекомендовали ведущие идеологи разработки софта, из 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 / 2000 дней назад
выложил код вики с bitcheese.net: https://github.com/Voker57/bitcheese
#QL6WQH (2) / @voker57 / 2715 дней назад
Братишки, я вам сорц поменеджить принес: 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 / 2733 дня назад
> filter (/= ".") . groupBy (\a b -> &#39;.&#39; /= a && &#39;.&#39; /= b) Трава не наркотик.
#2YC9FR (7) / @ndtimofeev / 3056 дней назад
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 / 3168 дней назад
Задумался что в контексте monad remote имеет смысл специальный класс OnException с одноименным методом таким что для любых двух buffered команд справедливо: (cmd1 `onException` hnd1) <*> (cmd2 `onException` hnd2) == (cmd1 <*> cmd2) `onException` (hnd1 >> hnd2) Правда форкать exceptions так не хочется. Также никак не пойму кто кому суперкласс: OnException для MonadCatch или наоборот.
#XLPWTF (0) / @ndtimofeev / 3231 день назад

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

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

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

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

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

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

#AMPGD9 (0) / @ninesigns / 3809 дней назад

Увидел следующую замену 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 / 3939 дней назад

Расписание горнолыжных соревнований 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 / 3941 день назад

Костыль для емакса чтобы в конец буфера вставлялся первый встретившийся выше номер поста или комента (вида #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 / 3968 дней назад

Драйвер редиса возвращает 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 / 4034 дня назад

Суровый выхлоп работы ракетовского макростеппера:
(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 / 4091 день назад

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

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

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