MNT Reform Pocket: первые ноуты доставлены пользователям
Немного прослоупочил конечно, вот новость: https://www.crowdsupply.com/mnt/pocket-reform/updates/mnt-pocket-reform-is-being-shipped
Цена конечно очень сильно кусается…
Немного прослоупочил конечно, вот новость: https://www.crowdsupply.com/mnt/pocket-reform/updates/mnt-pocket-reform-is-being-shipped
Цена конечно очень сильно кусается…
ЦЕРН сейчас проводит семинар по «закрытию» очередной «аномалии».
Предлагаю неравнодушным посмотреть: https://indico.cern.ch/event/1187945/
ROOT является основным программным пакетом в мире для анализа данных с детекторов в мире физики элементарных частиц. Несмотря на неприятие его фортранщиками и питонистами, ROOT всё ещё живёт, потихонечку продвигая в сообщество новые методы анализа данных.
Основные новшества v6.26:
Попробовал тут перед новогодними каникулами тему Chicago95 на своём рабочем компе. Докладаю: в целом это наиближайший к оригиналу закос, но, к сожалению, линуксовые реалии дают о себе знать: лиса выглядит как пришелец из совсем другого мира, проводник совсем не такой (а вот у CERN ROOT похож, только Qtшная тема всё портит). Но в целом впечатления скорее приятные, и ностальгическую атмосферу эта тема безусловно создаёт.
>>> Просмотр (1920x1080, 338 Kb)
Привет ЛОР.
Как ограничить максимальное число тредов, доступных для std::reduce
с parallel_unsequenced_policy
? Я просмотрел соответствующие страницы в cppreference, но не нашёл ответа. Я попробовал поиграться на уровене prlimit, но получил ошибку thread_monitor Resource temporarily unavailable in pthread_create
. Хотелось бы не городить костылей в виде семафоров и мьютексов только ради такой казалось бы простой задачи.
UPD: В стандартной библиотеке так сделать нельзя, а вот в HPX можно. Вот пример: https://github.com/STEllAR-GROUP/hpx/blob/master/examples/quickstart/vector_zip_dotproduct.cpp
Если включить -Wall -O3 для selfadjointView
, то gcc11 начинает громко ругаться, ну а так как у меня -Werror ещё включён, то становится ещё грустнее. На gcc10 всё работает, только что проверил. Ругается, что warning: ‘result’ may be used uninitialized
, а переменной result ни в коде нет, ни в Eigen/src/Core/products/SelfadjointMatrixVector.h
. Версия Eigen 3.3.9
#include "Eigen/Core"
using matrix_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic,
Eigen::Dynamic>;
using vector_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
inline double braMket (
const vector_t &bra,
const matrix_t &M,
const vector_t &ket)
{
const auto H = M.selfadjointView<Eigen::Lower> ();
return std::real (ket.dot (bra.transpose ()*H));
}
double bilinear_form (
const vector_t &v,
const matrix_t &m)
{
return braMket (v, m, v);
}
luke@yaviniv:~/eigen-gcc11$ gcc -v
Reading specs from /usr/lib64/gcc/x86_64-slackware-linux/11.2.0/specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-slackware-linux/11.2.0/lto-wrapper
Target: x86_64-slackware-linux
Configured with: ../configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man --infodir=/usr/info --enable-shared --enable-bootstrap --enable-languages=ada,brig,c,c++,d,fortran,go,lto,objc,obj-c++ --enable-threads=posix --enable-checking=release --enable-objc-gc --with-system-zlib --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=new --disable-libstdcxx-pch --disable-libunwind-exceptions --enable-__cxa_atexit --disable-libssp --enable-gnu-unique-object --enable-plugin --enable-lto --disable-install-libiberty --disable-werror --with-gnu-ld --with-isl --verbose --with-arch-directory=amd64 --disable-gtktest --enable-clocale=gnu --disable-multilib --target=x86_64-slackware-linux --build=x86_64-slackware-linux --host=x86_64-slackware-linux
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.2.0 (GCC)
luke@yaviniv:~/eigen-gcc11$ pkg-config --modversion eigen3
3.3.9
luke@yaviniv:~/eigen-gcc11$ g++ -c initialize.cpp -o initialize.o $(pkg-config eigen3 --cflags) -Wall
luke@yaviniv:~/eigen-gcc11$ g++ -c initialize.cpp -o initialize.o $(pkg-config eigen3 --cflags) -Wall -O3
In file included from /usr/include/eigen3/Eigen/Core:503,
from initialize.cpp:1:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h: In function ‘static void Eigen::internal::selfadjoint_product_impl<Lhs, LhsMode, false, Rhs, 0, true>::run(Dest&, const Lhs&, const Rhs&, const Scalar&) [with Dest = Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1> >; Lhs = Eigen::Transpose<const Eigen::Matrix<std::complex<double>, -1, -1> >; int LhsMode = 2; Rhs = Eigen::Transpose<const Eigen::Transpose<const Eigen::Matrix<std::complex<double>, -1, 1> > >]’:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:227:7: warning: ‘result’ may be used uninitialized [-Wmaybe-uninitialized]
225 | internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<ActualLhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226 | int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
227 | (
| ^
228 | lhs.rows(), // size
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
229 | &lhs.coeffRef(0,0), lhs.outerStride(), // lhs info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
230 | actualRhsPtr, // rhs info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
231 | actualDestPtr, // result info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
232 | actualAlpha // scale factor
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
233 | );
| ~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:39:24: note: by argument 4 of type ‘const std::complex<double>*’ to ‘static void Eigen::internal::selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs, Version>::run(Index, const Scalar*, Index, const Scalar*, Scalar*, Scalar) [with Scalar = std::complex<double>; Index = long int; int StorageOrder = 1; int UpLo = 2; bool ConjugateLhs = false; bool ConjugateRhs = false; int Version = 0]’ declared here
39 | EIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
luke@yaviniv:~/eigen-gcc11$
На арче такая же беда.
Upd. Баг подтвердили, выражение упростили до просто умножения вектора на матрицу: https://godbolt.org/z/PGjP3rz91
Привет ЛОР, я вам тут покушать принёс.
В нашей науке довольно часто используется метод максимального правдоподобия. Максимум такой функции обычно находят с помощью какой-нибудь уже готовой библиотеки, вроде медленного, но проверенного временем Minuit, или чего-нибудь из nlopt. Основная сложность заключается в вычислении самой функции правдоподобия на каждом шаге итерации поиска максимума и её градиента, потому что данных-то много и надо просуммировать их всех, да и пространство параметров уже давно переваливает за пару сотен (вот пример такого анализа данных). Обычно задачу вычисления ненормированной вероятности одного события упрощают до линейной, однако сумма-то идёт по логарифмам вероятности, так что в конце-концов всё равно на каждом шаге возникает сумма от миллиона логарифмов от свёрток матриц с параметрами аппроксимации.
Но это была присказка.
А теперь сама сказка: как лучше всего сворачивать матрицы с параметрами? Как делать это быстро? Я написал простенький бенчмарк на плюсах, который генерит псевдослучайные данные; каждое событие представлено в виде эрмитовской матрицы, для бенча же вычисляется сумма - ln V^dag M V
, V — комплексные параметры (тоже генерятся случайно, но только один раз).
Я потестил Eigen и boost на дремучем i7 860 без avx инструкций, получается как-то так:
Compiler flags: -O3 -ffast-math -I/usr/include/eigen3
Number of events: 1000000
************************* Matrix size 10x10 ************************
=== Eigen with fixed size matrix
- ln L = -3.34078e+06 [n. u.]
Float size: 4 [Bytes]
FCN duration: 240.944 [ms]
=== Eigen with fixed size matrix
- ln L = -3.34073e+06 [n. u.]
Float size: 8 [Bytes]
FCN duration: 378.355 [ms]
=== Eigen with dynamic size matrix
- ln L = -3.34078e+06 [n. u.]
Float size: 4 [Bytes]
FCN duration: 262.532 [ms]
=== Eigen with dynamic size matrix
- ln L = -3.34073e+06 [n. u.]
Float size: 8 [Bytes]
FCN duration: 398.018 [ms]
=== Boost hermitian matrix
- ln L = -3.34078e+06 [n. u.]
Float size: 4 [Bytes]
FCN duration: 654.639 [ms]
=== Boost hermitian matrix
- ln L = -3.34073e+06 [n. u.]
Float size: 8 [Bytes]
FCN duration: 662.562 [ms]
************************* Matrix size 5x5 ************************
=== Eigen with fixed size matrix
- ln L = -1.51895e+06 [n. u.]
Float size: 4 [Bytes]
FCN duration: 242.141 [ms]
=== Eigen with fixed size matrix
- ln L = -1.51894e+06 [n. u.]
Float size: 8 [Bytes]
FCN duration: 380.236 [ms]
=== Eigen with dynamic size matrix
- ln L = -1.51895e+06 [n. u.]
Float size: 4 [Bytes]
FCN duration: 151.074 [ms]
=== Eigen with dynamic size matrix
- ln L = -1.51894e+06 [n. u.]
Float size: 8 [Bytes]
FCN duration: 169.722 [ms]
=== Boost hermitian matrix
- ln L = -1.51895e+06 [n. u.]
Float size: 4 [Bytes]
FCN duration: 204.22 [ms]
=== Boost hermitian matrix
- ln L = -1.51894e+06 [n. u.]
Float size: 8 [Bytes]
FCN duration: 205.454 [ms]
Как видите, буст начинает проигрывать при переходе от матриц 5x5 к 10x10. Однако я помню когда я гонял этот тест недели три назад на других (более новых) хостах, ситуация не была такой уж однозначной.
Я добавлю код теста в комментарии, авось уважаемая публика ткнёт меня носом в мои ошибки. cast Siborgium AntonI byko3y
WitcherGeralt annerleen вы там какие-то бенчи гоняли и устраивали традиционный срач синих с красными, вот вам однопоточный тест для вполне себе реальной задачи.
Тихо и незаметно вышел первый патч-релиз в серии ROOT 6.24.
ROOT — это созданный в ЦЕРНе фреймворк для анализа данных с детекторов в физике частиц. За последние несколько лет команда разработчиков приложила огромные усилия, чтобы привнести в стандартные практики анализа данных в физике современные веяния из области IT, и при этом по возможности сохранить совместимость с предыдущими версиями ROOT. Постепенно добавляются всё новые возможности использования subj в python.
Этот патч-релиз содержит лишь незначительные изменения, в основном исправления ошибок:
RDataFrame
для большого числа ядер (более 32)RooFit
— популярной библиотекой для аппроксимаций данных с удобным интерфейсом и большим количеством встроенных функцийboost/shared_ptr.hpp
UPD: Команда ROOT выпустила ROOT v6.24/04.
Несколько фиксов, например: в исходниках ranluxpp использовался сдвиг влево с отрицательным аргументом -1, что является UB в стандарте языка C (https://github.com/root-project/root/issues/8503)
Раз тут повелитель тьмы Zhbert выложил фотку своего офиса, то надо нанести ответный удар^W^W^W^W почему бы и не показать, что происходит на светлой стороне силы.
Повсеместное закрытие границ сильно сказалось на академическом мире, включая проведение пар и конференций по зуму. По этой же причине отпала и возможность поехать за тридевятьземель подежурить на детекторе частиц (а заодно и поесть рамена за 700 йен в окресностях этого самого детектора). Впрочем, тут как раз тот случай, когда те кто остался на острове позавидовали тем, кто до него не добрался, потому что на них легла огромная нагрузка по проведению физических заходов, и практически единственное, что можно сделать удалённо — это смотреть на различные графики и распределения, и если что-то идёт не так, то вызванивать эксперта по подсистеме. А для этого, как можно заметить на фотографии, нужно довольно много мониторов. По счастию на работе у нас заведена специально на такой случай отдельная комната, и в воскресный вечер я отправился на дежурство на работу. Сама настройка всех экранов и звука на нашем доморощенном CentOS 7 заняло у меня где-то час, но теперь всё что надо находится на виду (нет нужды открывать новую вкладку в браузере), да и звук с жабры работает. Теперь можно выдохнуть, заняться своими делами, периодически, конечно, поглядывая на графики и реагируя на сирену. Поэтому я притащил с собой Thinkpad R50P — идеальная машинка для простого набивания исходных кодов в vim, чем и собираюсь заняться ближайшие семь оставшихся часов дежурства (хотя скорее всего мой план слишком амбициозен, и я буду тупо зависать на лоре или LQ).
>>> Просмотр (4000x3000, 4162 Kb)
Субж. Письмо вот даже прислали на почту (это наверное потому что я у них на форуме зарегался, хотел было баг зарепортить, да в процессе написания репорта пофиксил проблему). Из важного лично для меня: Minuit2 (минимайзер) снова ведёт себя по-новому:
When using external provided gradient, compute in MnSeed still numerical gradients to obtain correct step sizes and initial estimate of covariance matrix. This allows to start with a good first state estimation, reducing significantly the number of subsequent iterations.
Плюс ещё в TMVA добавили поддержку PyTorch, впрочем лично мне TMVA не очень по нраву из-за его интерфейса.
Ещё обещали ускорить IO, было бы неплохо если оно действительно так, и без новых багов к тому же.
В LKML Arnd Bergmann поднял вопрос об удалении различных устаревших платформ из-за того что они не развиваются, и по такому случаю он предлагает дропнуть и i486.
У меня просто ностальгические чувства, ибо первый компьютер как-никак был именно на 486. Впрочем, сейчас под рукой только Pentium MMX, на который я даже не пытался поставить современный линь, ибо слишком жирный, так что может быть оно и правильно.
Интересно, а когда бросят поддержку i686?
Я уже в торсионном треде спрашивал AntonI про числодробилки на плюсах, но возможно кто-нибудь ещё сможет дать совет по тому, как правильно оптимизировать вычисления на плюсах (фортран тоже сойдёт на самом деле, но нужны веские аргументы, как впрочем и питон с нумпаями).
Я вычисляю значение комплекснозначной функции от трёх действительных аргументов
(плюс ещё порядка тридцати действительных параметров, которые при вычислении
фиксированы на каждую итерацию фита). Пока я взял фортрановский код,
соответствующий данной статье, и
переписал его в виде класса с методами const
и double
. Пример ниже приведён.
Таких функций я должен буду насчитывать по миллиарду раз на только одну итерацию
фита, поэтому и встаёт вопрос об оптимальном написании кода.
Заголовочный файл вот такой:
#include <complex>
typedef std::complex<double> complex;
class ff_t
{
private:
double mro, gro, mrp, grp, mf2, gf2, mf0, gf0, msg, gsg;
complex bt1, bt2, bt3, bt4, bt5, bt6, bt7;
double mpi, mpi2;
double sqr (double x) const {return x*x;}
public:
ff_t ();
complex xi1 (double qq, double s1, double s2) const;
};
Кусок файла с кодом:
#include "ff.hpp"
#include <cmath>
complex ff_t::bw (double s, double m, double g, int l) const
{
const auto mp = 4*sqr (mpi);
const auto msq = sqr (m);
const auto w = std::sqrt (s);
double wgs = 0.0;
if (w>2*mpi) {
auto qs = std::sqrt (std::abs ((s-mp)*s))/w;
auto qm = std::sqrt (std::abs ((msq-mp)*msq))/m;
const int ipow = 2*l+1;
wgs = g*(msq/w)*std::pow(qs/qm, ipow);
}
return complex (msq, 0.)/ complex (msq-s, -wgs);
}
complex ff_t::xi1 (double qq, double s1, double s2) const
{
// check phase space
auto s3 = qq - s1 - s2 + 3*mpi2;
if ((s3 <= 0.) or (s2 <= 0.))
return complex(0., 0.);
const auto f134 = -1./3. * ((s3-mpi2)-(s1-mpi2));
const auto f15a = -1./2. * ((s2-mpi2)-(s3-mpi2));
const auto f15b = -1./18.* (qq-mpi2+s2)*(4.*mpi2-s2)/s2;
const auto f167 = -2./3.;
const auto fro1 = bw (s1, mro, gro/*o*/, 1);
const auto frp1 = bw (s1, mrp, grp, 1);
const auto fro2 = bw (s2, mro, gro, 1);
const auto frp2 = bw (s2, mrp, grp, 1);
const auto ff21 = bw (s1, mf2, gf2, 2);
const auto ff22 = bw (s2, mf2, gf2, 2);
const auto fsg2 = bw (s2, msg, gsg, 0);
const auto ff02 = bw (s2, mf0, gf0, 0);
return
bt1*fro1 + bt2*frp1+
bt3*f134*fro2 + bt4*f134*frp2
- bt5*f15a*ff21 - bt5*f15b*ff22
- bt6*f167*fsg2 - bt7*f167*ff02;
}
И флаги компиляции:
CFLAGS=-pthread -std=c++14 -m64 -fext-numeric-literals
CFLAGS += -Wall -Werror -Wpacked -malign-double -O3\
-mpreferred-stack-boundary=8 -Wfatal-errors
Привет, ЛОР.
В посте полугодичной давности я рассказал о том, как я возился с монохромным монитором от МежДелМаша, подключая его к IBM PS/2. Теперь же я хочу поделиться с вами совсем-таки недавним моим успехом уже софтверного характера, впрочем всё так же занимающим своё заслуженное место в одном из разделов Специальной олимпиады, а именно, — я модифицировал древний MINIX 1.7.5 под нужды своего компьютера, дабы использовать все основные возможности железа. Но начну я своё изложение всё-таки с описания характеристик, ибо именно оно является основным лимитирующим фактором.
Итак, на фото один IBM 8530 (PS/2 Model 30 286) со следующими параметрами
Делловский монитор подключён к VGA из материнки, а вот с монохромным монитором пришлось повозиться, сделав переходник с MDA DB-9 на DB-15, плюс выцыганить питание с разъёма для флоппи, ибо IBM решили убрать молексы из дизайна, и запитывать диски с материнки.
Ситуация с подключением двух мониторов довольна нестандартна для конца 80х, однако именно для этой цели адресное пространство у монохромного адаптера и у цветного графического (от которого наследуется текстовый режим VGA) разные, а значит в теории можно использовать VGA+MDA. Однако обычно программы для MS-DOS на это не затачивались, и профита от такой схемы для меня не должно было быть, если бы не…
Если бы не старый MINIX. Версии вплоть до 2.0.4 позволяли в теории запустить полноценный UNIX даже на IBM PC XT с 640k RAM. Однако же найти подходящую именно для меня конфигурацию MINIX оказалось задачей трудной. Я перебрал сначала версию MINIX для MS-DOS, но 1 MB памяти для неё было явно мало (что и не удивительно, ведь MINIX для DOS создаёт виртуальный диск в RAM). В итоге я смог установить в QEMU MINIX 1.7.5 на один из разделов Compact Flash, и потом даже запустить уже на самом PS/2.
Правда, путь к первой введённой в терминале команде был тернист. Во-первых,
MINIX подвешивал клавиатуру при загрузке. Причину удалось установить,
загрузившись в режиме совместимости с i8086, откуда подозрения сразу пали на
злосчастную линию A20, которая управляется контроллером клавиатуры в AT-клонах
для совместимости с i8086. В исходном коде kernel/klib88.s
A20-линия
выставлялась в соответствии с мануалами, вот только оказалось, что для IBM
PS/2 появился специальный контроллер для управления A20, а посему код для ядра
пришлось сразу же патчить. По итогам доступная память с 640k в режиме
совместимости увеличилась до установленной памяти в 1 MB, плюс защищённый
режим с его плюсами (ну и минусами тоже, об этом чуть позже).
Следующим шагом было реализации возможности работать одновременно в двух
виртуальных tty, используя два монитора. В коде kernel/console.c
такой
абстракции как монитор или экран не было, поэтому пришлось долго провозиться с
возникающими гонками за внутренние переменные, однако усилия были
вознаграждены, и теперь я мог например вывести на один экран какой-нибудь man, и параллельно редактировать файл на другом, переключаять по Alt-<- Alt–>.
Ещё одна из проблем оригинального MINIX — он отказывался работать с CF-XT адаптером. Одно время я был удовлетворён работой драйвера, который вызывает функции BIOS int 13h через аппаратный сброс, пока я не захотел наконец-то разобраться с сетевым драйвером (благо он как раз для WD8390 совместимых карт уже был в исходниках). При включении Ethernet в параметрах ядра загрузка зависала на моменте инициализации драйвера диска (забавно, не правда ли?) Вместо того, чтобы пофиксить баг, я решили подойти к вопросу радикально и переписать стандартный драйвер IDE контроллера, чтобы он стал поддерживать CF-XT-lite. И это было увлекательно. Главной подсказской для меня стала принципиальная схема адаптера, потому что сходу отображение адресов CF на шину не гуглилось, и оказалось, что не на все вопросы необходимо искать ответ в Интернете, тем более когда достаточно просто взглянуть глазами на схему платы. Конечно, документация к CF и исходники XTIDE BIOS мне тоже помогли. В процессе переписывания драйвера в момент, когда я наконец-то разобрался с адресами, и драйвер стал идентифицировать устройство, я умудрился несколько раз испортить корневой раздел, но спасали бэкапы и Linux, который до сих пор поддерживает старую добрую MINIX FS.
Как итог: старый MINIX прекрасно себя чувствует на старой же машине с 16-bit разрядностью и 1 MB памяти, при этом позволяет выходить во внешний мир с помощью telnet и ftp и поддерживает мультизадачность. Сейчас я ковыряюсь с httpd сервером, который уже скомпилировался и запускается, но пока возвращает только 403 и 404 (причём делает это он секунд за пять, если не медленнее). Остались ещё мелкие недочёты по типу не работающего SIGTERM по Ctrl-C и мигающего сразу в двух экранах курсора (это сбивает с толку, потому что не знаешь, на какой экран сейчас перенаправлен ввод). Из глобального хочется сделать frame buffer хотя бы для VGA, а то и для обоих мониторов (попробовать видеокарту ATI в режиме Hercules). Другая возможная ветка развития — создание дистрибутива для старых компов и эмуляторов типа даже pcjs.org, чтобы у энтузиастов была возможность попробовать настоящий UNIX на своём ретро железе.
P.S. Да, чуть не забыл. На фото на левом мониторе telnet на какую-то из BBSок, на правом — стандартные UNIX команды и вывод кусочка ядра на экран.
>>> Просмотр (4000x3000, 4288 Kb)
На скриншоте — экран моего джедайского Thinkpad R50p с Pentium M и 512 МБ оперативы на борту. Крутая его особенность — разрешение экрана 1600x1200, качество экрана сильно лучше обычного Thinkpad X220, как и клавиатуры.
Так как линуксы в последнее время довольно требовательные к ресурсам, то я попытался найти наиболее свежую конфигурацию софта, которая покроет мои рабочие потребности, и при этом запустится на таком старом железе. Слава Патрику, Слака после некоторых плясок с PAE ядром таки завелась, а потом даже обновилась до -current. В качестве оконного менеджера я пока использую blackbox, однако глаза косят в сторону dwm, думаю через какое-то время я на него-таки перейду. Вместо xterm я вот буквально вчера случайно запустил urxvt, покурил немного man и man 7, просветления не достиг, но скорее всего на пути к нему, однако главное — urxvt заметно быстрее xterm. Жирнолис смог проработать на таком железе минуты две, а потом свалился вместе с иксами в чорную-чорную консоль, а вот SeaMonkey, отожрав половину памяти, держится, с него я и пишу этот пост. В опенарену играть можно даже на максимальном разрешении, ну а так как я не геймер, то лагов я не замечаю. glxgears выдаёт что-то в промежутке от 50 до 60 fps, но я как-то не верю этим попугаям. Планирую апгрейднуться до двух гигов; это максимально возможная конфигурация.
На этом, собственно, и всё, задавайте свои ответы.
>>> Просмотр (1599x1199, 172 Kb)
Так как на карантине появилось больше времени для домашних занятий, я решил провести своё свободное время с особенной пользой и прикрутить совершенно бесполезный монитор от IBM Displaywriter к моему компьютеру. Сам этот Displaywriter — штука довольно странная, на сколько я понимаю всего лишь даёт возможность работать с текстом, то есть это даже не PC. Но вот монитор они взяли как раз от PC, а именно монохромную версию, IBM 5151; правда эти гении из IBM подумали, что нехай иметь отдельный кабель для питания и для видеосигнала, и запихнули всё это в одну вилку. Ну хоть разъём поменяли — и на том спасибо, а так бы кто-нибудь обязательно на землю 12 В подал.
Надо сказать, что в восьмидесятые годы видео-стандартов было не меньше теперешнего, но стандарт для Displaywriter можно сказать вообще не стандарт — я не нашёл никакого упоминания о DB-15 для видео, которое бы содержало внутри питание для монитора.
По счастию мне удалось найти схему распиновки для этого монитора, и о чудо — питание нужно было только +5 и +12 В, которые без зазрения совести можно позаимствовать прямо с материнской платы почти любого компьютера. При этом для передачи самого видеосигнала использовалось четыре пина: сигналы для вертикальной и горизонтальной синхронизации, интенсивность и дополнительная яркость — такие же, как и на вполне стандартном для своего времени монохромного монитора от персонального компьютера, который поддерживали почти все видео-карты начала-середины восьмидесятых, в том числе и моя ATI Graphics Solutions rev. 3, найденная в мусорном баке университета. Оставалось только спаять переходник и конфигурировать видео-карту. На удивление на пайку у меня ушло гораздо меньше времени, чем программирование, а всё потому, что BIOS моего компьютера не мог правильно инициализировать видео-контроллер, и поэтому мне пришлось написать свою собственную программу на ассемблере (которая, будем честными, была лишь вольным пересказом BIOS от IBM PC XT, исходники которого были опубликованы в «Руководстве пользователя»).
После того, как наконец-то появился первый долгожданный символ на экране, наступило некоторое разочарование — первые два столбца неизбежно «съедались» при отрисовке, а это означало, что надо было лезть внутрь монитора и настраивать положение луча электронов внутри трубки. Ну а так как ЭЛТ есть довольно большой конденсатор, который даже после выключения может быть заряжен до каких-то немыслимых киловольт, то настройка включённого монитора была попросту невозможна, а посему сия процедура заняла у меня четыре итерации с разбором и сбором монитора. Но в конце-концов фаза луча была выставлена верно, и прекрасный зелёный текст теперь радует мои глаза.
Теперь наверное нужно спаять более солидный провод, и добавить конденсатор, чтобы убрать помехи от пятидесяти герц (особенно заметна работа холодильника), думаю в обозримом будущем я это сделаю. Но принципиально telnet на моём IBM PS/2 Model 30 286 работает, к ноутбуку с арчем цепляется.
Собственно, на фотографии всё разнообразие техники у меня дома и представлено: помимо уже упомянутого ретро-компа здесь вы увидите так же казённый iPad, который используется как записная книжка; главная машинка — ThinkPad X220 с подключённым по VGA монитором от DELL, найденном на той же университетской помойке; плюс какой-то дешманский виниловый проигрыватель и цифровая пианина CELVANO, подаренная мне местным церковным органистом.
Видосик про то, как я логинюсь на кластер, чтобы проверить запущенные задачи, можно посмотреть на ютубчике: https://www.youtube.com/watch?v=m4pjEwnDWcE
Ну и в конце некоторый TODO list: хочу исправить на PS/2 батарейку (она вшита внутрь чипа, но есть мануалы как её можно «заменить»), потом надо будет наверное заняться дискетами, просто чтобы было наверное, ибо CF-IDE справляется со своей работой очень хорошо. Можно потихоньку писать эмулятор терминала, чтобы использовать фичи защищённого режима, но пока эта задачка отложена на неопределённый срок.
>>> Просмотр (4000x3000, 4269 Kb)
В четверг заходил на arxiv.org, там висела плашка с содержанием «пройдите наш опросник, это недолго». В числе прочих вопросов были примерно вот такие вот: а хотите мы запилим комментирование препринтов? А давайте мы сделаем «репутацию» аплоадеров? И прочее.
Так вот и думается, что скоро от индекса Хирша перейдут к звёздочкам в архиве (или там количеству лайков или репостов). Плюсы/минусы такой системы? В каком-то смысле такие лайки/репосты будут дополнять рецензирование статей в обычных журналах, а то глядишь и заменят вовсе.
Перелистываю сейчас выпуск CERN Courier за октябрь. На 24 (13) странице занимательная статья, автор Андрей Серый, про ТРИЗ. Помнится мне на ЛОРе были критики данной штуковины. Хотелось бы услышать их мнение по поводу как ТРИЗа, так и статьи в журнале. Ссылка на номер.
Некоторые пояснения.
ТРИЗ — теория решения изобретательских задач. Основные функции ТРИЗ:
Хотел провести тут небольшой социальный опрос на тему «А кто слушает радио?»
Сам вот я подсел на замечательнейшее радио Österreich 1. Особенно мне нравятся Klassiknächte, которые обычно начинаются в час по центральноевропейскому времени (в Сибири это пять, так что есть повод встать утром) каждую ночь кроме как с субботы на воскресенье (с субботы на воскресенье обычно транслируется не менее замечательный Jazznacht). Практически теперь вот каждый день открываю для себя что-то новое. Вот, например, позавчера впервые услышал концерт Роберта Шуманна для скрипки с оркестром. Немного копипасты с википедии:
Schumann wrote it in Düsseldorf between 11 September and 3 October 1853 for the violinist Joseph Joachim.
Though Joachim performed Schumann’s Fantasie, he never performed the Violin Concerto. After playing it through with the Hannover Court Orchestra (of which Joachim was the concertmaster) for Schumann in October 1853, Joachim retained the manuscript for the rest of his life. After Schumann’s attempted suicide in February 1854 and subsequent decline and death in a sanatorium in Endenich, Joachim evidently suspected the Concerto was a product of Schumann’s madness and thought of the music as morbid.
Вот такая вот история. Ежели вам интересно, дайте ссылку на файлохранилище, куда можно было бы скинуть запись этого концерта — с радостью залью.
Дабы дважды не вставать. А чем вы пишете аудиопоток интернет-радиостанций? Я вот пробую streamripper. Первый блин вышел частично комом, ибо получился достаточно длинный файл (где-то часов на 4--5 — это я немного не уследил), потом не смог порезать нормально в cutmp3 (постоянно вылазила достаточно странная ошибка) и в mp3cut из уже не помню какого дебиановского пакета. Пришлось audacity использовать (из пушки по воробьям).
Субж. Кто-нибудь делал сие извращение? А то мне без вафли дома совсем как-то грустно. ВродББе по хэндбуку де лал, ан нет — арбайтет нихьт. Есть каки е-нибудь годные работающие мануалы с dhcpd, wpa шифрованием и прочими hostapd? Заранее благодарен
На скриншоте мой рабочий стол в ЦЕРНе. Запущено управление электромагнитным калориметром LHCb (через богомеrзкий проприетарный PVSS), картинка с калориметром — двумерная гистограмма, построенная в ROOT.
Рабочее окружение дефолтное: ICEwm, xterm, firefox. Всё запущено на Scientific Linux.
Моё пребывание в ЦЕРНе в рамках студенческой летней школы подходит к концу. Мне повезло попасть сюда, когда LHC был выключен, побывать на ATLAS, CMS и поработать на самом LHCb.
>>> Просмотр (2560x1024, 261 Kb)
следующие → |