LINUX.ORG.RU

Сообщения wandrien

 

Ищется программист для доработки open-source проекта

Приветствую!

Как многие из местных в курсе, у меня есть частичный форк LXDE, который я так и не довел до состояния логической завершенности.

Проект ориентирован на старые компьютеры. Код написан на Си с использованием gtk2. Миграция на другие версии тулкита не рассматривается.

У меня нет большого бюджета на проект, поэтому ищется не столько сотрудник на зарплату, сколько волонтёр, которому интересен такой проект сам по себе, и для которого оплата станет дополнительным бонусом. Это возможно, если:

  • Вы являетесь энтузиастом СПО, и у вас есть желание поучаствовать в свободном проекте в качестве хобби.
  • По какой-то причине вам интересна разработка GUI-приложений на Си, на устаревшем тулките и под почти уже устаревший X11.

Скилы, которые потребуются для работы:

  • Знание Си.
  • Знакомство со сборочной средой autotools.
  • Умение собирать софт под Linux и FreeBSD.
  • Знакомство с GLIB2, GTK2, X11.
  • Навыки вдумчивого поиска багов и анализа архитектуры.
  • Работа с git.

ИЛИ:

  • Наличие головы и желания научиться всему необходимому.

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

По оплате. Скажем, 10 долларов за один простой таск.

Пример такого таска:

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

Собственно, это наверное и будет первым таском по проекту.

По более сложным фичам — требует обсуждения. Разумеется, я не ожидаю, что вы будете работать бесплатно, например, если задача в том, чтобы отыскать и исправить гонку в многопоточном запутанном коде. Но сколько такая работа может стоить, я сам пока не очень представляю.

ТАКЖЕ

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

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

 , ,

wandrien
()

Федеративность vs P2P

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

Фундаментом нашего объединения является идея, изложенная в эссе «Protocols, Not Platforms»

И именно поэтому существует целый выводок реализаций как раз движков-платформ. Я и правда не понимаю, какое дело конечному пользователю будет до протокола, если он взаимодействует с конкретной платформой, к которой привязана его учётка. Код исполняется не на его машине и не под его контролем. Данные пользователя подконтрольны не ему, а черт знает кому. То, что там будет СПО, абсолютно параллельно. Суть СПО не святости концепции, а в том, чтобы знать, что за код работает с твоими данными. Не тот случай.

Возможно, ты используешь Mastodon неправильно

А может быть, всё проще, и это Mastodon спроектирован неправильно.

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

Mastodon нам предлагает сначала побродить поискать сервер по интересам, а потом уже там регистрироваться. А если сервер вас не устроит, то идти и регистрироваться в другом месте. Спасибо, конечно. Но мне хотелось бы обойтись без раздвоения личности при управлении своими данными и учетными записями.

Что мешало сразу сделать дизайн, в котором пользователь — это универсальный криптографический ключ, не прибитый к платформе? А кружки по интересам… просто кружки по интересам!

Внутренняя политика […] Рассмотрим какой-нибудь инстанс. У него есть внутренняя политика. Она регулирует то, что происходит в стенах этого инстанса, между его пользователями. К ней относятся правила поведения, на каждом инстансе они свои. Регистрируясь на конкретном инстансе, ты соглашаешься с его конкретными правилами.

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

И если раньше админ группы в Фейсбуке был ограничен во власти по отношению к участникам группы средствами самого Фейсбука, то теперь «админ группы» обладает полной властью вместо Фейсбука.

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

Внешняя политика […] Тут, конечно, начинаются всякие страсти. Это комплекс всего, что происходит при общении между серверами. К вам, как гражданину своего инстанса, внутренней политикой скорее всего приставлен долг не порочить честь своего сообщества на междусерверной арене. […] Глушение. […] Отклонение медиа. […] Блокировка.

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

Да, и наконец, мне скажут типа: просто подними свой сервер, и своими данными управлять будешь только ты. Во-первых, не только я. Любому серверному приложению необходим хостинг с белым IP. А во-вторых, вот только технически это решение ничем не отличается от старого доброго блога на вордпресс и ленты RSS для экспорта всем желающим. Изобретение нового мира вышло каким-то… неубедительным.


В общем, я такой человек, который во всём найдёт изъяны. С ходу могу вспомнить только три примера, когда дизайн продукта меня полностью устраивал при знакомстве. Первый был, когда я познакомился с Ruby. Второй, когда открыл для себя Docker. И третий, когда увидел обновленный JS с let, const и стрелками.

Но конкретно тут… ребята, я не знаю, может это лично я слишком аутист, но мне казалось, что в начале 3-го десятилетия XXI века технически продвинутым людям в сети уже должно поднадоесть жрать этот кактус в виде доли маленького бесправного винтика в большой сети. И ходить под начальством очередной шишки, не важно, маленькая она или большая.

Самое главное, чего не делает федиверс, он не провозглашает пользователя как объект первого класса в своей семантической модели. Всё так же объекты первого класса — это сервера, сервера, сервера.

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

Очень печально выслушивать этот бред на тему того, что одному не нравится код на JS, второму — код на Питоне, а третьему не хватает возможности поставить аватарку на форуме. Хоть бы один задумался об архитектуре и о последствиях развития той или иной технологии для человечества.

В то же время, приложение на ZeroNet при желании можно продаунгрейдить до федеративного сервера, точно так же как федеративный сервер при желании архитектурно даунгрейдится до «Фейсбука». А вот обратно — не получится. Если в исходном дизайне не выполнено соответствующее разделение абстракций, то без полной переделки дизайна им просто неоткуда будет взятся. «Лишние» степени свободы платформы при желании можно скрыть, а вот несуществующие нарисовать не получится.

ZeroNet сейчас это макет самой себя, в котором ничего еще только не работает. Но блин… дайте мне 5 кодеров на питоне за еду и финансирование, чтобы им полгода было что есть. И вы обалдели бы от результата.

Допилить ZeroNet до убойной технологии не сложнее, чем с нуля реализовать стек Gemini вместе с сервером и браузером на GTK. Реально нужно 5-6 заинтересованных лиц и немного времени.

Сейчас ситуация такова, что на всей Земле не нашлось этих пяти лиц.

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

Пойду куплю пива в связи со сдачей очередного проекта. Пошло оно всё подальше.


Спасибо commagray & CO за предоставленные для цитирования буквы.

 , ,

wandrien
()

И снова самый лучший ЯП

Я снова наступил на эти грабли.

Пример кода:

$array = [1, 2, 3];

foreach ($array as &$value) {}    // by reference
echo implode(',', $array), "\n";

foreach ($array as $value) {}     // by value (i.e., copy)
echo implode(',', $array), "\n";

Результат:

1,2,3
1,2,2

Почему? По качану. Между первой и второй нужен unset($value);.

Замечательный язык вообще. И отсутствие у переменных областей видимости уровня блока — отдельная победа на пути к говнокоду. Зато отлично учишься каждые 5 строк кода выносить в отдельную функцию.

PHP и JS, сладкий твикс страдания. JS, правда, боль-мень вылечили.

Спрашивайте ваши ответы.

 ,

wandrien
()

YouTube собрался убрать дизлайки

Сабж.

https://techcrunch.com/2021/03/30/youtube-tests-hiding-dislike-counts-on-videos/

In response to creator feedback around well-being and targeted dislike campaigns, we’re testing a few new designs that don’t show the public dislike count.

 ,

wandrien
()

LOR в ZeroNet

Напоминаю, что в ZeroNet есть филиал LOR.

Без установки приложения посмотреть форум можно через прокси:

https://zeronet.now.im/1BpFtPez7mSiShtXfb4wPfMT1dZTuRybfZ/

И написать, в принципе, тоже можно оттуда же. Только при создании учётки помните, что:

  • Приватный ключ от неё временный и хранится на самом прокси. Не создавайте постоянную учетку с «красивым» именем.
  • Ваш IP известен прокси, а кто владелец прокси, можно только догадываться.

 

wandrien
()

ZeroNet — p2p платформа хостинга сайтов и соцсеть

ZeroNet — это децентрализованная платформа для создания веб-приложений (сайтов), работающих в браузере и использующих приложение самой ZeroNet в качестве бекэнда. Можно выделить основные особенности платформы:

  • Хранение данных осуществляется в простых текстовых файлах (JSON) с кэшированием в sqlite для быстрого доступа. Кроме JSON, разумеется, возможно также использование любых текстовых или бинарных форматов, но уже без поддержки автоматического построения таблиц sqlite.
  • Все данные подписаны ключами своих авторов, таким образом подделать авторство сайта невозможно. Также невозможно модифицировать чужой сайт.
  • Сайты хранятся по принципу торрента — любыми заинтересованными участниками сети. Отключить сайт, выведя из строя какой-либо сервер, невозможно.
  • Сайт остаётся работоспособен даже если остался на единственном узле или если компьютер посетителя сайта вообще отключен от интернета.
  • Если связи нет, можно продолжать работу с сайтом в обычном режиме: писать посты в блог, комментарии на форум и т.п. При появлении связи данные будут синхронизированы автоматически.
  • Передача данных между пирами осуществляется напрямую через IP-соединения и/или через Tor на усмотрение пользователя.
  • Первичный поиск пиров для сайта выполняется на трекерах собственного типа, либо на произвольных торрент-трекерах по всему миру. После установления связи, узлы обмениваются списками пиров и известных трекеров между собой.

Теперь к сути вопроса.

Апстрим проекта в настоящее время находится в стагнации. Судьба главного разработчика, имевшего право подтверждать пулл-реквесты, туманна. То ли он просто забил на проект. То ли с ним что-то случилось.

Активной разработки не ведётся уже более полугода. Изредка кто-то подтверждает мелкие PR, а значит, у кого-то всё же есть доступ к его учетной записи. На этом основании можно строить разные коспирологические теории, но мы сейчас не об этом.

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

Текущий драфт ченджлога можно посмотреть здесь: https://github.com/zeronet-enhanced/ZeroNet/blob/massive-rework/ZNE-ChangeLog/ChangeLog-0.8.0.md

Всё, что там описано, уже реализовано. Впереди еще многое другое.

Всех заинтересованных лиц призываю присоединиться к работе.

 , ,

wandrien
()

reactions

А давайте обсудим идею добавить на ЛОР reactions, по типу как на github?

Чтобы не провоцировать срачи и хейт, предлагаю запилить только позитивные или нейтральные реакции типа таких: 👍, 😄, ❤️, 😕, но не таких: 👎.

wandrien
()

Ретрошара

Кто-нибудь пользуется? С кем обменяться ключиками?

cast @mertvoprog

 

wandrien
()

Где нынче регистрировать домен...

…под личный бложик и пет-проекты?

Давным-давно брал на 2domains.ru.

Лучше брать домен у зарубежного регистратора? У какого? Какие подводные камни могут быть с оплатой или еще чем-нибудь?

 

wandrien
()

HDD дохнет?

Подхожу к компу, а там хомяк в RO. Ну и /var за компанию тоже.

В логах такое:

мар 10 13:48:26 aquila systemd-logind[898]: Lid closed.
мар 10 13:48:32 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x1000 SErr 0x4040000 action 0xe frozen
мар 10 13:48:35 aquila kernel: ata3.00: irq_stat 0x00000040, connection status changed
мар 10 13:48:35 aquila kernel: ata3: SError: { CommWake DevExch }
мар 10 13:48:35 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:48:35 aquila kernel: ata3.00: cmd 61/18:60:30:31:11/00:00:1b:00:00/40 tag 12 ncq dma 12288 out
                                           res 50/00:00:00:00:00/00:00:00:00:00/00 Emask 0x10 (ATA bus error)
мар 10 13:48:35 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:48:35 aquila kernel: ata3: hard resetting link
мар 10 13:48:35 aquila kernel: ata3: SATA link down (SStatus 1 SControl 300)
мар 10 13:48:35 aquila kernel: ata3: hard resetting link
мар 10 13:48:35 aquila kernel: ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
мар 10 13:48:35 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:48:35 aquila kernel: ata3: EH complete
мар 10 13:48:41 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x40000 SErr 0x4040000 action 0xe frozen
мар 10 13:48:41 aquila kernel: ata3.00: irq_stat 0x00000040, connection status changed
мар 10 13:48:41 aquila kernel: ata3: SError: { CommWake DevExch }
мар 10 13:48:41 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:48:41 aquila kernel: ata3.00: cmd 61/88:90:00:ad:d2/00:00:5f:00:00/40 tag 18 ncq dma 69632 out
                                           res 50/00:00:00:00:00/00:00:00:00:00/00 Emask 0x10 (ATA bus error)
мар 10 13:48:41 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:48:41 aquila kernel: ata3: hard resetting link
мар 10 13:48:42 aquila kernel: ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
мар 10 13:48:42 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:48:42 aquila kernel: ata3: EH complete
.
.
.
.
.
.
мар 10 13:54:17 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x100000 SErr 0x450100 action 0x6 frozen
мар 10 13:54:17 aquila kernel: ata3.00: irq_stat 0x08000000, interface fatal error
мар 10 13:54:17 aquila kernel: ata3: SError: { UnrecovData PHYRdyChg CommWake Handshk }
мар 10 13:54:17 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:54:17 aquila kernel: ata3.00: cmd 61/50:a0:58:f2:56/00:00:43:00:00/40 tag 20 ncq dma 40960 out
                                           res 50/00:50:58:f2:56/00:00:43:00:00/40 Emask 0x10 (ATA bus error)
мар 10 13:54:17 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:54:17 aquila kernel: ata3: hard resetting link
мар 10 13:54:17 aquila kernel: ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
мар 10 13:54:17 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:54:17 aquila kernel: ata3: EH complete
мар 10 13:54:27 aquila kernel: ata3: limiting SATA link speed to 1.5 Gbps
мар 10 13:54:27 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x20 SErr 0x450100 action 0x6 frozen
мар 10 13:54:27 aquila kernel: ata3.00: irq_stat 0x08000000, interface fatal error
мар 10 13:54:27 aquila kernel: ata3: SError: { UnrecovData PHYRdyChg CommWake Handshk }
мар 10 13:54:27 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:54:27 aquila kernel: ata3.00: cmd 61/58:28:30:f3:56/00:00:43:00:00/40 tag 5 ncq dma 45056 out
                                           res 50/00:58:30:f3:56/00:00:43:00:00/40 Emask 0x10 (ATA bus error)
мар 10 13:54:27 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:54:27 aquila kernel: ata3: hard resetting link
мар 10 13:54:27 aquila kernel: ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
мар 10 13:54:27 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:54:27 aquila kernel: ata3: EH complete

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

SMART:

smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.10.19-1-lts] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     HGST Travelstar 7K1000
Device Model:     HGST HTS721010A9E630
Serial Number:    JR1004BNJKM6VM
LU WWN Device Id: 5 000cca 8e6e43178
Firmware Version: JB0OA3U0
User Capacity:    1 000 204 886 016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      2.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 6
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Wed Mar 10 19:42:30 2021 +07
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
					was never started.
					Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
					without error or no self-test has ever 
					been run.
Total time to complete Offline 
data collection: 		(   45) seconds.
Offline data collection
capabilities: 			 (0x5b) SMART execute Offline immediate.
					Auto Offline data collection on/off support.
					Suspend Offline collection upon new
					command.
					Offline surface scan supported.
					Self-test supported.
					No Conveyance Self-test supported.
					Selective Self-test supported.
SMART capabilities:            (0x0003)	Saves SMART data before entering
					power-saving mode.
					Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   2) minutes.
Extended self-test routine
recommended polling time: 	 ( 170) minutes.
SCT capabilities: 	       (0x003d)	SCT Status supported.
					SCT Error Recovery Control supported.
					SCT Feature Control supported.
					SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   062    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   040    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0007   119   119   033    Pre-fail  Always       -       2
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       1122
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   040    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0012   086   086   000    Old_age   Always       -       6553
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1115
191 G-Sense_Error_Rate      0x000a   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       36
193 Load_Cycle_Count        0x0012   078   078   000    Old_age   Always       -       223725
194 Temperature_Celsius     0x0002   157   157   000    Old_age   Always       -       38 (Min/Max 11/51)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       39
223 Load_Retry_Count        0x000a   100   100   000    Old_age   Always       -       0

SMART Error Log Version: 1
ATA Error Count: 39 (device log contains only the most recent five errors)
	CR = Command Register [HEX]
	FR = Features Register [HEX]
	SC = Sector Count Register [HEX]
	SN = Sector Number Register [HEX]
	CL = Cylinder Low Register [HEX]
	CH = Cylinder High Register [HEX]
	DH = Device/Head Register [HEX]
	DC = Device Command Register [HEX]
	ER = Error register [HEX]
	ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 39 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 50 00 90 cc 40 00      03:50:09.783  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:09.783  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:09.782  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:09.782  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:09.781  IDENTIFY DEVICE

Error 38 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 68 00 90 cc 40 00      03:50:09.413  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:09.413  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:09.412  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:09.412  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:09.411  IDENTIFY DEVICE

Error 37 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 28 00 90 cc 40 00      03:50:09.033  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:09.033  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:09.032  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:09.032  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:09.031  IDENTIFY DEVICE

Error 36 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 18 00 90 cc 40 00      03:50:08.663  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:08.663  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:08.662  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:08.662  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:08.661  IDENTIFY DEVICE

Error 35 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 00 00 00 00 00

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  ec 00 00 00 00 00 a0 00      03:50:03.301  IDENTIFY DEVICE
  61 08 01 07 90 cc 0d ff      03:50:02.961  WRITE FPDMA QUEUED
  61 08 28 00 90 cc 40 00      03:50:02.923  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:02.923  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:02.922  IDENTIFY DEVICE

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Interrupted (host reset)      80%      4412         -
# 2  Short offline       Completed without error       00%      3199         -
# 3  Extended offline    Completed without error       00%        24         -
# 4  Short offline       Completed without error       00%         4         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Какой вердикт? Срочно бэкапиться?

P.S.

После перезагрузки стали падать вкладки в лисе. Вроде к HDD не относится, хотя хз…

 

wandrien
()

Утечка данных через кольцевую шину CPU Intel

Пацаны, к нам снова традиционный дуршлаг с подогревом от Интел подъехал:

https://www.opennet.ru/opennews/art.shtml?num=54717

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

Ай, хорошо!

 

wandrien
()

shell-script, у тебя всё хорошо?

То есть

Если ты про руби, то у тебя куча ошибок в слове «всратые»

— не нарушает никаких правил форума.

А ответ

Типичный фанатик. Кроме сортирных, других мыслей в голове нет.

— это 4.3.

З.Ы. Ну раз сайт требует поставить тэг, то пусть будет швим.

 

wandrien
()

Ну что, почалося? BrВИМ!

Помоги перенести скрипт bash -> sh

Сообщение удалено bryak по причине 4.3 Провокация flame (-1)

Почему бы не переписать скрипт на Python?

Или тебе принципиально хочется пострадать?

EXL ★★★★★ (05.03.21 13:53:43)

Сообщение удалено bryak по причине 4.1 Offtopic (0)

Ответ на: комментарий от EXL 05.03.21 13:53:43

Ему даже bash запрещают. А ты python предлагаешь.

wandrien (05.03.21 13:54:58)

Тебе заняться больше нечем??

 ,

wandrien
()

«Простой» синтаксис

Небольшая задача. Вот так — не работает:

Ext_Ajax_promise = async function(options) {
    return new Promise(function(resolve, reject) {
        options.callback = function(options, success, response) {
            let result = {
                response: response,
                options: options
            }
            (success ? resolve : reject)(result);
        }
        Ext.Ajax.request(options);
    });
}

Кто за 2 секунды понял, почему, — тот молодец и гуру джаваскрипта. А я не молодец, я ломал голову минут 10.

Если кто-то не догадался, где ошибка, то смотрите историю правок поста — там скрыта рабочая версия.

Мораль простая: не слушайте адептов «простого синтаксиса» и всегда шарашьте точки с запятой.

Задавайте ваши ответы.

 ,

wandrien
()

Выбор встраиваемого интерпретатора

Привет! Поделитесь опытом внедрения разных встраиваемых реализаций.

Есть идея для одного приложения. Планирую, что оно будет поставляться в двух вариантах:

  • Как обычное веб-приложение для развёртывания и запуска на сервере.
  • Как статический бинарь (appimage?) со всем кодом внутри. «Запустил и работает», для локалхоста.

То есть во втором случае бинарь будет включать в себя и интерпретатор, и код на скриптовом языке, и всю необходиму обвязку, чтобы веб-приложение «не заметило разницы».

В связи с этим встал вопрос о выборе встраиваемого интерпретатора и соответственно языка. Пока работа над основным кодом не начата, и у меня есть только небольшой прототип на Ruby, еще не поздно сменить язык.

Вспомнились такие встройки:

  • Для Ruby: mruby
  • Для Python: micropython
  • Для JS: quickjs, duktape, десятки их

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

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

P.S.:

Жирный V8 в appimage тащить не хочу. Электрон не предлагать.

 , ,

wandrien
()

Добавление столбцов

Есть ли разница, добавлять новые столбцы в таблицу после последнего столбца или где-нибудь в середине списка?

Разница по производительности работы таблицы или еще какие-то подводные камни?

 ,

wandrien
()

Как мне в питоне включить отладочный лог для единственного модуля?

Извините, но я прочитал https://docs.python.org/3/library/logging.html и нихрена не понял.

Во всех нормальных обертках для записи логов можно переопределить уровень логирования для конкретного модуля, сделав уровень выше дефолтного. А в питоне вы можете сделать его только ниже, а не выше.

Что они курили и что курить теперь мне?

UPD:

В качестве решения сделал модуль для манки-патчинга дефолтного логгера. См. в комментариях.

 ,

wandrien
()

list comprehensions

В очередной раз при правке кода на питоне у меня пригорело от list comprehensions.

А вот что пишут настоящие живые люди, которых никто не заставляет под дулом пистолета:

I find the list comprehension much clearer than filter+lambda

Или:

Personally I find list comprehensions easier to read. It is more explicit what is happening from the expression [i for i in list if i.attribute == value] as all the behaviour is on the surface not inside the filter function.

Ну давайте посмотрим, как этот much clearer way выглядит in the wild. Как-то так:

    def getSupportedTrackers(self):
        trackers = self.getTrackers()

        if not self.site.connection_server.tor_manager.enabled:
            trackers = [tracker for tracker in trackers if ".onion" not in tracker]

        trackers = [tracker for tracker in trackers if self.getAddressParts(tracker)]  # Remove trackers with unknown address

        if "ipv6" not in self.site.connection_server.supported_ip_types:
            trackers = [tracker for tracker in trackers if helper.getIpType(self.getAddressParts(tracker)["ip"]) != "ipv6"]

        return trackers

Просто сплошной [blabla for blabla in blablas if ...blabla...].

Просто в начале каждой такой строки ты должен мысленно стирать кусок [tracker for tracker in trackers if и читать, что же там дальше. И как писал Роберт Мартин в «Чистом коде», любые конструкции, которые принуждают читателя тренироваться пропускать себя мимо глаз, являются источником скрытых ошибок. Пропустив 500 раз мимо глаз типовой фрагмент кода, на 501-й раз вы пропускаете ПОЧТИ такой же фрагмент, в котором содержится ошибка. И в силу одинаковой натренированности рефлексов у всех разработчиков продукта, эта ошибка может оставаться незамеченной годами.

Давайте посмотрим, как этот же код можно преписать на лямбдах на руби:

    def getSupportedTrackers():
        trackers = @getTrackers()

        if not @site.connection_server.tor_manager.enabled
            trackers = trackers.filter {|tracker| not tracker.include? ".onion"}
        end

        trackers = trackers.filter {|tracker| @getAddressParts(tracker)}

        if not @site.connection_server.supported_ip_types.include? "ipv6"
            trackers = trackers.filter {|tracker| helper.getIpType(@getAddressParts(tracker)["ip"]) != "ipv6"}
        end

        return trackers
    end

Уже стало лучше за счёт уменьшения количества бойлерплейта, который приходится пропускать мимо. Но 3 вызова trackers.filter подряд и два идентичных вызова getAddressParts говорят нам, что этот код надо переписать.

Заметьте, что необходимость рефакторинга для устранения дублирования не была очевидна в коде с list comprehensions, потому что они за своей многословностью и нечитабельным синтаксисом скрывают суть происходящего.

Убираем дублирование:

    def getSupportedTrackers()
        tor_enabled = @site.connection_server.tor_manager.enabled
        ipv6_enabled = @site.connection_server.supported_ip_types.include? "ipv6"

        trackers = @getTrackers()

        trackers = trackers.filter {|tracker|
            if (not tor_enabled) and (tracker.include? ".onion")
                next false
            end

            address_parts = @getAddressParts(tracker)
            if not address_parts
                next false
            end

            if (not ipv6_enabled) and (helper.getIpType(address_parts["ip"]) == "ipv6")
                next false
            end

            next true
        }

        return trackers
    end

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

P.S. Или для любителей длинных однострочников:

    def getSupportedTrackers()
        tor_enabled = @site.connection_server.tor_manager.enabled
        ipv6_enabled = @site.connection_server.supported_ip_types.include? "ipv6"

        trackers = @getTrackers()

        trackers = trackers.filter {|tracker|
            next false if (not tor_enabled) and (tracker.include? ".onion")

            address_parts = @getAddressParts(tracker)
            next false if not address_parts

            next false if (not ipv6_enabled) and (helper.getIpType(address_parts["ip"]) == "ipv6")

            next true
        }

        return trackers
    end

Но этот вариант по моему мнению хуже.

Перемещено leave из talks

 , ,

wandrien
()

Статья: Устройство подсистемы TTY

Опубликовал статью, посвященную устройству подсистемы TTY.

Подсистема TTY — одна из ключевых особенностей Unix и Unix-подобных операционных систем.

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

Описание архитектуры TTY, изложенное здесь, не является на 100% корректным. Некоторые части были намеренно упрощены или опущены, чтобы итоговая картина получилась более простой и цельной. Эти детали не являются критичными для понимания принципов работы TTY. При необходимости все необходимые детали могут быть восстановлены чтением страниц руководств в составе операционной системы.

Статья представляет собой высокоуровневое описание функциональных частей и режимов TTY с точки зрения пользователя или прикладного программиста.

>> Подробности

 ,

wandrien
()

Не совсем Windows calculator не совсем портировали на Linux

Windows calculator портировали на Linux

В таком виде — вызывающе неверная информация. См. подтверждение здесь: Windows calculator портировали на Linux (комментарий)

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

 

wandrien
()

RSS подписка на новые темы