LINUX.ORG.RU

Сообщения luke

 

«Закрытие» R(K) и R(K*)

ЦЕРН сейчас проводит семинар по «закрытию» очередной «аномалии».

Предлагаю неравнодушным посмотреть: https://indico.cern.ch/event/1187945/

 ,

luke
()

Вышел ROOT 6.26/00

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

Основные новшества v6.26:

  • RooFit теперь поставляется с сильно улучшеным питоновским интерфейсом и ускорением на ГПУ!
  • Распределённые RDataFrame: уже много физиков стало использовать возможности параллельного исполнения RDataFrame в анализе данных кластерах. Теперь они поддерживают ещё и Dask, поэтому такой анализ можно запускать практически где угодно.
  • Экспериментальный метод RDataFrame::Vary() для оценки систематик в том же самом цикле по событиям, при этом с простым интерфейсом.
  • SOFIE может взять вашу ONNX модель и сгенерить быстрый код на плюсах. Зависит только от BLAS.

Исходники

 , ,

luke
()

std::reduce (и собратия) с ограничением на число тредов

Привет ЛОР.

Как ограничить максимальное число тредов, доступных для 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

 , ,

luke
()

gcc11 ломает Eigen с включённой -O3 -Wall

Если включить -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

 eigen, gcc11

luke
()

Оптимизация свёртки эрмитовской матрицы с вектором

Привет ЛОР, я вам тут покушать принёс.

В нашей науке довольно часто используется метод максимального правдоподобия. Максимум такой функции обычно находят с помощью какой-нибудь уже готовой библиотеки, вроде медленного, но проверенного временем 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 вы там какие-то бенчи гоняли и устраивали традиционный срач синих с красными, вот вам однопоточный тест для вполне себе реальной задачи.

 , числодробилки

luke
()

Патч-релиз CERN ROOT 6.24/02

Тихо и незаметно вышел первый патч-релиз в серии ROOT 6.24.

ROOT — это созданный в ЦЕРНе фреймворк для анализа данных с детекторов в физике частиц. За последние несколько лет команда разработчиков приложила огромные усилия, чтобы привнести в стандартные практики анализа данных в физике современные веяния из области IT, и при этом по возможности сохранить совместимость с предыдущими версиями ROOT. Постепенно добавляются всё новые возможности использования subj в python.

Этот патч-релиз содержит лишь незначительные изменения, в основном исправления ошибок:

  • Улучшено маштабирование работы RDataFrame для большого числа ядер (более 32)
  • Как всегда пофикшены очередные утечки памяти и другие классические ошибки из мира C++
  • Исправлены ошибки компиляции с GCC11
  • Фиксы в работе с файлами по сети удалённо
  • Исправлены ошибки в RooFit — популярной библиотекой для аппроксимаций данных с удобным интерфейсом и большим количеством встроенных функций
  • Исправлен парсинг boost/shared_ptr.hpp

Подробности

Исходники

UPD: Команда ROOT выпустила ROOT v6.24/04.

Несколько фиксов, например: в исходниках ranluxpp использовался сдвиг влево с отрицательным аргументом -1, что является UB в стандарте языка C (https://github.com/root-project/root/issues/8503)

Бинарники скачать бесплатно без SMS

 , , , церн

luke
()

Релизнулся новый CERN ROOT (6.24/00)

Субж. Письмо вот даже прислали на почту (это наверное потому что я у них на форуме зарегался, хотел было баг зарепортить, да в процессе написания репорта пофиксил проблему). Из важного лично для меня: 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, было бы неплохо если оно действительно так, и без новых багов к тому же.

Release notes

luke
()

Ходят слухи о дропе i486 в linux

В LKML Arnd Bergmann поднял вопрос об удалении различных устаревших платформ из-за того что они не развиваются, и по такому случаю он предлагает дропнуть и i486.

Пруф

У меня просто ностальгические чувства, ибо первый компьютер как-никак был именно на 486. Впрочем, сейчас под рукой только Pentium MMX, на который я даже не пытался поставить современный линь, ибо слишком жирный, так что может быть оно и правильно.

Интересно, а когда бросят поддержку i686?

luke
()

Оптимизация вычислений на крестах

Я уже в торсионном треде спрашивал @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
luke
()

arxiv.org катится в социалочку

В четверг заходил на arxiv.org, там висела плашка с содержанием «пройдите наш опросник, это недолго». В числе прочих вопросов были примерно вот такие вот: а хотите мы запилим комментирование препринтов? А давайте мы сделаем «репутацию» аплоадеров? И прочее.

Так вот и думается, что скоро от индекса Хирша перейдут к звёздочкам в архиве (или там количеству лайков или репостов). Плюсы/минусы такой системы? В каком-то смысле такие лайки/репосты будут дополнять рецензирование статей в обычных журналах, а то глядишь и заменят вовсе.

luke
()

ТРИЗ в CERN Courier

Перелистываю сейчас выпуск CERN Courier за октябрь. На 24 (13) странице занимательная статья, автор Андрей Серый, про ТРИЗ. Помнится мне на ЛОРе были критики данной штуковины. Хотелось бы услышать их мнение по поводу как ТРИЗа, так и статьи в журнале. Ссылка на номер.

Некоторые пояснения.

ТРИЗ — теория решения изобретательских задач. Основные функции ТРИЗ:

  • Решение творческих и изобретательских задач любой сложности и направленности без перебора вариантов.
  • Прогнозирование развития технических систем (ТС) и получение перспективных решений (в том числе и принципиально новых).
  • Развитие качеств творческой личности.
luke
()

Интернет-радиостанции

Хотел провести тут небольшой социальный опрос на тему «А кто слушает радио?»

Сам вот я подсел на замечательнейшее радио Ö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 использовать (из пушки по воробьям).

 

luke
()

Wifi AP во фряхе

Субж. Кто-нибудь делал сие извращение? А то мне без вафли дома совсем как-то грустно. ВродББе по хэндбуку де лал, ан нет — арбайтет нихьт. Есть каки е-нибудь годные работающие мануалы с dhcpd, wpa шифрованием и прочими hostapd? Заранее благодарен

luke
()

Нанотехнологий тред

На большей части территории России наступила пятница, а значит время для создания пятничных тредов пришло. Итак, есть такая МНСК (конференция для студентоты), которая раз в год проходит в НГУ (который Новосибирский). На этой конференции собирается выступить один мой знакомый, который поделился следующим шедевром:

Для Ъ заголовок: «Программное обеспечение для тонких клиентов на базе SLACKWARE LINUX для процессоров I386».

P.S. По возможности накидайте вопросов, которые можно позадавать автору сего доклада.

 ,

luke
()

Жберт в терминалке ФМШ

А у нас в терминальных классах уже полгода висит Zhbert. Вот урл: https://imo.im/fd/E/WzRscvIrnG/20130205173439.JPG

P.S. Фото сделал nebm51.

 

luke
()

Инсталлятор Scientific Linux

Тупой вопрос.

Каким образом в инсталляторе SL в текстовом режиме можно вручную разметить диски? Я напряг все глаза, но так и не увидел заветной галочки. Варианты, которые были (их 3): использовать весь диск, использовать свободное пространство и заменить существующую linux-инсталляцию.

P.S. на каком-то сайте с картинками есть такая. Это оно.

luke
()

Цикл лекций в институте математики для всех желающих

В дни Рождественских каникул, в период с 3 января по 6 января 2013, в здании института математики им. С.Л.Соболева СО РАН (417 аудитория) для студентов ММФ НГУ (и всех сочуствующих) будет прочитан цикл лекций.

Занятия ведут сотрудники ИМ СО РАН и самые любимые лекторы студентов ММФ.

Расписание занятий:

  • 3 января.
    • 11-00 В.П.Голубятников. «Элементарная топология и ее приложения».
  • 4 января.
    • 11-00 А.Е.Гутман. «Булевозначный анализ-1».
    • 14-00 Е.Ю.Деревцов. «Введение в компьютерную томографию».
  • 5 января. Выходной день.
  • 6 января.
    • 11-00 А.Е.Гутман. «Нестандартная теория множеств».
    • 15-00 П.А.Билута. «ТФКП (3-й курс)».

Пруф

 ,

luke
()

Прошёл 31 год со дня анонса IBM PC и 28 лет со дня анонса IBM PC AT

12 августа 1981 года вышел IBM PC, 14 августа 1984 года вышел IBM PC AT. Вино, сыр и всё такое...

 

luke
()

Интернеты в Сочи

В силу своего незнания краснодарской специфики спрашиваю на ЛОРе, известному всем своими спецами по всему. Интересует, какие есть провайдеры в этом славном курортном городе, какими вы пользуетесь, какие могут быть проблемы с проводкой оптоволокна до частного дома (телефона нет). Связь нужна не временная, а постоянная — буду «делать Интернет» родственникам.

 ,

luke
()

Доска памяти

 

luke
()

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